From 9ccca365b3018dbf0ae8030472faccc548733636 Mon Sep 17 00:00:00 2001 From: Tomas Dvorak Date: Sun, 19 Oct 2025 18:09:28 +0200 Subject: [PATCH] dev day #65 --- DOCS/NEW_UTILITY_CONTROLLERS_GUIDE.md | 783 ++++++++++++++++++ QUICK_REFERENCE.md | 327 ++++++++ UTILITY_CONTROLLERS_README.md | 330 ++++++++ ...9f0-bfa0-4928-a9b6-936140168f58_table.json | 2 +- cache/prefetch/articles.json.hdr | 2 +- cache/prefetch/competition_aliases.json.hdr | 2 +- cache/prefetch/events_upcoming.json.hdr | 2 +- cache/prefetch/facr_club_info.json.hdr | 2 +- cache/prefetch/facr_tables.json | 2 +- cache/prefetch/facr_tables.json.hdr | 2 +- cache/prefetch/meta.json | 2 +- cache/prefetch/prefetch_status.json | 18 +- cache/prefetch/settings.json.hdr | 2 +- cache/prefetch/sponsors.json.hdr | 2 +- cache/prefetch/team_logo_overrides.json.hdr | 2 +- frontend/FRONTEND_UTILITIES_GUIDE.md | 711 ++++++++++++++++ frontend/FRONTEND_UTILITIES_README.md | 468 +++++++++++ frontend/src/components/common/DataTable.css | 177 ++++ frontend/src/components/common/DataTable.tsx | 216 +++++ .../src/components/common/ToastContainer.css | 127 +++ .../src/components/common/ToastContainer.tsx | 64 ++ .../examples/ArticleListExample.css | 233 ++++++ .../examples/ArticleListExample.tsx | 284 +++++++ frontend/src/hooks/useApiMutation.ts | 96 +++ frontend/src/hooks/useBatchSelection.ts | 126 +++ frontend/src/hooks/useFormValidation.ts | 272 ++++++ frontend/src/hooks/usePaginatedData.ts | 146 ++++ frontend/src/hooks/useQueryBuilder.ts | 161 ++++ frontend/src/hooks/useToast.ts | 95 +++ frontend/src/utils/export.ts | 116 +++ internal/controllers/audit_log_controller.go | 291 +++++++ .../batch_operations_controller.go | 296 +++++++ .../controllers/example_usage_controller.go | 297 +++++++ internal/controllers/export_helper.go | 137 +++ internal/controllers/pagination_helper.go | 121 +++ .../controllers/poll_controller_refactored.go | 425 ++++++++++ internal/controllers/query_helper.go | 237 ++++++ internal/controllers/response_helper.go | 132 +++ internal/controllers/validation_helper.go | 171 ++++ internal/models/audit_log.go | 26 + 40 files changed, 6885 insertions(+), 20 deletions(-) create mode 100644 DOCS/NEW_UTILITY_CONTROLLERS_GUIDE.md create mode 100644 QUICK_REFERENCE.md create mode 100644 UTILITY_CONTROLLERS_README.md create mode 100644 frontend/FRONTEND_UTILITIES_GUIDE.md create mode 100644 frontend/FRONTEND_UTILITIES_README.md create mode 100644 frontend/src/components/common/DataTable.css create mode 100644 frontend/src/components/common/DataTable.tsx create mode 100644 frontend/src/components/common/ToastContainer.css create mode 100644 frontend/src/components/common/ToastContainer.tsx create mode 100644 frontend/src/components/examples/ArticleListExample.css create mode 100644 frontend/src/components/examples/ArticleListExample.tsx create mode 100644 frontend/src/hooks/useApiMutation.ts create mode 100644 frontend/src/hooks/useBatchSelection.ts create mode 100644 frontend/src/hooks/useFormValidation.ts create mode 100644 frontend/src/hooks/usePaginatedData.ts create mode 100644 frontend/src/hooks/useQueryBuilder.ts create mode 100644 frontend/src/hooks/useToast.ts create mode 100644 frontend/src/utils/export.ts create mode 100644 internal/controllers/audit_log_controller.go create mode 100644 internal/controllers/batch_operations_controller.go create mode 100644 internal/controllers/example_usage_controller.go create mode 100644 internal/controllers/export_helper.go create mode 100644 internal/controllers/pagination_helper.go create mode 100644 internal/controllers/poll_controller_refactored.go create mode 100644 internal/controllers/query_helper.go create mode 100644 internal/controllers/response_helper.go create mode 100644 internal/controllers/validation_helper.go create mode 100644 internal/models/audit_log.go diff --git a/DOCS/NEW_UTILITY_CONTROLLERS_GUIDE.md b/DOCS/NEW_UTILITY_CONTROLLERS_GUIDE.md new file mode 100644 index 0000000..1d683f2 --- /dev/null +++ b/DOCS/NEW_UTILITY_CONTROLLERS_GUIDE.md @@ -0,0 +1,783 @@ +# Utility Controllers Guide + +This guide explains the new utility controllers that make development easier, simpler, and better. + +## Table of Contents + +1. [Response Helper](#response-helper) +2. [Pagination Helper](#pagination-helper) +3. [Query Helper](#query-helper) +4. [Validation Helper](#validation-helper) +5. [Audit Log Controller](#audit-log-controller) +6. [Batch Operations Controller](#batch-operations-controller) +7. [Export Helper](#export-helper) +8. [Complete Examples](#complete-examples) + +--- + +## Response Helper + +**Purpose:** Standardize all API responses across your application. + +### Features +- Consistent response format +- Pre-built status code handlers +- Support for metadata (pagination, etc.) +- Easy error handling + +### Usage + +```go +import "fotbal-club/internal/controllers" + +// Success response +controllers.Respond.Success(c, data, "Operation successful") + +// Success with metadata (pagination) +controllers.Respond.SuccessWithMeta(c, articles, paginationMeta, "Articles retrieved") + +// Created (201) +controllers.Respond.Created(c, newArticle, "Article created") + +// Error responses +controllers.Respond.BadRequest(c, "Invalid input") +controllers.Respond.Unauthorized(c, "Not authenticated") +controllers.Respond.Forbidden(c, "No permission") +controllers.Respond.NotFound(c, "Article not found") +controllers.Respond.InternalError(c, "Database error") +controllers.Respond.ValidationError(c, validationErrors) + +// No content (204) +controllers.Respond.NoContent(c) +``` + +### Response Format + +```json +{ + "success": true, + "message": "Articles retrieved successfully", + "data": [...], + "meta": { + "page": 1, + "page_size": 20, + "total": 100, + "total_pages": 5, + "has_next": true, + "has_prev": false + } +} +``` + +--- + +## Pagination Helper + +**Purpose:** Add pagination to any list endpoint with one line of code. + +### Features +- Auto-extracts page/page_size from query params +- Calculates pagination metadata +- Works with GORM queries +- Supports preloading + +### Usage + +```go +// Simple pagination +query := db.Model(&models.Article{}).Where("published = ?", true) +var articles []models.Article +meta, err := controllers.Paginator.Paginate(c, query, &articles) +if err != nil { + controllers.Respond.InternalError(c, "Failed to retrieve articles") + return +} +controllers.Respond.SuccessWithMeta(c, articles, meta, "Success") + +// Pagination with preloading +meta, err := controllers.Paginator.PaginateWithPreload( + c, query, &articles, "Author", "Category" +) +``` + +### Query Parameters + +``` +GET /api/v1/articles?page=1&page_size=20 +``` + +- `page`: Page number (default: 1) +- `page_size`: Items per page (default: 20, max: 100) + +--- + +## Query Helper + +**Purpose:** Simplify filtering, sorting, and searching in list endpoints. + +### Features +- Search across multiple fields +- Sort by any field +- Boolean filters +- ID filters (comma-separated) +- Date range filters +- Fluent chain builder + +### Usage + +#### Basic Sorting + +```go +// GET /api/v1/articles?sort=created_at:desc +query := controllers.QueryParser.ApplySortFromContext( + c, db.Model(&models.Article{}), "created_at", "desc" +) +``` + +#### Basic Search + +```go +// GET /api/v1/articles?search=football +query := controllers.QueryParser.ApplySearchFromContext( + c, db.Model(&models.Article{}), "title", "content" +) +``` + +#### Fluent Chain Builder (Recommended) + +```go +// GET /api/v1/articles?search=football&sort=created_at:desc&published=true&category_ids=1,2,3&from=2024-01-01 +query := controllers.QueryParser.BuildQueryChain(c, db.Model(&models.Article{})). + WithSearch("title", "content"). + WithSort("created_at", "desc"). + WithBoolFilter("published", "published"). + WithBoolFilter("featured", "featured"). + WithIDsFilter("category_ids", "category_id"). + WithDateRange("created_at"). + Build() + +var articles []models.Article +meta, err := controllers.Paginator.Paginate(c, query, &articles) +``` + +### Supported Query Parameters + +- `search` or `q`: Search term +- `sort`: field:order (e.g., `created_at:desc`) +- `published`: Boolean filter (true/false) +- `featured`: Boolean filter (true/false) +- `category_ids`: Comma-separated IDs (e.g., `1,2,3`) +- `from`: Start date (YYYY-MM-DD) +- `to`: End date (YYYY-MM-DD) + +--- + +## Validation Helper + +**Purpose:** Validate request data and return user-friendly error messages. + +### Features +- Struct validation using tags +- Custom validators (slug, color) +- Automatic error responses +- Input sanitization + +### Usage + +#### Validate Struct + +```go +type CreateArticleRequest struct { + Title string `validate:"required,min=3,max=200"` + Content string `validate:"required,min=10"` + Slug string `validate:"omitempty,slug"` + Email string `validate:"required,email"` +} + +var req CreateArticleRequest +if err := c.ShouldBindJSON(&req); err != nil { + controllers.Respond.BadRequest(c, "Invalid JSON") + return +} + +// Validate and auto-respond if invalid +if !controllers.Validator.ValidateAndRespond(c, req) { + return // Response already sent +} + +// Continue with valid data... +``` + +#### Sanitization + +```go +// Sanitize string (trim, normalize spaces) +title := controllers.Validator.SanitizeString(req.Title) + +// Sanitize email (lowercase, trim) +email := controllers.Validator.SanitizeEmail(req.Email) + +// Sanitize slug +slug := controllers.Validator.SanitizeSlug(req.Slug) +``` + +#### Individual Validation + +```go +if !controllers.Validator.IsValidEmail(email) { + controllers.Respond.BadRequest(c, "Invalid email") + return +} +``` + +### Validation Tags + +- `required`: Field is required +- `email`: Valid email address +- `url`: Valid URL +- `min=n`: Minimum length +- `max=n`: Maximum length +- `slug`: Valid slug (lowercase, alphanumeric, hyphens) +- `color`: Valid hex color (#RGB, #RRGGBB) +- `oneof=val1 val2`: One of the specified values +- `gte=n`, `lte=n`: Greater/less than or equal + +--- + +## Audit Log Controller + +**Purpose:** Track all important actions in your application for compliance and debugging. + +### Features +- Automatic user tracking +- IP address and user agent logging +- Before/after change tracking +- Search and filter logs +- Statistics dashboard + +### Setup + +Add to `main.go`: + +```go +// Initialize audit logger +controllers.InitAuditLogger(dbInstance) + +// Add to AutoMigrate +&models.AuditLog{}, +``` + +### Usage + +#### Log Actions + +```go +// Log creation +controllers.AuditLogger.LogCreate(c, "Article", article.ID, "Article created: "+article.Title) + +// Log update with changes +before := map[string]interface{}{"title": oldTitle, "published": oldPublished} +after := map[string]interface{}{"title": newTitle, "published": newPublished} +controllers.AuditLogger.LogUpdate(c, "Article", article.ID, "Article updated", before, after) + +// Log deletion +controllers.AuditLogger.LogDelete(c, "Article", articleID, "Article deleted: "+title) + +// Log login +controllers.AuditLogger.LogLogin(c, userID, true) // success=true + +// Log custom action +controllers.AuditLogger.LogEntry(c, "EXPORT", "Article", nil, "Exported articles to CSV", nil) +``` + +#### API Endpoints (Admin Only) + +```go +// Add to routes/routes.go admin group: +admin.GET("/audit-logs", auditLogController.GetAuditLogs) +admin.GET("/audit-logs/:id", auditLogController.GetAuditLogByID) +admin.GET("/audit-logs/entity/:entity_type/:entity_id", auditLogController.GetEntityAuditHistory) +admin.GET("/audit-logs/user/:user_id", auditLogController.GetUserActivityLog) +admin.GET("/audit-logs/stats", auditLogController.GetAuditStats) +admin.POST("/audit-logs/cleanup", auditLogController.CleanupOldLogs) +``` + +#### Query Audit Logs + +``` +GET /api/v1/admin/audit-logs?action=CREATE&entity_type=Article&user_id=1&from=2024-01-01&page=1 +``` + +--- + +## Batch Operations Controller + +**Purpose:** Perform bulk operations efficiently. + +### Features +- Batch delete +- Batch update +- Batch publish/unpublish +- Batch reorder +- Detailed success/failure reporting + +### Setup + +```go +// Initialize in main.go or controller +controllers.InitBatchOperations(dbInstance) +``` + +### Usage + +#### Batch Delete + +```go +// POST /api/v1/articles/batch-delete +// Body: {"ids": [1, 2, 3, 4, 5]} +func (ac *ArticleController) BatchDeleteArticles(c *gin.Context) { + controllers.BatchOps.BatchDelete(c, &models.Article{}, "articles") +} +``` + +#### Batch Update + +```go +// POST /api/v1/articles/batch-update +// Body: {"ids": [1, 2, 3], "fields": {"published": true, "featured": false}} +func (ac *ArticleController) BatchUpdateArticles(c *gin.Context) { + allowedFields := []string{"published", "featured", "category_id"} + controllers.BatchOps.BatchUpdate(c, &models.Article{}, "articles", allowedFields) +} +``` + +#### Batch Publish/Unpublish + +```go +// POST /api/v1/articles/batch-publish +// Body: {"ids": [1, 2, 3]} +func (ac *ArticleController) BatchPublishArticles(c *gin.Context) { + controllers.BatchOps.BatchPublish(c, &models.Article{}, "articles", true) +} +``` + +#### Batch Reorder + +```go +// POST /api/v1/navigation/batch-reorder +// Body: {"orders": [{"id": 1, "order": 3}, {"id": 2, "order": 1}]} +func (nc *NavigationController) BatchReorderItems(c *gin.Context) { + controllers.BatchOps.BatchReorder(c, &models.NavigationItem{}, "navigation_items") +} +``` + +### Response Format + +```json +{ + "success": true, + "data": { + "success": true, + "total_items": 5, + "success_count": 5, + "failure_count": 0, + "errors": [] + }, + "message": "Successfully deleted 5 items" +} +``` + +--- + +## Export Helper + +**Purpose:** Export data to CSV or JSON format. + +### Usage + +#### Export to CSV + +```go +func (ac *ArticleController) ExportArticlesToCSV(c *gin.Context) { + var articles []models.Article + if err := db.Find(&articles).Error; err != nil { + controllers.Respond.InternalError(c, "Failed to retrieve articles") + return + } + + headers := []string{"ID", "Title", "Published", "Created At"} + filename := fmt.Sprintf("articles_%s.csv", time.Now().Format("20060102")) + + if err := controllers.Exporter.ExportToCSV(c, articles, filename, headers); err != nil { + controllers.Respond.InternalError(c, "Export failed") + return + } +} +``` + +#### Export to JSON + +```go +func (ac *ArticleController) ExportArticlesToJSON(c *gin.Context) { + var articles []models.Article + if err := db.Find(&articles).Error; err != nil { + controllers.Respond.InternalError(c, "Failed to retrieve articles") + return + } + + filename := fmt.Sprintf("articles_%s.json", time.Now().Format("20060102")) + + if err := controllers.Exporter.ExportToJSON(c, articles, filename); err != nil { + controllers.Respond.InternalError(c, "Export failed") + return + } +} +``` + +--- + +## Complete Examples + +### Example 1: Simple CRUD Controller + +```go +package controllers + +import ( + "fotbal-club/internal/models" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type SimpleArticleController struct { + DB *gorm.DB +} + +// List articles with search, filter, sort, and pagination +func (sac *SimpleArticleController) List(c *gin.Context) { + query := QueryParser.BuildQueryChain(c, sac.DB.Model(&models.Article{})). + WithSearch("title", "content"). + WithSort("created_at", "desc"). + WithBoolFilter("published", "published"). + Build() + + var articles []models.Article + meta, err := Paginator.PaginateWithPreload(c, query, &articles, "Author", "Category") + if err != nil { + Respond.InternalError(c, "Failed to retrieve articles") + return + } + + Respond.SuccessWithMeta(c, articles, meta, "Articles retrieved successfully") +} + +// Get single article +func (sac *SimpleArticleController) Get(c *gin.Context) { + id := c.Param("id") + + var article models.Article + if err := sac.DB.Preload("Author").Preload("Category").First(&article, id).Error; err != nil { + if err == gorm.ErrRecordNotFound { + Respond.NotFound(c, "Article not found") + return + } + Respond.InternalError(c, "Failed to retrieve article") + return + } + + Respond.Success(c, article, "Article retrieved successfully") +} + +// Create article +func (sac *SimpleArticleController) Create(c *gin.Context) { + var req struct { + Title string `json:"title" validate:"required,min=3,max=200"` + Content string `json:"content" validate:"required,min=10"` + Slug string `json:"slug" validate:"omitempty,slug"` + } + + if err := c.ShouldBindJSON(&req); err != nil { + Respond.BadRequest(c, "Invalid JSON") + return + } + + if !Validator.ValidateAndRespond(c, req) { + return + } + + article := models.Article{ + Title: Validator.SanitizeString(req.Title), + Content: req.Content, + Slug: Validator.SanitizeSlug(req.Slug), + } + + if err := sac.DB.Create(&article).Error; err != nil { + Respond.InternalError(c, "Failed to create article") + return + } + + AuditLogger.LogCreate(c, "Article", article.ID, "Article created: "+article.Title) + Respond.Created(c, article, "Article created successfully") +} + +// Update article +func (sac *SimpleArticleController) Update(c *gin.Context) { + id := c.Param("id") + + var article models.Article + if err := sac.DB.First(&article, id).Error; err != nil { + if err == gorm.ErrRecordNotFound { + Respond.NotFound(c, "Article not found") + return + } + Respond.InternalError(c, "Failed to retrieve article") + return + } + + oldTitle := article.Title + + var req struct { + Title string `json:"title" validate:"omitempty,min=3,max=200"` + } + + if err := c.ShouldBindJSON(&req); err != nil { + Respond.BadRequest(c, "Invalid JSON") + return + } + + if !Validator.ValidateAndRespond(c, req) { + return + } + + if req.Title != "" { + article.Title = Validator.SanitizeString(req.Title) + } + + if err := sac.DB.Save(&article).Error; err != nil { + Respond.InternalError(c, "Failed to update article") + return + } + + AuditLogger.LogUpdate(c, "Article", article.ID, "Article updated", + map[string]interface{}{"title": oldTitle}, + map[string]interface{}{"title": article.Title}) + + Respond.Success(c, article, "Article updated successfully") +} + +// Delete article +func (sac *SimpleArticleController) Delete(c *gin.Context) { + id := c.Param("id") + + var article models.Article + if err := sac.DB.First(&article, id).Error; err != nil { + if err == gorm.ErrRecordNotFound { + Respond.NotFound(c, "Article not found") + return + } + Respond.InternalError(c, "Failed to retrieve article") + return + } + + title := article.Title + articleID := article.ID + + if err := sac.DB.Delete(&article).Error; err != nil { + Respond.InternalError(c, "Failed to delete article") + return + } + + AuditLogger.LogDelete(c, "Article", articleID, "Article deleted: "+title) + Respond.NoContent(c) +} +``` + +### Example 2: Route Registration + +```go +// In routes/routes.go + +func SetupRoutes(api *gin.RouterGroup, db *gorm.DB) { + // Initialize helpers + controllers.InitAuditLogger(db) + controllers.InitBatchOperations(db) + + // Article routes with new utilities + articles := api.Group("/articles") + { + articleCtrl := &controllers.SimpleArticleController{DB: db} + + // Public routes + articles.GET("", articleCtrl.List) + articles.GET("/:id", articleCtrl.Get) + + // Protected routes + protected := articles.Group("") + protected.Use(middleware.JWTAuth(db)) + { + protected.POST("", articleCtrl.Create) + protected.PUT("/:id", articleCtrl.Update) + protected.DELETE("/:id", articleCtrl.Delete) + + // Batch operations + protected.POST("/batch-delete", articleCtrl.BatchDelete) + protected.POST("/batch-publish", articleCtrl.BatchPublish) + + // Export + protected.GET("/export/csv", articleCtrl.ExportCSV) + protected.GET("/export/json", articleCtrl.ExportJSON) + } + } + + // Audit logs (admin only) + auditLogCtrl := controllers.NewAuditLogController(db) + admin := api.Group("/admin") + admin.Use(middleware.JWTAuth(db), middleware.RoleAuth("admin")) + { + admin.GET("/audit-logs", auditLogCtrl.GetAuditLogs) + admin.GET("/audit-logs/:id", auditLogCtrl.GetAuditLogByID) + admin.GET("/audit-logs/stats", auditLogCtrl.GetAuditStats) + admin.POST("/audit-logs/cleanup", auditLogCtrl.CleanupOldLogs) + } +} +``` + +--- + +## Benefits + +### Before (Old Way) +```go +func GetArticles(c *gin.Context) { + page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) + pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) + + if page < 1 { + page = 1 + } + if pageSize < 1 || pageSize > 100 { + pageSize = 20 + } + + offset := (page - 1) * pageSize + + var articles []models.Article + var total int64 + + query := db.Model(&models.Article{}) + query.Count(&total) + query.Offset(offset).Limit(pageSize).Find(&articles) + + totalPages := int(math.Ceil(float64(total) / float64(pageSize))) + + c.JSON(200, gin.H{ + "data": articles, + "page": page, + "page_size": pageSize, + "total": total, + "total_pages": totalPages, + }) +} +``` + +### After (New Way) +```go +func GetArticles(c *gin.Context) { + query := QueryParser.BuildQueryChain(c, db.Model(&models.Article{})). + WithSearch("title", "content"). + WithSort("created_at", "desc"). + Build() + + var articles []models.Article + meta, _ := Paginator.Paginate(c, query, &articles) + Respond.SuccessWithMeta(c, articles, meta, "Success") +} +``` + +### Comparison +- **Lines of code:** 24 โ†’ 7 (70% reduction) +- **Consistency:** Standardized across all endpoints +- **Features:** Added search, sorting, filtering +- **Error handling:** Built-in +- **Maintainability:** Single source of truth + +--- + +## Migration Guide + +### Step 1: Add Model Migration +```go +// In main.go AutoMigrate +&models.AuditLog{}, +``` + +### Step 2: Initialize in main.go +```go +// After database initialization +controllers.InitAuditLogger(dbInstance) +controllers.InitBatchOperations(dbInstance) +``` + +### Step 3: Update Existing Controllers +Replace manual pagination, filtering, and response code with the new utilities. + +### Step 4: Add go-playground/validator Dependency +```bash +go get github.com/go-playground/validator/v10 +``` + +--- + +## Best Practices + +1. **Always use standardized responses** - Use `Respond.*` methods +2. **Log important actions** - Use `AuditLogger` for CREATE, UPDATE, DELETE +3. **Validate inputs** - Use `Validator.ValidateAndRespond` +4. **Sanitize user input** - Use `Validator.Sanitize*` methods +5. **Use query chains** - Use `QueryParser.BuildQueryChain` for complex queries +6. **Paginate large lists** - Always use `Paginator` for list endpoints +7. **Batch operations** - Use `BatchOps` for bulk actions +8. **Export functionality** - Use `Exporter` for CSV/JSON exports + +--- + +## Testing + +```bash +# Test pagination +curl "http://localhost:8080/api/v1/articles?page=1&page_size=10" + +# Test search +curl "http://localhost:8080/api/v1/articles?search=football" + +# Test sorting +curl "http://localhost:8080/api/v1/articles?sort=created_at:desc" + +# Test combined +curl "http://localhost:8080/api/v1/articles?search=football&sort=created_at:desc&published=true&page=1" + +# Test batch delete +curl -X POST "http://localhost:8080/api/v1/articles/batch-delete" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"ids": [1, 2, 3]}' + +# Test audit logs +curl "http://localhost:8080/api/v1/admin/audit-logs?action=CREATE&entity_type=Article" +``` + +--- + +## Conclusion + +These utility controllers dramatically reduce boilerplate code, improve consistency, and make your codebase more maintainable. They follow Go best practices and provide a solid foundation for rapid development. + +**Key Improvements:** +- 70% less code for common operations +- Consistent API responses +- Built-in validation and sanitization +- Comprehensive audit logging +- Efficient batch operations +- Easy data export +- Better error handling +- Improved developer experience diff --git a/QUICK_REFERENCE.md b/QUICK_REFERENCE.md new file mode 100644 index 0000000..b8c775d --- /dev/null +++ b/QUICK_REFERENCE.md @@ -0,0 +1,327 @@ +# Utility Controllers - Quick Reference Card + +## ๐Ÿš€ Quick Setup + +```bash +# 1. Install dependency +go get github.com/go-playground/validator/v10 + +# 2. Add to main.go AutoMigrate +&models.AuditLog{}, + +# 3. Initialize after database init +controllers.InitAuditLogger(dbInstance) +controllers.InitBatchOperations(dbInstance) +``` + +## ๐Ÿ“ฆ Global Variables + +```go +controllers.Respond // Response helper +controllers.Paginator // Pagination helper +controllers.QueryParser // Query/filter helper +controllers.Validator // Validation helper +controllers.AuditLogger // Audit logging +controllers.BatchOps // Batch operations +controllers.Exporter // Export CSV/JSON +``` + +## ๐Ÿ’ก Common Patterns + +### Standard List Endpoint + +```go +func (ctrl *Controller) List(c *gin.Context) { + query := controllers.QueryParser.BuildQueryChain(c, db.Model(&Model{})). + WithSearch("field1", "field2"). + WithSort("created_at", "desc"). + WithBoolFilter("published", "published"). + Build() + + var items []Model + meta, _ := controllers.Paginator.Paginate(c, query, &items) + controllers.Respond.SuccessWithMeta(c, items, meta, "Success") +} +``` + +### Standard Get Endpoint + +```go +func (ctrl *Controller) Get(c *gin.Context) { + id := c.Param("id") + var item Model + if err := db.First(&item, id).Error; err != nil { + if err == gorm.ErrRecordNotFound { + controllers.Respond.NotFound(c, "Not found") + return + } + controllers.Respond.InternalError(c, "Database error") + return + } + controllers.Respond.Success(c, item, "Success") +} +``` + +### Standard Create Endpoint + +```go +func (ctrl *Controller) Create(c *gin.Context) { + type Request struct { + Field string `json:"field" validate:"required,min=3"` + } + var req Request + if err := c.ShouldBindJSON(&req); err != nil { + controllers.Respond.BadRequest(c, "Invalid JSON") + return + } + if !controllers.Validator.ValidateAndRespond(c, req) { + return + } + + item := Model{Field: controllers.Validator.SanitizeString(req.Field)} + if err := db.Create(&item).Error; err != nil { + controllers.Respond.InternalError(c, "Failed to create") + return + } + + controllers.AuditLogger.LogCreate(c, "Model", item.ID, "Created") + controllers.Respond.Created(c, item, "Created successfully") +} +``` + +### Standard Update Endpoint + +```go +func (ctrl *Controller) Update(c *gin.Context) { + id := c.Param("id") + var item Model + if err := db.First(&item, id).Error; err != nil { + if err == gorm.ErrRecordNotFound { + controllers.Respond.NotFound(c, "Not found") + return + } + controllers.Respond.InternalError(c, "Database error") + return + } + + oldValue := item.Field + + type Request struct { + Field string `json:"field" validate:"omitempty,min=3"` + } + var req Request + if err := c.ShouldBindJSON(&req); err != nil { + controllers.Respond.BadRequest(c, "Invalid JSON") + return + } + if !controllers.Validator.ValidateAndRespond(c, req) { + return + } + + if req.Field != "" { + item.Field = controllers.Validator.SanitizeString(req.Field) + } + + if err := db.Save(&item).Error; err != nil { + controllers.Respond.InternalError(c, "Failed to update") + return + } + + controllers.AuditLogger.LogUpdate(c, "Model", item.ID, "Updated", + map[string]interface{}{"field": oldValue}, + map[string]interface{}{"field": item.Field}) + + controllers.Respond.Success(c, item, "Updated successfully") +} +``` + +### Standard Delete Endpoint + +```go +func (ctrl *Controller) Delete(c *gin.Context) { + id := c.Param("id") + var item Model + if err := db.First(&item, id).Error; err != nil { + if err == gorm.ErrRecordNotFound { + controllers.Respond.NotFound(c, "Not found") + return + } + controllers.Respond.InternalError(c, "Database error") + return + } + + itemID := item.ID + description := item.Name + + if err := db.Delete(&item).Error; err != nil { + controllers.Respond.InternalError(c, "Failed to delete") + return + } + + controllers.AuditLogger.LogDelete(c, "Model", itemID, "Deleted: "+description) + controllers.Respond.NoContent(c) +} +``` + +## ๐Ÿ” Query Parameters Reference + +``` +GET /api/v1/items? + search=term # Search across fields + &q=term # Alternative search param + &sort=field:desc # Sort by field (asc/desc) + &published=true # Boolean filter + &category_ids=1,2,3 # Multiple IDs filter + &from=2024-01-01 # Date range start + &to=2024-12-31 # Date range end + &page=1 # Page number + &page_size=20 # Items per page +``` + +## ๐Ÿ“ Validation Tags + +```go +type Request struct { + Field1 string `validate:"required"` // Required + Field2 string `validate:"required,min=3,max=50"` // Length constraints + Email string `validate:"required,email"` // Email validation + URL string `validate:"omitempty,url"` // URL validation + Slug string `validate:"omitempty,slug"` // Slug validation + Color string `validate:"omitempty,color"` // Hex color validation + Status string `validate:"oneof=draft published"` // Enum validation + Age int `validate:"gte=0,lte=120"` // Number range +} +``` + +## ๐ŸŽฏ Response Methods + +```go +// Success responses +Respond.Success(c, data, "Success") +Respond.SuccessWithMeta(c, data, meta, "Success") +Respond.Created(c, data, "Created") +Respond.NoContent(c) + +// Error responses +Respond.BadRequest(c, "Invalid input") +Respond.Unauthorized(c, "Not authenticated") +Respond.Forbidden(c, "No permission") +Respond.NotFound(c, "Not found") +Respond.Conflict(c, "Already exists") +Respond.InternalError(c, "Server error") +Respond.ValidationError(c, errors) +``` + +## ๐Ÿ”„ Batch Operations + +```go +// Batch delete +BatchOps.BatchDelete(c, &Model{}, "table_name") + +// Batch update +allowedFields := []string{"published", "featured"} +BatchOps.BatchUpdate(c, &Model{}, "table_name", allowedFields) + +// Batch publish/unpublish +BatchOps.BatchPublish(c, &Model{}, "table_name", true) + +// Batch reorder +BatchOps.BatchReorder(c, &Model{}, "table_name") +``` + +## ๐Ÿ“Š Export Data + +```go +// Export to CSV +headers := []string{"ID", "Name", "Created"} +Exporter.ExportToCSV(c, items, "export.csv", headers) + +// Export to JSON +Exporter.ExportToJSON(c, items, "export.json") +``` + +## ๐Ÿ” Audit Logging + +```go +// Log actions +AuditLogger.LogCreate(c, "EntityType", entityID, "Description") +AuditLogger.LogUpdate(c, "EntityType", entityID, "Description", before, after) +AuditLogger.LogDelete(c, "EntityType", entityID, "Description") +AuditLogger.LogLogin(c, userID, success) +AuditLogger.LogLogout(c, userID) + +// Custom log +AuditLogger.LogEntry(c, "CUSTOM_ACTION", "EntityType", &entityID, "Description", changes) +``` + +## ๐Ÿงน Sanitization + +```go +// Sanitize string (trim, normalize spaces) +clean := Validator.SanitizeString(input) + +// Sanitize email (lowercase, trim) +email := Validator.SanitizeEmail(input) + +// Sanitize slug (lowercase, hyphens, alphanumeric) +slug := Validator.SanitizeSlug(input) +``` + +## ๐Ÿงช Individual Validation + +```go +// Check validity +isValid := Validator.IsValidEmail(email) +isValid := Validator.IsValidURL(url) +isValid := Validator.IsValidSlug(slug) + +// Get validation errors +errors := Validator.Validate(struct) +``` + +## ๐Ÿ“ Files Created + +``` +internal/controllers/ + โ”œโ”€โ”€ response_helper.go (Standardized responses) + โ”œโ”€โ”€ pagination_helper.go (Auto pagination) + โ”œโ”€โ”€ query_helper.go (Filtering & sorting) + โ”œโ”€โ”€ validation_helper.go (Input validation) + โ”œโ”€โ”€ audit_log_controller.go (Audit trail) + โ”œโ”€โ”€ batch_operations_controller.go (Bulk operations) + โ”œโ”€โ”€ export_helper.go (CSV/JSON export) + โ”œโ”€โ”€ example_usage_controller.go (Usage examples) + โ””โ”€โ”€ poll_controller_refactored.go (Real refactoring) + +internal/models/ + โ””โ”€โ”€ audit_log.go (Audit log model) + +DOCS/ + โ””โ”€โ”€ NEW_UTILITY_CONTROLLERS_GUIDE.md (Complete guide) + +Root: + โ”œโ”€โ”€ UTILITY_CONTROLLERS_README.md (Summary) + โ””โ”€โ”€ QUICK_REFERENCE.md (This file) +``` + +## ๐ŸŽ“ Learning Path + +1. **Start here:** `UTILITY_CONTROLLERS_README.md` +2. **Deep dive:** `DOCS/NEW_UTILITY_CONTROLLERS_GUIDE.md` +3. **See examples:** `example_usage_controller.go` +4. **Real refactor:** `poll_controller_refactored.go` +5. **Quick lookup:** `QUICK_REFERENCE.md` (this file) + +## ๐Ÿ’ช Benefits + +- โœ… **70% less code** for common operations +- โœ… **Consistent** API responses everywhere +- โœ… **Built-in** pagination, search, filtering +- โœ… **Automatic** validation and sanitization +- โœ… **Complete** audit trail for compliance +- โœ… **Efficient** batch operations +- โœ… **Easy** data export to CSV/JSON + +--- + +**Bookmark this file for quick reference while coding!** ๐Ÿ“Œ diff --git a/UTILITY_CONTROLLERS_README.md b/UTILITY_CONTROLLERS_README.md new file mode 100644 index 0000000..338e8ce --- /dev/null +++ b/UTILITY_CONTROLLERS_README.md @@ -0,0 +1,330 @@ +# New Utility Controllers - Summary + +## Overview + +I've added **7 powerful utility controllers** that dramatically simplify development and reduce boilerplate code by up to **70%**. + +## What's New + +### โœ… 1. Response Helper (`response_helper.go`) +- **Purpose:** Standardized API responses +- **Global Variable:** `Respond` +- **Benefits:** Consistent format, easy error handling, metadata support + +```go +Respond.Success(c, data, "Success message") +Respond.Created(c, newItem, "Item created") +Respond.NotFound(c, "Item not found") +``` + +### โœ… 2. Pagination Helper (`pagination_helper.go`) +- **Purpose:** One-line pagination for any query +- **Global Variable:** `Paginator` +- **Benefits:** Auto-extracts params, calculates metadata, supports preloading + +```go +meta, err := Paginator.Paginate(c, query, &items) +Respond.SuccessWithMeta(c, items, meta, "Success") +``` + +### โœ… 3. Query Helper (`query_helper.go`) +- **Purpose:** Simplified filtering, sorting, and searching +- **Global Variable:** `QueryParser` +- **Benefits:** Fluent API, multiple filter types, chain builder + +```go +query := QueryParser.BuildQueryChain(c, db). + WithSearch("title", "content"). + WithSort("created_at", "desc"). + WithBoolFilter("published", "published"). + Build() +``` + +### โœ… 4. Validation Helper (`validation_helper.go`) +- **Purpose:** Struct validation with custom validators +- **Global Variable:** `Validator` +- **Benefits:** Auto-respond on errors, sanitization, custom validators + +```go +if !Validator.ValidateAndRespond(c, req) { + return // Response already sent +} +title := Validator.SanitizeString(req.Title) +``` + +### โœ… 5. Audit Log Controller (`audit_log_controller.go`) +- **Purpose:** Track all important actions +- **Global Variable:** `AuditLogger` +- **Model:** `models.AuditLog` +- **Benefits:** Automatic user/IP tracking, before/after changes, searchable logs + +```go +AuditLogger.LogCreate(c, "Article", article.ID, "Article created") +AuditLogger.LogUpdate(c, "Article", id, "Updated", before, after) +AuditLogger.LogDelete(c, "Article", id, "Deleted") +``` + +### โœ… 6. Batch Operations Controller (`batch_operations_controller.go`) +- **Purpose:** Bulk operations on multiple records +- **Global Variable:** `BatchOps` +- **Benefits:** Delete, update, publish, reorder multiple items at once + +```go +BatchOps.BatchDelete(c, &models.Article{}, "articles") +BatchOps.BatchPublish(c, &models.Article{}, "articles", true) +``` + +### โœ… 7. Export Helper (`export_helper.go`) +- **Purpose:** Export data to CSV/JSON +- **Global Variable:** `Exporter` +- **Benefits:** Automatic file download, proper headers + +```go +Exporter.ExportToCSV(c, articles, "articles.csv", headers) +Exporter.ExportToJSON(c, articles, "articles.json") +``` + +## Setup Instructions + +### Step 1: Install Dependency + +```bash +go get github.com/go-playground/validator/v10 +``` + +### Step 2: Add Model to Migration + +In `main.go`, add to `AutoMigrate`: + +```go +&models.AuditLog{}, +``` + +### Step 3: Initialize Global Helpers + +Add after database initialization in `main.go`: + +```go +// Initialize utility controllers +controllers.InitAuditLogger(dbInstance) +controllers.InitBatchOperations(dbInstance) +``` + +### Step 4: Use in Controllers + +The global variables are ready to use: +- `controllers.Respond` +- `controllers.Paginator` +- `controllers.QueryParser` +- `controllers.Validator` +- `controllers.AuditLogger` +- `controllers.BatchOps` +- `controllers.Exporter` + +## Example: Before vs After + +### Before (Old Way) - 45 lines + +```go +func GetArticles(c *gin.Context) { + // Parse pagination + page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) + pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) + if page < 1 { + page = 1 + } + if pageSize < 1 || pageSize > 100 { + pageSize = 20 + } + offset := (page - 1) * pageSize + + // Build query + query := db.Model(&models.Article{}) + + // Search + if search := c.Query("search"); search != "" { + pattern := "%" + search + "%" + query = query.Where("title LIKE ? OR content LIKE ?", pattern, pattern) + } + + // Filter + if published := c.Query("published"); published != "" { + query = query.Where("published = ?", published == "true") + } + + // Sort + if sort := c.Query("sort"); sort != "" { + query = query.Order(sort) + } else { + query = query.Order("created_at DESC") + } + + // Count total + var total int64 + query.Count(&total) + + // Execute + var articles []models.Article + if err := query.Offset(offset).Limit(pageSize).Find(&articles).Error; err != nil { + c.JSON(500, gin.H{"error": "Database error"}) + return + } + + // Response + c.JSON(200, gin.H{ + "data": articles, + "page": page, + "total": total, + }) +} +``` + +### After (New Way) - 11 lines + +```go +func GetArticles(c *gin.Context) { + query := controllers.QueryParser.BuildQueryChain(c, db.Model(&models.Article{})). + WithSearch("title", "content"). + WithSort("created_at", "desc"). + WithBoolFilter("published", "published"). + Build() + + var articles []models.Article + meta, _ := controllers.Paginator.Paginate(c, query, &articles) + controllers.Respond.SuccessWithMeta(c, articles, meta, "Success") +} +``` + +**Result:** 75% less code, more features, better consistency! + +## Real-World Example + +See `poll_controller_refactored.go` for a complete CRUD controller using all utilities: +- โœ… Pagination with filtering +- โœ… Search and sort +- โœ… Input validation +- โœ… Sanitization +- โœ… Audit logging +- โœ… Batch operations +- โœ… Standardized responses + +## API Examples + +### List with Filters +```bash +GET /api/v1/articles?search=football&published=true&sort=created_at:desc&page=1&page_size=20 +``` + +### Batch Delete +```bash +POST /api/v1/articles/batch-delete +Content-Type: application/json + +{"ids": [1, 2, 3, 4, 5]} +``` + +### Batch Publish +```bash +POST /api/v1/articles/batch-publish +Content-Type: application/json + +{"ids": [1, 2, 3]} +``` + +### Export to CSV +```bash +GET /api/v1/articles/export/csv +``` + +### Audit Logs +```bash +GET /api/v1/admin/audit-logs?action=CREATE&entity_type=Article&from=2024-01-01 +``` + +## Files Created + +1. โœ… `internal/controllers/response_helper.go` +2. โœ… `internal/controllers/pagination_helper.go` +3. โœ… `internal/controllers/query_helper.go` +4. โœ… `internal/controllers/validation_helper.go` +5. โœ… `internal/controllers/audit_log_controller.go` +6. โœ… `internal/controllers/batch_operations_controller.go` +7. โœ… `internal/controllers/export_helper.go` +8. โœ… `internal/controllers/example_usage_controller.go` +9. โœ… `internal/controllers/poll_controller_refactored.go` +10. โœ… `internal/models/audit_log.go` +11. โœ… `DOCS/NEW_UTILITY_CONTROLLERS_GUIDE.md` (Complete documentation) + +## Benefits Summary + +| Feature | Before | After | Improvement | +|---------|--------|-------|-------------| +| **Code Lines** | 45 | 11 | 75% reduction | +| **Response Format** | Inconsistent | Standardized | โœ… | +| **Pagination** | Manual | Automatic | โœ… | +| **Filtering** | Manual | Built-in | โœ… | +| **Searching** | Manual | Built-in | โœ… | +| **Sorting** | Manual | Built-in | โœ… | +| **Validation** | Manual | Automatic | โœ… | +| **Audit Logging** | None | Automatic | โœ… | +| **Batch Operations** | None | Built-in | โœ… | +| **Export** | None | Built-in | โœ… | + +## Key Improvements + +### ๐Ÿš€ Productivity +- Write **70% less code** for common operations +- **Faster development** with ready-to-use utilities +- **Reduced bugs** through standardization + +### ๐ŸŽฏ Consistency +- **Uniform API responses** across all endpoints +- **Standard error handling** patterns +- **Consistent validation** messages + +### ๐Ÿ”ง Maintainability +- **Single source of truth** for common operations +- **Easy to update** - change once, apply everywhere +- **Better testing** - test utilities once + +### ๐Ÿ“Š Features +- **Advanced filtering** out of the box +- **Full-text search** across multiple fields +- **Audit trail** for compliance +- **Bulk operations** for efficiency +- **Data export** for reporting + +### ๐Ÿ›ก๏ธ Security +- **Input validation** and sanitization +- **Audit logging** for accountability +- **Safe batch operations** with transaction support + +## Next Steps + +1. **Review documentation:** `DOCS/NEW_UTILITY_CONTROLLERS_GUIDE.md` +2. **Install dependency:** `go get github.com/go-playground/validator/v10` +3. **Add migration:** Add `&models.AuditLog{}` to AutoMigrate +4. **Initialize helpers:** Add init calls to `main.go` +5. **Refactor controllers:** Start using utilities in existing controllers +6. **Test endpoints:** Try the example API calls + +## Support + +For detailed usage examples, see: +- ๐Ÿ“– `DOCS/NEW_UTILITY_CONTROLLERS_GUIDE.md` - Complete guide +- ๐Ÿ’ก `internal/controllers/example_usage_controller.go` - Usage examples +- ๐Ÿ”„ `internal/controllers/poll_controller_refactored.go` - Real refactoring example + +## Questions? + +Each utility controller is well-documented with: +- Purpose and benefits +- Usage examples +- Best practices +- Common patterns + +Start with the guide in `DOCS/` and refer to example files for practical implementations. + +--- + +**Your job is now easier, simpler, and better!** ๐ŸŽ‰ diff --git a/cache/facr/football_7eacd9f0-bfa0-4928-a9b6-936140168f58_table.json b/cache/facr/football_7eacd9f0-bfa0-4928-a9b6-936140168f58_table.json index c6fdf74..865d846 100644 --- a/cache/facr/football_7eacd9f0-bfa0-4928-a9b6-936140168f58_table.json +++ b/cache/facr/football_7eacd9f0-bfa0-4928-a9b6-936140168f58_table.json @@ -1 +1 @@ -{"data":"eyJuYW1lIjoiRm90YmFsb3bDvSBrbHViIEtybm92IiwiY2x1Yl9pZCI6IjdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OCIsImNsdWJfdHlwZSI6ImZvb3RiYWxsIiwiY2x1Yl9pbnRlcm5hbF9pZCI6IjgwMTAyMTEiLCJsb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNTgvN2VhY2Q5ZjAtYmZhMC00OTI4LWE5YjYtOTM2MTQwMTY4ZjU4X2Nyb3AuanBnIiwiYWRkcmVzcyI6IjgwMTAyMTEiLCJjYXRlZ29yeSI6IklEIGtsdWJ1IiwiY29tcGV0aXRpb25zIjpbeyJpZCI6ImUzMTI3ODY1LWExMDktNDVjZC05MDQ4LTNlNjQyOWUyZWIxMSIsImNvZGUiOiJBMUEiLCJuYW1lIjoiU0FUVU0gNS4gbGlnYSBtdcW+xa8iLCJ0ZWFtX2NvdW50IjoiMTYiLCJtYXRjaGVzX2xpbmsiOiJodHRwczovL3d3dy5mb3RiYWwuY3ovc291dGV6ZS90dXJuYWplL3RhYmxlL2UzMTI3ODY1LWExMDktNDVjZC05MDQ4LTNlNjQyOWUyZWIxMSIsInRhYmxlIjp7Im92ZXJhbGwiOlt7InJhbmsiOiIxIiwidGVhbSI6IktyYXZhxZllIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8zNzdiZjBhYS0zM2U5LTQ5ODctYWI0Mi0zOTc0YmE1ODhkNmYvMzc3YmYwYWEtMzNlOS00OTg3LWFiNDItMzk3NGJhNTg4ZDZmX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiOSIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjIiLCJzY29yZSI6IjM3OjEyIiwicG9pbnRzIjoiMjgifSx7InJhbmsiOiIyIiwidGVhbSI6IkjDoWogdmUgU2xlenNrdSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMjU3OGI5ZmYtOTM4ZS00NjFiLTkwOTAtZDk2OTdlYjkzNzFmLzI1NzhiOWZmLTkzOGUtNDYxYi05MDkwLWQ5Njk3ZWI5MzcxZl9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjciLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiIyIiwic2NvcmUiOiIyNzoxMyIsInBvaW50cyI6IjI0In0seyJyYW5rIjoiMyIsInRlYW0iOiJKYWt1YsSNb3ZpY2UiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzRlMGI1ZjJmLTRhMjctNDQ0Yy1iZjc3LWUzNzI1Yjg5ODA4Ni80ZTBiNWYyZi00YTI3LTQ0NGMtYmY3Ny1lMzcyNWI4OTgwODZfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI3IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiMTg6MjIiLCJwb2ludHMiOiIyMSJ9LHsicmFuayI6IjQiLCJ0ZWFtIjoiRksgSFx1MDAyNlAgU3RhcsOpIE3Em3N0byIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZWMzYjhmN2YtNTc2NC00YTRlLWIzN2YtNTZkZWE3MDY5NmNiL2VjM2I4ZjdmLTU3NjQtNGE0ZS1iMzdmLTU2ZGVhNzA2OTZjYl9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjYiLCJkcmF3cyI6IjIiLCJsb3NzZXMiOiI0Iiwic2NvcmUiOiIyMjoyMCIsInBvaW50cyI6IjIwIn0seyJyYW5rIjoiNSIsInRlYW0iOiJCcnXFoXBlcmsiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI2IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiMjk6MjciLCJwb2ludHMiOiIxOSJ9LHsicmFuayI6IjYiLCJ0ZWFtIjoiQmFuw61rIEFsYnJlY2h0aWNlIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84ODdhNjdkNi1jNjA3LTRlODAtOTFiZS1kMWFmZjk0MDY2OTgvODg3YTY3ZDYtYzYwNy00ZTgwLTkxYmUtZDFhZmY5NDA2Njk4X2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjI0OjIzIiwicG9pbnRzIjoiMTkifSx7InJhbmsiOiI3IiwidGVhbSI6IkZLIE3Em3N0byBBbGJyZWNodGljZSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNzUwYjhkODEtNTQyYi00ODVjLThhMTgtZmMwYzQ5NGZmNDExLzc1MGI4ZDgxLTU0MmItNDg1Yy04YTE4LWZjMGM0OTRmZjQxMV9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjUiLCJkcmF3cyI6IjQiLCJsb3NzZXMiOiIzIiwic2NvcmUiOiIxOToxOCIsInBvaW50cyI6IjE5In0seyJyYW5rIjoiOCIsInRlYW0iOiJNRksgVsOtdGtvdmljZSBCIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9hZjg4MGQwNi02ZmZjLTQ5M2EtOTRiYi05MGUyYmRhYjcxMTkvYWY4ODBkMDYtNmZmYy00OTNhLTk0YmItOTBlMmJkYWI3MTE5X2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMyIsImxvc3NlcyI6IjIiLCJzY29yZSI6IjI1OjE4IiwicG9pbnRzIjoiMTgifSx7InJhbmsiOiI5IiwidGVhbSI6IlNsYXZpYSBPcmxvdsOhIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS82ZWEwNmQzYS1hN2JmLTRlZTItOTlmZi0xYmExZWRjNjJjOGYvNmVhMDZkM2EtYTdiZi00ZWUyLTk5ZmYtMWJhMWVkYzYyYzhmX2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjI0OjIzIiwicG9pbnRzIjoiMTcifSx7InJhbmsiOiIxMCIsInRlYW0iOiJGQyBWxZllc2luYSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZGMwNWY5YzUtYTQzNi00ZmNlLWI5Y2ItMDZjN2ZmODVkMDE5L2RjMDVmOWM1LWE0MzYtNGZjZS1iOWNiLTA2YzdmZjg1ZDAxOV9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjUiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI2Iiwic2NvcmUiOiIyNjoyNSIsInBvaW50cyI6IjE2In0seyJyYW5rIjoiMTEiLCJ0ZWFtIjoiS29iZcWZaWNlIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS81NWY5NjMwNy1jOTE2LTQ4MDEtOTQ4Yi1iYzg0ZjQ2ZjIxYmQvNTVmOTYzMDctYzkxNi00ODAxLTk0OGItYmM4NGY0NmYyMWJkX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjciLCJzY29yZSI6IjIzOjE5IiwicG9pbnRzIjoiMTUifSx7InJhbmsiOiIxMiIsInRlYW0iOiJGSyBLb2ZvbGEgS3Jub3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OC83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNThfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI0IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiMTU6MjAiLCJwb2ludHMiOiIxMyJ9LHsicmFuayI6IjEzIiwidGVhbSI6IlNLIEJFU0tZRCBGcmVuxaF0w6F0IHAuIFIuIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjciLCJzY29yZSI6IjE2OjI2IiwicG9pbnRzIjoiMTEifSx7InJhbmsiOiIxNCIsInRlYW0iOiJEYXJrb3ZpxI1reSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvOGUyMDdiMzAtN2I2OC00NGJiLWFkMDgtYmMyNTQ5NWRkMDk0LzhlMjA3YjMwLTdiNjgtNDRiYi1hZDA4LWJjMjU0OTVkZDA5NF9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjIiLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiI3Iiwic2NvcmUiOiIxNjoyMyIsInBvaW50cyI6IjkifSx7InJhbmsiOiIxNSIsInRlYW0iOiJIZcWZbWFuaWNlIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9jMzJkYzMwNS02Yjc4LTQxYzctODA1My1kODY0NGVlZjk2ZjEvYzMyZGMzMDUtNmI3OC00MWM3LTgwNTMtZDg2NDRlZWY5NmYxX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMSIsImRyYXdzIjoiNSIsImxvc3NlcyI6IjYiLCJzY29yZSI6IjE3OjMwIiwicG9pbnRzIjoiOCJ9LHsicmFuayI6IjE2IiwidGVhbSI6IkZDIERvbG7DrSBCZW5lxaFvdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMDgwZTNhZTEtMmJjNC00ZDkzLWJlYTktZGIyNmRhNzY4ZmE1LzA4MGUzYWUxLTJiYzQtNGQ5My1iZWE5LWRiMjZkYTc2OGZhNV9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjIiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI5Iiwic2NvcmUiOiIxNjozNSIsInBvaW50cyI6IjcifV19fSx7ImlkIjoiN2FlN2UzZDAtYWIzYy00YWZlLWFmNmQtNGEyNmQ3NGVhNTU0IiwiY29kZSI6IkMxQSIsIm5hbWUiOiJLQUxNQU4gVFJBREUgS3JhanNrw70gcMWZZWJvciBzdGFyxaHDrSBkb3Jvc3QiLCJ0ZWFtX2NvdW50IjoiMTYiLCJtYXRjaGVzX2xpbmsiOiJodHRwczovL3d3dy5mb3RiYWwuY3ovc291dGV6ZS90dXJuYWplL3RhYmxlLzdhZTdlM2QwLWFiM2MtNGFmZS1hZjZkLTRhMjZkNzRlYTU1NCIsInRhYmxlIjp7Im92ZXJhbGwiOlt7InJhbmsiOiIxIiwidGVhbSI6IkhsdWJpbmEiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2RhNjJjNzA1LWNhNzMtNDU2MS05ZWE0LWFiOTNlNmFmY2U4OC9kYTYyYzcwNS1jYTczLTQ1NjEtOWVhNC1hYjkzZTZhZmNlODhfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiIxMSIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjEiLCJzY29yZSI6IjU5OjEwIiwicG9pbnRzIjoiMzMifSx7InJhbmsiOiIyIiwidGVhbSI6IlBvbGFua2EgbmFkIE9kcm91IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8zMWU1MzM4NC0zN2Q4LTQ3NTUtYmZkYy1jOGQxNjhmZmVhMjQvMzFlNTMzODQtMzdkOC00NzU1LWJmZGMtYzhkMTY4ZmZlYTI0X2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiOSIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjEiLCJzY29yZSI6IjY3OjgiLCJwb2ludHMiOiIyOSJ9LHsicmFuayI6IjMiLCJ0ZWFtIjoiTUZLIEhhdsOtxZlvdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMDVjMGU1ZDQtOTQ4NS00ZTQ5LWIwMDEtZmMxYTQzNzQ5NjM2LzA1YzBlNWQ0LTk0ODUtNGU0OS1iMDAxLWZjMWE0Mzc0OTYzNl9jcm9wLmpwZyIsInBsYXllZCI6IjExIiwid2lucyI6IjciLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiIxIiwic2NvcmUiOiIzMToxNiIsInBvaW50cyI6IjI0In0seyJyYW5rIjoiNCIsInRlYW0iOiJNRksgU2xhdm9qIEJydW50w6FsIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9lN2U1ZWU2NS0xMWY5LTRlZGYtODcyNC0xYmFiNjA0M2NhZGMvZTdlNWVlNjUtMTFmOS00ZWRmLTg3MjQtMWJhYjYwNDNjYWRjX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiNyIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjQwOjIyIiwicG9pbnRzIjoiMjIifSx7InJhbmsiOiI1IiwidGVhbSI6IkZyw71kbGFudCBuLiBPLiIsInRlYW1fbG9nb191cmwiOiIvZGlzdC9pbWcvbG9nby1jbHViLWVtcHR5LnN2ZyIsInBsYXllZCI6IjExIiwid2lucyI6IjYiLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiIyIiwic2NvcmUiOiI0MDoyMSIsInBvaW50cyI6IjIxIn0seyJyYW5rIjoiNiIsInRlYW0iOiJSw71tYcWZb3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2NlMDVjOWY5LTNiMjgtNGFlNi05MDc3LTQ5M2Y5MGQwMGZmYy9jZTA1YzlmOS0zYjI4LTRhZTYtOTA3Ny00OTNmOTBkMDBmZmNfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiI2IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNCIsInNjb3JlIjoiNDA6MjMiLCJwb2ludHMiOiIxOSJ9LHsicmFuayI6IjciLCJ0ZWFtIjoiS3JhdmHFmWUiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzM3N2JmMGFhLTMzZTktNDk4Ny1hYjQyLTM5NzRiYTU4OGQ2Zi8zNzdiZjBhYS0zM2U5LTQ5ODctYWI0Mi0zOTc0YmE1ODhkNmZfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI1IiwiZHJhd3MiOiIyIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiNDY6NDAiLCJwb2ludHMiOiIxNyJ9LHsicmFuayI6IjgiLCJ0ZWFtIjoiQnJ1xaFwZXJrIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjM2OjMzIiwicG9pbnRzIjoiMTcifSx7InJhbmsiOiI5IiwidGVhbSI6IlBldMWZa292aWNlIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9hNTc5YjhmNy00MTczLTRhZjAtODAzOS1jOGMxMjA1MmYyODAvYTU3OWI4ZjctNDE3My00YWYwLTgwMzktYzhjMTIwNTJmMjgwX2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjUiLCJzY29yZSI6IjIyOjE5IiwicG9pbnRzIjoiMTYifSx7InJhbmsiOiIxMCIsInRlYW0iOiJGcmVuxaF0w6F0IHAuIFIuIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjYiLCJzY29yZSI6IjMyOjQxIiwicG9pbnRzIjoiMTYifSx7InJhbmsiOiIxMSIsInRlYW0iOiJLcm5vdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvN2VhY2Q5ZjAtYmZhMC00OTI4LWE5YjYtOTM2MTQwMTY4ZjU4LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OF9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjQiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI3Iiwic2NvcmUiOiI0MzozNyIsInBvaW50cyI6IjEzIn0seyJyYW5rIjoiMTIiLCJ0ZWFtIjoiQm9zcG9yIEJvaHVtw61uIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9lOTJjNTFhNi0wNmI0LTQzNDEtOTFkMS1mMmZkZGMyNWZhNTkvZTkyYzUxYTYtMDZiNC00MzQxLTkxZDEtZjJmZGRjMjVmYTU5X2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMyIsImxvc3NlcyI6IjYiLCJzY29yZSI6IjIzOjI5IiwicG9pbnRzIjoiMTIifSx7InJhbmsiOiIxMyIsInRlYW0iOiJGSyBIXHUwMDI2UCBTdGFyw6kgTcSbc3RvIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9lYzNiOGY3Zi01NzY0LTRhNGUtYjM3Zi01NmRlYTcwNjk2Y2IvZWMzYjhmN2YtNTc2NC00YTRlLWIzN2YtNTZkZWE3MDY5NmNiX2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjciLCJzY29yZSI6IjIxOjMyIiwicG9pbnRzIjoiMTAifSx7InJhbmsiOiIxNCIsInRlYW0iOiJWZWxrw6EgUG9sb20iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2Q4NTZjZDZlLTc4MmUtNGY4OC05Y2Q0LTAyNGUyODllYThjOS9kODU2Y2Q2ZS03ODJlLTRmODgtOWNkNC0wMjRlMjg5ZWE4YzlfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiIzIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiOCIsInNjb3JlIjoiMjc6NDIiLCJwb2ludHMiOiI5In0seyJyYW5rIjoiMTUiLCJ0ZWFtIjoiUmFkdcWIIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS83NjFmYjI1ZS0xM2U2LTQ3OTItODM0My05MDZkNWEzY2I1NzIvNzYxZmIyNWUtMTNlNi00NzkyLTgzNDMtOTA2ZDVhM2NiNTcyX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMSIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjgiLCJzY29yZSI6IjE4OjY1IiwicG9pbnRzIjoiNCJ9LHsicmFuayI6IjE2IiwidGVhbSI6Ikhvcm7DrSBTdWNow6EiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2E2YzdjMzQ3LWVlYjUtNGYwZS1iMjE3LTE1NmY0NmEzMDA5MS9hNmM3YzM0Ny1lZWI1LTRmMGUtYjIxNy0xNTZmNDZhMzAwOTFfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiIwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMTEiLCJzY29yZSI6IjY6MTEzIiwicG9pbnRzIjoiMCJ9XX19LHsiaWQiOiJkZGRiMzk4Mi03MTU3LTRiZmUtYjhhMC1kMzUzMGVhYTBhNzciLCJjb2RlIjoiRDFBIiwibmFtZSI6IktBTE1BTiBUUkFERSBLcmFqc2vDvSBwxZllYm9yIG1sYWTFocOtIGRvcm9zdCIsInRlYW1fY291bnQiOiIxNiIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvZGRkYjM5ODItNzE1Ny00YmZlLWI4YTAtZDM1MzBlYWEwYTc3IiwidGFibGUiOnsib3ZlcmFsbCI6W3sicmFuayI6IjEiLCJ0ZWFtIjoiSGx1YmluYSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZGE2MmM3MDUtY2E3My00NTYxLTllYTQtYWI5M2U2YWZjZTg4L2RhNjJjNzA1LWNhNzMtNDU2MS05ZWE0LWFiOTNlNmFmY2U4OF9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjEwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMiIsInNjb3JlIjoiNzY6MTYiLCJwb2ludHMiOiIzMCJ9LHsicmFuayI6IjIiLCJ0ZWFtIjoiUG9sYW5rYSBuYWQgT2Ryb3UiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzMxZTUzMzg0LTM3ZDgtNDc1NS1iZmRjLWM4ZDE2OGZmZWEyNC8zMWU1MzM4NC0zN2Q4LTQ3NTUtYmZkYy1jOGQxNjhmZmVhMjRfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI5IiwiZHJhd3MiOiIyIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiNzI6MTYiLCJwb2ludHMiOiIyOSJ9LHsicmFuayI6IjMiLCJ0ZWFtIjoiUGV0xZlrb3ZpY2UiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2E1NzliOGY3LTQxNzMtNGFmMC04MDM5LWM4YzEyMDUyZjI4MC9hNTc5YjhmNy00MTczLTRhZjAtODAzOS1jOGMxMjA1MmYyODBfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI5IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiNjk6MTYiLCJwb2ludHMiOiIyNyJ9LHsicmFuayI6IjQiLCJ0ZWFtIjoiTUZLIFNsYXZvaiBCcnVudMOhbCIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZTdlNWVlNjUtMTFmOS00ZWRmLTg3MjQtMWJhYjYwNDNjYWRjL2U3ZTVlZTY1LTExZjktNGVkZi04NzI0LTFiYWI2MDQzY2FkY19jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjciLCJkcmF3cyI6IjIiLCJsb3NzZXMiOiIzIiwic2NvcmUiOiI1MjoyMSIsInBvaW50cyI6IjIzIn0seyJyYW5rIjoiNSIsInRlYW0iOiJLcmF2YcWZZSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMzc3YmYwYWEtMzNlOS00OTg3LWFiNDItMzk3NGJhNTg4ZDZmLzM3N2JmMGFhLTMzZTktNDk4Ny1hYjQyLTM5NzRiYTU4OGQ2Zl9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjciLCJkcmF3cyI6IjIiLCJsb3NzZXMiOiIzIiwic2NvcmUiOiI1NDoyNiIsInBvaW50cyI6IjIzIn0seyJyYW5rIjoiNiIsInRlYW0iOiJSw71tYcWZb3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2NlMDVjOWY5LTNiMjgtNGFlNi05MDc3LTQ5M2Y5MGQwMGZmYy9jZTA1YzlmOS0zYjI4LTRhZTYtOTA3Ny00OTNmOTBkMDBmZmNfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiI3IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiNjg6MjMiLCJwb2ludHMiOiIyMiJ9LHsicmFuayI6IjciLCJ0ZWFtIjoiTUZLIEhhdsOtxZlvdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMDVjMGU1ZDQtOTQ4NS00ZTQ5LWIwMDEtZmMxYTQzNzQ5NjM2LzA1YzBlNWQ0LTk0ODUtNGU0OS1iMDAxLWZjMWE0Mzc0OTYzNl9jcm9wLmpwZyIsInBsYXllZCI6IjExIiwid2lucyI6IjYiLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiIyIiwic2NvcmUiOiIzMDoyMyIsInBvaW50cyI6IjIxIn0seyJyYW5rIjoiOCIsInRlYW0iOiJLcm5vdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvN2VhY2Q5ZjAtYmZhMC00OTI4LWE5YjYtOTM2MTQwMTY4ZjU4LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OF9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjUiLCJkcmF3cyI6IjIiLCJsb3NzZXMiOiI1Iiwic2NvcmUiOiI0MzoyNSIsInBvaW50cyI6IjE3In0seyJyYW5rIjoiOSIsInRlYW0iOiJCb3Nwb3IgQm9odW3DrW4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2U5MmM1MWE2LTA2YjQtNDM0MS05MWQxLWYyZmRkYzI1ZmE1OS9lOTJjNTFhNi0wNmI0LTQzNDEtOTFkMS1mMmZkZGMyNWZhNTlfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI1IiwiZHJhd3MiOiIyIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiMzE6MzAiLCJwb2ludHMiOiIxNyJ9LHsicmFuayI6IjEwIiwidGVhbSI6IlZlbGvDoSBQb2xvbSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZDg1NmNkNmUtNzgyZS00Zjg4LTljZDQtMDI0ZTI4OWVhOGM5L2Q4NTZjZDZlLTc4MmUtNGY4OC05Y2Q0LTAyNGUyODllYThjOV9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjUiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI2Iiwic2NvcmUiOiIzMToyNyIsInBvaW50cyI6IjE2In0seyJyYW5rIjoiMTEiLCJ0ZWFtIjoiRnJlbsWhdMOhdCBwLiBSLiIsInRlYW1fbG9nb191cmwiOiIvZGlzdC9pbWcvbG9nby1jbHViLWVtcHR5LnN2ZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjUiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI2Iiwic2NvcmUiOiIzMToyOSIsInBvaW50cyI6IjE2In0seyJyYW5rIjoiMTIiLCJ0ZWFtIjoiRnLDvWRsYW50IG4uIE8uIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNCIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjUiLCJzY29yZSI6IjIyOjE4IiwicG9pbnRzIjoiMTQifSx7InJhbmsiOiIxMyIsInRlYW0iOiJCcnXFoXBlcmsiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI0IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiOCIsInNjb3JlIjoiMjg6MzQiLCJwb2ludHMiOiIxMiJ9LHsicmFuayI6IjE0IiwidGVhbSI6IkZLIEhcdTAwMjZQIFN0YXLDqSBNxJtzdG8iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2VjM2I4ZjdmLTU3NjQtNGE0ZS1iMzdmLTU2ZGVhNzA2OTZjYi9lYzNiOGY3Zi01NzY0LTRhNGUtYjM3Zi01NmRlYTcwNjk2Y2JfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiIxIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMTAiLCJzY29yZSI6IjEyOjUxIiwicG9pbnRzIjoiMyJ9LHsicmFuayI6IjE1IiwidGVhbSI6Ikhvcm7DrSBTdWNow6EiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2E2YzdjMzQ3LWVlYjUtNGYwZS1iMjE3LTE1NmY0NmEzMDA5MS9hNmM3YzM0Ny1lZWI1LTRmMGUtYjIxNy0xNTZmNDZhMzAwOTFfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiIwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMTEiLCJzY29yZSI6IjE6MTMxIiwicG9pbnRzIjoiMCJ9LHsicmFuayI6IjE2IiwidGVhbSI6IlJhZHXFiCIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNzYxZmIyNWUtMTNlNi00NzkyLTgzNDMtOTA2ZDVhM2NiNTcyLzc2MWZiMjVlLTEzZTYtNDc5Mi04MzQzLTkwNmQ1YTNjYjU3Ml9jcm9wLmpwZyIsInBsYXllZCI6IjExIiwid2lucyI6IjAiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIxMSIsInNjb3JlIjoiNjoxNDAiLCJwb2ludHMiOiIwIn1dfX0seyJpZCI6ImM5MGFjZTQ1LWUyZjAtNDcyMy05NGMyLTA2ODlkOWFmNTcyNiIsImNvZGUiOiJFMVMiLCJuYW1lIjoiMi5NU8W9TC1VIDE1ICBzay4gRSIsInRlYW1fY291bnQiOiIxMiIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvYzkwYWNlNDUtZTJmMC00NzIzLTk0YzItMDY4OWQ5YWY1NzI2IiwidGFibGUiOnsib3ZlcmFsbCI6W3sicmFuayI6IjEiLCJ0ZWFtIjoiSHJhbmljZSIsInRlYW1fbG9nb191cmwiOiIvZGlzdC9pbWcvbG9nby1jbHViLWVtcHR5LnN2ZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjEwIiwiZHJhd3MiOiIyIiwibG9zc2VzIjoiMCIsInNjb3JlIjoiNDg6MTciLCJwb2ludHMiOiIzMiJ9LHsicmFuayI6IjIiLCJ0ZWFtIjoiS2Fydmluw6EiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzRjYmUyNWU2LTU3ZjMtNDFjMC04ZDkyLTc4MmIxOWI2MTczMS80Y2JlMjVlNi01N2YzLTQxYzAtOGQ5Mi03ODJiMTliNjE3MzFfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI5IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiMzM6OSIsInBvaW50cyI6IjI3In0seyJyYW5rIjoiMyIsInRlYW0iOiJCw61sb3ZlYyIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZDMxZjRhNDEtODViOS00ZTU4LWJkZWUtNjNjYjU2M2FkYTViL2QzMWY0YTQxLTg1YjktNGU1OC1iZGVlLTYzY2I1NjNhZGE1Yl9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjgiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiIzIiwic2NvcmUiOiI1MzozNSIsInBvaW50cyI6IjI1In0seyJyYW5rIjoiNCIsInRlYW0iOiLFoHVtcGVyayIsInRlYW1fbG9nb191cmwiOiIvZGlzdC9pbWcvbG9nby1jbHViLWVtcHR5LnN2ZyIsInBsYXllZCI6IjExIiwid2lucyI6IjciLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiIzIiwic2NvcmUiOiIzNzoyMyIsInBvaW50cyI6IjIyIn0seyJyYW5rIjoiNSIsInRlYW0iOiJQb3J1YmEg4oCTIFBldMWZdmFsZCIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvOWQ5MzBlOTItOTJhNS00NWM0LTgzY2YtMjg2M2EwNzZmM2IwLzlkOTMwZTkyLTkyYTUtNDVjNC04M2NmLTI4NjNhMDc2ZjNiMF9jcm9wLmpwZyIsInBsYXllZCI6IjEwIiwid2lucyI6IjUiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI0Iiwic2NvcmUiOiIzMToyMyIsInBvaW50cyI6IjE2In0seyJyYW5rIjoiNiIsInRlYW0iOiJOb3bDvSBKacSNw61uIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNCIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjUiLCJzY29yZSI6IjMzOjM1IiwicG9pbnRzIjoiMTQifSx7InJhbmsiOiI3IiwidGVhbSI6IlZhbGHFoXNrw6kgTWV6acWZw63EjcOtIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiNCIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjYiLCJzY29yZSI6IjIzOjMzIiwicG9pbnRzIjoiMTQifSx7InJhbmsiOiI4IiwidGVhbSI6IlTFmElORUMiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzVjN2E3ZjFlLTBhNDUtNGUyYy1iNjQ4LTgwZjNjOTZiNWJmMS81YzdhN2YxZS0wYTQ1LTRlMmMtYjY0OC04MGYzYzk2YjViZjFfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI0IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNyIsInNjb3JlIjoiMjc6MzQiLCJwb2ludHMiOiIxMyJ9LHsicmFuayI6IjkiLCJ0ZWFtIjoiS3Jub3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OC83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNThfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiI0IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNiIsInNjb3JlIjoiMjc6NDEiLCJwb2ludHMiOiIxMyJ9LHsicmFuayI6IjEwIiwidGVhbSI6IkhsdcSNw61uIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84NTBkNmQ1Yy01ODEyLTQ4ZDYtOTNiYS1mODY2ZmFiZmFkYTMvODUwZDZkNWMtNTgxMi00OGQ2LTkzYmEtZjg2NmZhYmZhZGEzX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjgiLCJzY29yZSI6IjIyOjQwIiwicG9pbnRzIjoiMTAifSx7InJhbmsiOiIxMSIsInRlYW0iOiJVbmnEjW92IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84MTM3NzFiNi02NmYwLTQ1MGMtYTU1MS1jYzFhMGNmNGNlNmQvODEzNzcxYjYtNjZmMC00NTBjLWE1NTEtY2MxYTBjZjRjZTZkX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMiIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjgiLCJzY29yZSI6IjI1OjM5IiwicG9pbnRzIjoiOCJ9LHsicmFuayI6IjEyIiwidGVhbSI6IkhhdsOtxZlvdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMDVjMGU1ZDQtOTQ4NS00ZTQ5LWIwMDEtZmMxYTQzNzQ5NjM2LzA1YzBlNWQ0LTk0ODUtNGU0OS1iMDAxLWZjMWE0Mzc0OTYzNl9jcm9wLmpwZyIsInBsYXllZCI6IjExIiwid2lucyI6IjEiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIxMCIsInNjb3JlIjoiMTc6NDciLCJwb2ludHMiOiIzIn1dfX0seyJpZCI6ImI5YWMyMzI5LTJkYzEtNGMwMS05YWNiLTJiMGRlYTdiMDNkNiIsImNvZGUiOiJFMlMiLCJuYW1lIjoiMi5NU8W9TC1VIDE0ICBzay4gRSIsInRlYW1fY291bnQiOiIxMiIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvYjlhYzIzMjktMmRjMS00YzAxLTlhY2ItMmIwZGVhN2IwM2Q2IiwidGFibGUiOnsib3ZlcmFsbCI6W3sicmFuayI6IjEiLCJ0ZWFtIjoiVW5pxI1vdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvODEzNzcxYjYtNjZmMC00NTBjLWE1NTEtY2MxYTBjZjRjZTZkLzgxMzc3MWI2LTY2ZjAtNDUwYy1hNTUxLWNjMWEwY2Y0Y2U2ZF9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjExIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiMTIyOjE3IiwicG9pbnRzIjoiMzMifSx7InJhbmsiOiIyIiwidGVhbSI6IkthcnZpbsOhIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS80Y2JlMjVlNi01N2YzLTQxYzAtOGQ5Mi03ODJiMTliNjE3MzEvNGNiZTI1ZTYtNTdmMy00MWMwLThkOTItNzgyYjE5YjYxNzMxX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiOSIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjEiLCJzY29yZSI6IjYxOjEwIiwicG9pbnRzIjoiMjcifSx7InJhbmsiOiIzIiwidGVhbSI6IsWgdW1wZXJrIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiOCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjMiLCJzY29yZSI6IjUzOjI5IiwicG9pbnRzIjoiMjQifSx7InJhbmsiOiI0IiwidGVhbSI6IkhyYW5pY2UiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI3IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNCIsInNjb3JlIjoiNjk6MzQiLCJwb2ludHMiOiIyMiJ9LHsicmFuayI6IjUiLCJ0ZWFtIjoiVMWYSU5FQyIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNWM3YTdmMWUtMGE0NS00ZTJjLWI2NDgtODBmM2M5NmI1YmYxLzVjN2E3ZjFlLTBhNDUtNGUyYy1iNjQ4LTgwZjNjOTZiNWJmMV9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjYiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI1Iiwic2NvcmUiOiI1NTo0MiIsInBvaW50cyI6IjE5In0seyJyYW5rIjoiNiIsInRlYW0iOiJOb3bDvSBKacSNw61uIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjUiLCJzY29yZSI6IjU0OjM3IiwicG9pbnRzIjoiMTYifSx7InJhbmsiOiI3IiwidGVhbSI6IkLDrWxvdmVjIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9kMzFmNGE0MS04NWI5LTRlNTgtYmRlZS02M2NiNTYzYWRhNWIvZDMxZjRhNDEtODViOS00ZTU4LWJkZWUtNjNjYjU2M2FkYTViX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiNCIsImRyYXdzIjoiNCIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjU0OjM3IiwicG9pbnRzIjoiMTYifSx7InJhbmsiOiI4IiwidGVhbSI6IkhsdcSNw61uIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84NTBkNmQ1Yy01ODEyLTQ4ZDYtOTNiYS1mODY2ZmFiZmFkYTMvODUwZDZkNWMtNTgxMi00OGQ2LTkzYmEtZjg2NmZhYmZhZGEzX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMyIsImRyYXdzIjoiNCIsImxvc3NlcyI6IjUiLCJzY29yZSI6IjMxOjMyIiwicG9pbnRzIjoiMTMifSx7InJhbmsiOiI5IiwidGVhbSI6IlBvcnViYSDigJMgUGV0xZl2YWxkIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS85ZDkzMGU5Mi05MmE1LTQ1YzQtODNjZi0yODYzYTA3NmYzYjAvOWQ5MzBlOTItOTJhNS00NWM0LTgzY2YtMjg2M2EwNzZmM2IwX2Nyb3AuanBnIiwicGxheWVkIjoiOSIsIndpbnMiOiIzIiwiZHJhd3MiOiIyIiwibG9zc2VzIjoiNCIsInNjb3JlIjoiMjY6MjkiLCJwb2ludHMiOiIxMSJ9LHsicmFuayI6IjEwIiwidGVhbSI6IlZhbGHFoXNrw6kgTWV6acWZw63EjcOtIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjciLCJzY29yZSI6IjM0OjUxIiwicG9pbnRzIjoiMTEifSx7InJhbmsiOiIxMSIsInRlYW0iOiJIYXbDrcWZb3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzA1YzBlNWQ0LTk0ODUtNGU0OS1iMDAxLWZjMWE0Mzc0OTYzNi8wNWMwZTVkNC05NDg1LTRlNDktYjAwMS1mYzFhNDM3NDk2MzZfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiIxIiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiMTAiLCJzY29yZSI6Ijg6MTM3IiwicG9pbnRzIjoiNCJ9LHsicmFuayI6IjEyIiwidGVhbSI6Iktybm92IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNTgvN2VhY2Q5ZjAtYmZhMC00OTI4LWE5YjYtOTM2MTQwMTY4ZjU4X2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiMCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjExIiwic2NvcmUiOiIxMjoxMjQiLCJwb2ludHMiOiIwIn1dfX0seyJpZCI6ImFlMTJkZjg0LWVhYmEtNDY0My1hYzE1LWUwZDk4ODhmNWE4NyIsImNvZGUiOiJGMVMiLCJuYW1lIjoiMS4gbGlnYSBTcFNNLVUgMTMgU0VWRVIiLCJ0ZWFtX2NvdW50IjoiMTgiLCJtYXRjaGVzX2xpbmsiOiJodHRwczovL3d3dy5mb3RiYWwuY3ovc291dGV6ZS90dXJuYWplL3RhYmxlL2FlMTJkZjg0LWVhYmEtNDY0My1hYzE1LWUwZDk4ODhmNWE4NyIsInRhYmxlIjp7Im92ZXJhbGwiOlt7InJhbmsiOiIxIiwidGVhbSI6IkJhbsOtayBPc3RyYXZhIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9lNjhlNjhjNi1jMjYzLTQzY2UtYTI0Ny0yMGVlMWQzMjNiNTUvZTY4ZTY4YzYtYzI2My00M2NlLWEyNDctMjBlZTFkMzIzYjU1X2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMTAiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIwIiwic2NvcmUiOiIxNDI6MTgiLCJwb2ludHMiOiIzMCJ9LHsicmFuayI6IjIiLCJ0ZWFtIjoiT3BhdmEiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzY0NWFhZDFiLTlhNDYtNDM1MS05MGI2LTZkZmI5ODk0NTNkZC82NDVhYWQxYi05YTQ2LTQzNTEtOTBiNi02ZGZiOTg5NDUzZGRfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI5IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiMTEwOjE5IiwicG9pbnRzIjoiMjcifSx7InJhbmsiOiIzIiwidGVhbSI6IkthcnZpbsOhIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS80Y2JlMjVlNi01N2YzLTQxYzAtOGQ5Mi03ODJiMTliNjE3MzEvNGNiZTI1ZTYtNTdmMy00MWMwLThkOTItNzgyYjE5YjYxNzMxX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiOCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjIiLCJzY29yZSI6IjEzNTozNiIsInBvaW50cyI6IjI0In0seyJyYW5rIjoiNCIsInRlYW0iOiJWw41US09WSUNFIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9hM2ZmMTdkNi0wODg4LTQ3ZTctOWRlZS0wYTk4ZWM4NzM0ZDAvYTNmZjE3ZDYtMDg4OC00N2U3LTlkZWUtMGE5OGVjODczNGQwX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiNyIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjMiLCJzY29yZSI6IjgzOjI5IiwicG9pbnRzIjoiMjEifSx7InJhbmsiOiI1IiwidGVhbSI6IlZhbGHFoXNrw6kgTWV6acWZw63EjcOtIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiNyIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjMiLCJzY29yZSI6IjcwOjM2IiwicG9pbnRzIjoiMjEifSx7InJhbmsiOiI2IiwidGVhbSI6IkZyw71kZWstTcOtc3RlayIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNTIxNWMxYzEtYTFiNy00YTRkLWJhNDAtZWIwZDM2YjE5YTYxLzUyMTVjMWMxLWExYjctNGE0ZC1iYTQwLWViMGQzNmIxOWE2MV9jcm9wLmpwZyIsInBsYXllZCI6IjkiLCJ3aW5zIjoiNiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjIiLCJzY29yZSI6IjcyOjM3IiwicG9pbnRzIjoiMTkifSx7InJhbmsiOiI3IiwidGVhbSI6IlVuacSNb3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzgxMzc3MWI2LTY2ZjAtNDUwYy1hNTUxLWNjMWEwY2Y0Y2U2ZC84MTM3NzFiNi02NmYwLTQ1MGMtYTU1MS1jYzFhMGNmNGNlNmRfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI2IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiNzU6NjEiLCJwb2ludHMiOiIxOSJ9LHsicmFuayI6IjgiLCJ0ZWFtIjoiUG9ydWJhIOKAkyBQZXTFmXZhbGQiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzlkOTMwZTkyLTkyYTUtNDVjNC04M2NmLTI4NjNhMDc2ZjNiMC85ZDkzMGU5Mi05MmE1LTQ1YzQtODNjZi0yODYzYTA3NmYzYjBfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI1IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNCIsInNjb3JlIjoiNjk6NTIiLCJwb2ludHMiOiIxNiJ9LHsicmFuayI6IjkiLCJ0ZWFtIjoixaB1bXBlcmsiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiI5Iiwid2lucyI6IjUiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiI0Iiwic2NvcmUiOiI3ODo2NyIsInBvaW50cyI6IjE1In0seyJyYW5rIjoiMTAiLCJ0ZWFtIjoiSGx1xI3DrW4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5Lzg1MGQ2ZDVjLTU4MTItNDhkNi05M2JhLWY4NjZmYWJmYWRhMy84NTBkNmQ1Yy01ODEyLTQ4ZDYtOTNiYS1mODY2ZmFiZmFkYTNfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI0IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiNzc6NDYiLCJwb2ludHMiOiIxMyJ9LHsicmFuayI6IjExIiwidGVhbSI6IlDFmWVyb3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzFmZDFhMDQ3LTRjZjUtNDdjYy1hNzEyLTkxNTkyOGNiYTZmYi8xZmQxYTA0Ny00Y2Y1LTQ3Y2MtYTcxMi05MTU5MjhjYmE2ZmJfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI0IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiMzQ6NTciLCJwb2ludHMiOiIxMyJ9LHsicmFuayI6IjEyIiwidGVhbSI6IkhyYW5pY2UiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiI5Iiwid2lucyI6IjQiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiI1Iiwic2NvcmUiOiI0NDo2MiIsInBvaW50cyI6IjEyIn0seyJyYW5rIjoiMTMiLCJ0ZWFtIjoiSEZLIE9sb21vdWMiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzFmYmFkOTM1LWRhNDEtNDU2Ny04M2RjLTM5N2VjMDRkNjRkMy8xZmJhZDkzNS1kYTQxLTQ1NjctODNkYy0zOTdlYzA0ZDY0ZDNfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIyIiwiZHJhd3MiOiIzIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiNDU6NjYiLCJwb2ludHMiOiI5In0seyJyYW5rIjoiMTQiLCJ0ZWFtIjoiVMWYSU5FQyIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNWM3YTdmMWUtMGE0NS00ZTJjLWI2NDgtODBmM2M5NmI1YmYxLzVjN2E3ZjFlLTBhNDUtNGUyYy1iNjQ4LTgwZjNjOTZiNWJmMV9jcm9wLmpwZyIsInBsYXllZCI6IjkiLCJ3aW5zIjoiMiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjYiLCJzY29yZSI6IjM5OjUyIiwicG9pbnRzIjoiNyJ9LHsicmFuayI6IjE1IiwidGVhbSI6IkLDrWxvdmVjIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9kMzFmNGE0MS04NWI5LTRlNTgtYmRlZS02M2NiNTYzYWRhNWIvZDMxZjRhNDEtODViOS00ZTU4LWJkZWUtNjNjYjU2M2FkYTViX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjciLCJzY29yZSI6IjM4OjcwIiwicG9pbnRzIjoiNyJ9LHsicmFuayI6IjE2IiwidGVhbSI6Ik5vdsO9IEppxI3DrW4iLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIyIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiOCIsInNjb3JlIjoiMTk6OTIiLCJwb2ludHMiOiI2In0seyJyYW5rIjoiMTciLCJ0ZWFtIjoiSGF2w63FmW92IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8wNWMwZTVkNC05NDg1LTRlNDktYjAwMS1mYzFhNDM3NDk2MzYvMDVjMGU1ZDQtOTQ4NS00ZTQ5LWIwMDEtZmMxYTQzNzQ5NjM2X2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjEwIiwic2NvcmUiOiIxMzoxNTIiLCJwb2ludHMiOiIwIn0seyJyYW5rIjoiMTgiLCJ0ZWFtIjoiS3Jub3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OC83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNThfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMTAiLCJzY29yZSI6IjIyOjIxMyIsInBvaW50cyI6IjAifV19fSx7ImlkIjoiM2YzNzkwMWMtNWMzNi00YTEzLThhODQtMjQ0ZjY0ZjFlYTFhIiwiY29kZSI6IkYyUyIsIm5hbWUiOiIxLiBsaWdhIFNwU00tVSAxMiBTRVZFUiIsInRlYW1fY291bnQiOiIxOCIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvM2YzNzkwMWMtNWMzNi00YTEzLThhODQtMjQ0ZjY0ZjFlYTFhIiwidGFibGUiOnsib3ZlcmFsbCI6W3sicmFuayI6IjEiLCJ0ZWFtIjoiSGx1xI3DrW4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5Lzg1MGQ2ZDVjLTU4MTItNDhkNi05M2JhLWY4NjZmYWJmYWRhMy84NTBkNmQ1Yy01ODEyLTQ4ZDYtOTNiYS1mODY2ZmFiZmFkYTNfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIxMCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjAiLCJzY29yZSI6IjEwNDoxMSIsInBvaW50cyI6IjMwIn0seyJyYW5rIjoiMiIsInRlYW0iOiJCYW7DrWsgT3N0cmF2YSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZTY4ZTY4YzYtYzI2My00M2NlLWEyNDctMjBlZTFkMzIzYjU1L2U2OGU2OGM2LWMyNjMtNDNjZS1hMjQ3LTIwZWUxZDMyM2I1NV9jcm9wLmpwZyIsInBsYXllZCI6IjEwIiwid2lucyI6IjkiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIxIiwic2NvcmUiOiIxMjE6MTUiLCJwb2ludHMiOiIyNyJ9LHsicmFuayI6IjMiLCJ0ZWFtIjoiS2Fydmluw6EiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzRjYmUyNWU2LTU3ZjMtNDFjMC04ZDkyLTc4MmIxOWI2MTczMS80Y2JlMjVlNi01N2YzLTQxYzAtOGQ5Mi03ODJiMTliNjE3MzFfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI5IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiMTIwOjI1IiwicG9pbnRzIjoiMjcifSx7InJhbmsiOiI0IiwidGVhbSI6IlbDjVRLT1ZJQ0UiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2EzZmYxN2Q2LTA4ODgtNDdlNy05ZGVlLTBhOThlYzg3MzRkMC9hM2ZmMTdkNi0wODg4LTQ3ZTctOWRlZS0wYTk4ZWM4NzM0ZDBfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI5IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiNTI6MTMiLCJwb2ludHMiOiIyNyJ9LHsicmFuayI6IjUiLCJ0ZWFtIjoiT3BhdmEiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzY0NWFhZDFiLTlhNDYtNDM1MS05MGI2LTZkZmI5ODk0NTNkZC82NDVhYWQxYi05YTQ2LTQzNTEtOTBiNi02ZGZiOTg5NDUzZGRfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI4IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMiIsInNjb3JlIjoiMTA5OjIxIiwicG9pbnRzIjoiMjQifSx7InJhbmsiOiI2IiwidGVhbSI6IkhGSyBPbG9tb3VjIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8xZmJhZDkzNS1kYTQxLTQ1NjctODNkYy0zOTdlYzA0ZDY0ZDMvMWZiYWQ5MzUtZGE0MS00NTY3LTgzZGMtMzk3ZWMwNGQ2NGQzX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiNiIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjIiLCJzY29yZSI6Ijg1OjE4IiwicG9pbnRzIjoiMjAifSx7InJhbmsiOiI3IiwidGVhbSI6IkZyw71kZWstTcOtc3RlayIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNTIxNWMxYzEtYTFiNy00YTRkLWJhNDAtZWIwZDM2YjE5YTYxLzUyMTVjMWMxLWExYjctNGE0ZC1iYTQwLWViMGQzNmIxOWE2MV9jcm9wLmpwZyIsInBsYXllZCI6IjkiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjIiLCJzY29yZSI6IjU2OjIyIiwicG9pbnRzIjoiMTcifSx7InJhbmsiOiI4IiwidGVhbSI6IkhyYW5pY2UiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiI5Iiwid2lucyI6IjQiLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiIyIiwic2NvcmUiOiI2MjozOCIsInBvaW50cyI6IjE1In0seyJyYW5rIjoiOSIsInRlYW0iOiJQb3J1YmEg4oCTIFBldMWZdmFsZCIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvOWQ5MzBlOTItOTJhNS00NWM0LTgzY2YtMjg2M2EwNzZmM2IwLzlkOTMwZTkyLTkyYTUtNDVjNC04M2NmLTI4NjNhMDc2ZjNiMF9jcm9wLmpwZyIsInBsYXllZCI6IjEwIiwid2lucyI6IjQiLCJkcmF3cyI6IjIiLCJsb3NzZXMiOiI0Iiwic2NvcmUiOiI1NjozNSIsInBvaW50cyI6IjE0In0seyJyYW5rIjoiMTAiLCJ0ZWFtIjoiVMWYSU5FQyIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNWM3YTdmMWUtMGE0NS00ZTJjLWI2NDgtODBmM2M5NmI1YmYxLzVjN2E3ZjFlLTBhNDUtNGUyYy1iNjQ4LTgwZjNjOTZiNWJmMV9jcm9wLmpwZyIsInBsYXllZCI6IjkiLCJ3aW5zIjoiNCIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjQwOjIxIiwicG9pbnRzIjoiMTMifSx7InJhbmsiOiIxMSIsInRlYW0iOiJQxZllcm92IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8xZmQxYTA0Ny00Y2Y1LTQ3Y2MtYTcxMi05MTU5MjhjYmE2ZmIvMWZkMWEwNDctNGNmNS00N2NjLWE3MTItOTE1OTI4Y2JhNmZiX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjciLCJzY29yZSI6IjMwOjU4IiwicG9pbnRzIjoiOSJ9LHsicmFuayI6IjEyIiwidGVhbSI6Ik5vdsO9IEppxI3DrW4iLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIzIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiNyIsInNjb3JlIjoiMzA6NzgiLCJwb2ludHMiOiI5In0seyJyYW5rIjoiMTMiLCJ0ZWFtIjoiVmFsYcWhc2vDqSBNZXppxZnDrcSNw60iLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIyIiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNyIsInNjb3JlIjoiNDU6NDQiLCJwb2ludHMiOiI3In0seyJyYW5rIjoiMTQiLCJ0ZWFtIjoiSGF2w63FmW92IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8wNWMwZTVkNC05NDg1LTRlNDktYjAwMS1mYzFhNDM3NDk2MzYvMDVjMGU1ZDQtOTQ4NS00ZTQ5LWIwMDEtZmMxYTQzNzQ5NjM2X2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjciLCJzY29yZSI6IjE4OjcyIiwicG9pbnRzIjoiNyJ9LHsicmFuayI6IjE1IiwidGVhbSI6IsWgdW1wZXJrIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiOSIsIndpbnMiOiIyIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiNyIsInNjb3JlIjoiNDA6OTUiLCJwb2ludHMiOiI2In0seyJyYW5rIjoiMTYiLCJ0ZWFtIjoiQsOtbG92ZWMiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2QzMWY0YTQxLTg1YjktNGU1OC1iZGVlLTYzY2I1NjNhZGE1Yi9kMzFmNGE0MS04NWI5LTRlNTgtYmRlZS02M2NiNTYzYWRhNWJfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIyIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiOCIsInNjb3JlIjoiMjU6ODEiLCJwb2ludHMiOiI2In0seyJyYW5rIjoiMTciLCJ0ZWFtIjoiVW5pxI1vdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvODEzNzcxYjYtNjZmMC00NTBjLWE1NTEtY2MxYTBjZjRjZTZkLzgxMzc3MWI2LTY2ZjAtNDUwYy1hNTUxLWNjMWEwY2Y0Y2U2ZF9jcm9wLmpwZyIsInBsYXllZCI6IjEwIiwid2lucyI6IjAiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIxMCIsInNjb3JlIjoiODoxMDYiLCJwb2ludHMiOiIwIn0seyJyYW5rIjoiMTgiLCJ0ZWFtIjoiS3Jub3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OC83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNThfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMTAiLCJzY29yZSI6IjQ6MjUyIiwicG9pbnRzIjoiMCJ9XX19LHsiaWQiOiI3ODQ5ZDZjYS0zYzYxLTRlMmItYmE0Zi1lODc1YmYxMWZkOTUiLCJjb2RlIjoiRzFEIiwibmFtZSI6IlN0YXLFocOtIHDFmcOtcHJhdmthIDErNSBzay5EIiwidGVhbV9jb3VudCI6IjkiLCJtYXRjaGVzX2xpbmsiOiJodHRwczovL3d3dy5mb3RiYWwuY3ovc291dGV6ZS90dXJuYWplL3RhYmxlLzc4NDlkNmNhLTNjNjEtNGUyYi1iYTRmLWU4NzViZjExZmQ5NSIsInRhYmxlIjp7Im92ZXJhbGwiOm51bGx9fSx7ImlkIjoiYmE1MGMzMTktNDE0ZC00NzhmLTk3MTktNzZkNTlkZGZiODdjIiwiY29kZSI6IkgxQSIsIm5hbWUiOiJPa3Jlc27DrSBwxZllYm9yIG1sYWTFocOtIHDFmcOtcHJhdmt5ICg0KzEpIiwidGVhbV9jb3VudCI6IjEwIiwibWF0Y2hlc19saW5rIjoiaHR0cHM6Ly93d3cuZm90YmFsLmN6L3NvdXRlemUvdHVybmFqZS90YWJsZS9iYTUwYzMxOS00MTRkLTQ3OGYtOTcxOS03NmQ1OWRkZmI4N2MiLCJ0YWJsZSI6eyJvdmVyYWxsIjpudWxsfX0seyJpZCI6Ijc1ODBiODAzLTY2NWQtNDgwOC04Y2VjLWM5MTZkY2IyMjM0MyIsImNvZGUiOiJIMUMiLCJuYW1lIjoiTWxhZMWhw60gcMWZw61wcmF2a2EgMSs0IHNrLkMiLCJ0ZWFtX2NvdW50IjoiMTAiLCJtYXRjaGVzX2xpbmsiOiJodHRwczovL3d3dy5mb3RiYWwuY3ovc291dGV6ZS90dXJuYWplL3RhYmxlLzc1ODBiODAzLTY2NWQtNDgwOC04Y2VjLWM5MTZkY2IyMjM0MyIsInRhYmxlIjp7Im92ZXJhbGwiOm51bGx9fSx7ImlkIjoiZWNjYjkxYmEtY2JjZS00NmUxLWFmNTEtNDQ5YmRiZDQyZjhmIiwiY29kZSI6IlUxRSIsIm5hbWUiOiJQQyAgVTFFICBVLTEwICDFoHVtcGVyayIsInRlYW1fY291bnQiOiI2IiwibWF0Y2hlc19saW5rIjoiaHR0cHM6Ly93d3cuZm90YmFsLmN6L3NvdXRlemUvdHVybmFqZS90YWJsZS9lY2NiOTFiYS1jYmNlLTQ2ZTEtYWY1MS00NDliZGJkNDJmOGYiLCJ0YWJsZSI6eyJvdmVyYWxsIjpbeyJyYW5rIjoiMSIsInRlYW0iOiJGSyBXQVJFWCBKZXNlbsOtayB6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8wM2RkMzMwYi1kNDY5LTRhNjUtOTlmMS0yOWI3ZWNlN2MyZWQvMDNkZDMzMGItZDQ2OS00YTY1LTk5ZjEtMjliN2VjZTdjMmVkX2Nyb3AuanBnIiwicGxheWVkIjoiNSIsIndpbnMiOiI1IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMCIsInNjb3JlIjoiMjk6NSIsInBvaW50cyI6IjE1In0seyJyYW5rIjoiMiIsInRlYW0iOiJTSyBVbmnEjW92LCB6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84MTM3NzFiNi02NmYwLTQ1MGMtYTU1MS1jYzFhMGNmNGNlNmQvODEzNzcxYjYtNjZmMC00NTBjLWE1NTEtY2MxYTBjZjRjZTZkX2Nyb3AuanBnIiwicGxheWVkIjoiNSIsIndpbnMiOiI0IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiMzU6NiIsInBvaW50cyI6IjEyIn0seyJyYW5rIjoiMyIsInRlYW0iOiJNRksgU2xhdm9qIEJydW50w6FsLCB6LiBzLiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZTdlNWVlNjUtMTFmOS00ZWRmLTg3MjQtMWJhYjYwNDNjYWRjL2U3ZTVlZTY1LTExZjktNGVkZi04NzI0LTFiYWI2MDQzY2FkY19jcm9wLmpwZyIsInBsYXllZCI6IjUiLCJ3aW5zIjoiMiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjIiLCJzY29yZSI6IjE3OjIxIiwicG9pbnRzIjoiNyJ9LHsicmFuayI6IjQiLCJ0ZWFtIjoiRksgS29mb2xhIEtybm92LCB6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNTgvN2VhY2Q5ZjAtYmZhMC00OTI4LWE5YjYtOTM2MTQwMTY4ZjU4X2Nyb3AuanBnIiwicGxheWVkIjoiNSIsIndpbnMiOiIyIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiMTA6MjUiLCJwb2ludHMiOiI2In0seyJyYW5rIjoiNSIsInRlYW0iOiJGSyBQcnVtcmVudCDFoHVtcGVyayB6LnMuIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiNSIsIndpbnMiOiIxIiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiOToyNSIsInBvaW50cyI6IjQifSx7InJhbmsiOiI2IiwidGVhbSI6IkZPVEJBTE9Ww50gS0xVQiDFoFRFUk5CRVJLLCB6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9lNTIwZDE4NS0xMDlmLTRiYzYtYmNjYy02MzEyNjU0YWFjOWIvZTUyMGQxODUtMTA5Zi00YmM2LWJjY2MtNjMxMjY1NGFhYzliX2Nyb3AuanBnIiwicGxheWVkIjoiNSIsIndpbnMiOiIwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiNjoyNCIsInBvaW50cyI6IjAifV19fSx7ImlkIjoiYjg0YzY3OGYtYzMzYy00NjIyLTk3YWQtNmMzZTg4MjcwOTRiIiwiY29kZSI6IlYxQyIsIm5hbWUiOiJQQyAgVjFDICBVLTggIE5vdsO9IEppxI3DrW4iLCJ0ZWFtX2NvdW50IjoiNiIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvYjg0YzY3OGYtYzMzYy00NjIyLTk3YWQtNmMzZTg4MjcwOTRiIiwidGFibGUiOnsib3ZlcmFsbCI6bnVsbH19LHsiaWQiOiI2YjQwZDljYS1kYTg3LTQ2YmEtOGU5Mi0yODUyMmFkZGEzMjIiLCJjb2RlIjoiVjVCIiwibmFtZSI6IlBDICBWNUIgIFUtOSAgSGx1xI3DrW4iLCJ0ZWFtX2NvdW50IjoiNiIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvNmI0MGQ5Y2EtZGE4Ny00NmJhLThlOTItMjg1MjJhZGRhMzIyIiwidGFibGUiOnsib3ZlcmFsbCI6W3sicmFuayI6IjEiLCJ0ZWFtIjoiU3BvcnRvdm7DrSBrbHViIEZDIEhsdcSNw61uLCB6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84NTBkNmQ1Yy01ODEyLTQ4ZDYtOTNiYS1mODY2ZmFiZmFkYTMvODUwZDZkNWMtNTgxMi00OGQ2LTkzYmEtZjg2NmZhYmZhZGEzX2Nyb3AuanBnIiwicGxheWVkIjoiNSIsIndpbnMiOiI1IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMCIsInNjb3JlIjoiNTg6NiIsInBvaW50cyI6IjE1In0seyJyYW5rIjoiMiIsInRlYW0iOiJGb3RiYWxvdsO9IGtsdWIgU0sgUG9sYW5rYSBuYWQgT2Ryb3Ugei5zLiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMzFlNTMzODQtMzdkOC00NzU1LWJmZGMtYzhkMTY4ZmZlYTI0LzMxZTUzMzg0LTM3ZDgtNDc1NS1iZmRjLWM4ZDE2OGZmZWEyNF9jcm9wLmpwZyIsInBsYXllZCI6IjUiLCJ3aW5zIjoiNCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjEiLCJzY29yZSI6IjQ1OjE3IiwicG9pbnRzIjoiMTIifSx7InJhbmsiOiIzIiwidGVhbSI6IjEuIEZDIFBvcnViYSDigJMgUGV0xZl2YWxkIG5hIE1vcmF2xJssIHoucy4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzlkOTMwZTkyLTkyYTUtNDVjNC04M2NmLTI4NjNhMDc2ZjNiMC85ZDkzMGU5Mi05MmE1LTQ1YzQtODNjZi0yODYzYTA3NmYzYjBfY3JvcC5qcGciLCJwbGF5ZWQiOiI1Iiwid2lucyI6IjMiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIyIiwic2NvcmUiOiI0MToxNSIsInBvaW50cyI6IjkifSx7InJhbmsiOiI0IiwidGVhbSI6IsWga29sbsOtIHNwb3J0b3Zuw60ga2x1YiBCw61sb3ZlYyx6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiNSIsIndpbnMiOiIyIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiMTA6MzIiLCJwb2ludHMiOiI2In0seyJyYW5rIjoiNSIsInRlYW0iOiJGSyBLb2ZvbGEgS3Jub3YsIHoucy4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OC83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNThfY3JvcC5qcGciLCJwbGF5ZWQiOiI1Iiwid2lucyI6IjEiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiI0Iiwic2NvcmUiOiIxMjozNCIsInBvaW50cyI6IjMifSx7InJhbmsiOiI2IiwidGVhbSI6IlTEm2xvdsO9Y2hvdm7DoSBqZWRub3RhIFNva29sIEtvem1pY2UsIHoucy4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2ZlYTdjN2NjLTJhNGUtNDU4Yy1hOTc5LTU3ODlhYWZhMDljMC9mZWE3YzdjYy0yYTRlLTQ1OGMtYTk3OS01Nzg5YWFmYTA5YzBfY3JvcC5qcGciLCJwbGF5ZWQiOiI1Iiwid2lucyI6IjAiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiI1Iiwic2NvcmUiOiIxOjYzIiwicG9pbnRzIjoiMCJ9XX19XX0K","stored_at":"2025-10-19T14:59:54.381337297Z"} \ No newline at end of file +{"data":"eyJuYW1lIjoiRm90YmFsb3bDvSBrbHViIEtybm92IiwiY2x1Yl9pZCI6IjdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OCIsImNsdWJfdHlwZSI6ImZvb3RiYWxsIiwiY2x1Yl9pbnRlcm5hbF9pZCI6IjgwMTAyMTEiLCJsb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNTgvN2VhY2Q5ZjAtYmZhMC00OTI4LWE5YjYtOTM2MTQwMTY4ZjU4X2Nyb3AuanBnIiwiYWRkcmVzcyI6IjgwMTAyMTEiLCJjYXRlZ29yeSI6IklEIGtsdWJ1IiwiY29tcGV0aXRpb25zIjpbeyJpZCI6ImUzMTI3ODY1LWExMDktNDVjZC05MDQ4LTNlNjQyOWUyZWIxMSIsImNvZGUiOiJBMUEiLCJuYW1lIjoiU0FUVU0gNS4gbGlnYSBtdcW+xa8iLCJ0ZWFtX2NvdW50IjoiMTYiLCJtYXRjaGVzX2xpbmsiOiJodHRwczovL3d3dy5mb3RiYWwuY3ovc291dGV6ZS90dXJuYWplL3RhYmxlL2UzMTI3ODY1LWExMDktNDVjZC05MDQ4LTNlNjQyOWUyZWIxMSIsInRhYmxlIjp7Im92ZXJhbGwiOlt7InJhbmsiOiIxIiwidGVhbSI6IktyYXZhxZllIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8zNzdiZjBhYS0zM2U5LTQ5ODctYWI0Mi0zOTc0YmE1ODhkNmYvMzc3YmYwYWEtMzNlOS00OTg3LWFiNDItMzk3NGJhNTg4ZDZmX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiOSIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjIiLCJzY29yZSI6IjM3OjEyIiwicG9pbnRzIjoiMjgifSx7InJhbmsiOiIyIiwidGVhbSI6IkjDoWogdmUgU2xlenNrdSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMjU3OGI5ZmYtOTM4ZS00NjFiLTkwOTAtZDk2OTdlYjkzNzFmLzI1NzhiOWZmLTkzOGUtNDYxYi05MDkwLWQ5Njk3ZWI5MzcxZl9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjciLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiIyIiwic2NvcmUiOiIyNzoxMyIsInBvaW50cyI6IjI0In0seyJyYW5rIjoiMyIsInRlYW0iOiJKYWt1YsSNb3ZpY2UiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzRlMGI1ZjJmLTRhMjctNDQ0Yy1iZjc3LWUzNzI1Yjg5ODA4Ni80ZTBiNWYyZi00YTI3LTQ0NGMtYmY3Ny1lMzcyNWI4OTgwODZfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI3IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiMTg6MjIiLCJwb2ludHMiOiIyMSJ9LHsicmFuayI6IjQiLCJ0ZWFtIjoiRksgSFx1MDAyNlAgU3RhcsOpIE3Em3N0byIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZWMzYjhmN2YtNTc2NC00YTRlLWIzN2YtNTZkZWE3MDY5NmNiL2VjM2I4ZjdmLTU3NjQtNGE0ZS1iMzdmLTU2ZGVhNzA2OTZjYl9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjYiLCJkcmF3cyI6IjIiLCJsb3NzZXMiOiI0Iiwic2NvcmUiOiIyMjoyMCIsInBvaW50cyI6IjIwIn0seyJyYW5rIjoiNSIsInRlYW0iOiJCcnXFoXBlcmsiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI2IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiMjk6MjciLCJwb2ludHMiOiIxOSJ9LHsicmFuayI6IjYiLCJ0ZWFtIjoiQmFuw61rIEFsYnJlY2h0aWNlIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84ODdhNjdkNi1jNjA3LTRlODAtOTFiZS1kMWFmZjk0MDY2OTgvODg3YTY3ZDYtYzYwNy00ZTgwLTkxYmUtZDFhZmY5NDA2Njk4X2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjI0OjIzIiwicG9pbnRzIjoiMTkifSx7InJhbmsiOiI3IiwidGVhbSI6IkZLIE3Em3N0byBBbGJyZWNodGljZSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNzUwYjhkODEtNTQyYi00ODVjLThhMTgtZmMwYzQ5NGZmNDExLzc1MGI4ZDgxLTU0MmItNDg1Yy04YTE4LWZjMGM0OTRmZjQxMV9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjUiLCJkcmF3cyI6IjQiLCJsb3NzZXMiOiIzIiwic2NvcmUiOiIxOToxOCIsInBvaW50cyI6IjE5In0seyJyYW5rIjoiOCIsInRlYW0iOiJNRksgVsOtdGtvdmljZSBCIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9hZjg4MGQwNi02ZmZjLTQ5M2EtOTRiYi05MGUyYmRhYjcxMTkvYWY4ODBkMDYtNmZmYy00OTNhLTk0YmItOTBlMmJkYWI3MTE5X2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMyIsImxvc3NlcyI6IjMiLCJzY29yZSI6IjI2OjIwIiwicG9pbnRzIjoiMTgifSx7InJhbmsiOiI5IiwidGVhbSI6IlNsYXZpYSBPcmxvdsOhIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS82ZWEwNmQzYS1hN2JmLTRlZTItOTlmZi0xYmExZWRjNjJjOGYvNmVhMDZkM2EtYTdiZi00ZWUyLTk5ZmYtMWJhMWVkYzYyYzhmX2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjI0OjIzIiwicG9pbnRzIjoiMTcifSx7InJhbmsiOiIxMCIsInRlYW0iOiJGQyBWxZllc2luYSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZGMwNWY5YzUtYTQzNi00ZmNlLWI5Y2ItMDZjN2ZmODVkMDE5L2RjMDVmOWM1LWE0MzYtNGZjZS1iOWNiLTA2YzdmZjg1ZDAxOV9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjUiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI2Iiwic2NvcmUiOiIyNjoyNSIsInBvaW50cyI6IjE2In0seyJyYW5rIjoiMTEiLCJ0ZWFtIjoiRksgS29mb2xhIEtybm92IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNTgvN2VhY2Q5ZjAtYmZhMC00OTI4LWE5YjYtOTM2MTQwMTY4ZjU4X2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjUiLCJzY29yZSI6IjE3OjIxIiwicG9pbnRzIjoiMTYifSx7InJhbmsiOiIxMiIsInRlYW0iOiJLb2JlxZlpY2UiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzU1Zjk2MzA3LWM5MTYtNDgwMS05NDhiLWJjODRmNDZmMjFiZC81NWY5NjMwNy1jOTE2LTQ4MDEtOTQ4Yi1iYzg0ZjQ2ZjIxYmRfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI1IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiNyIsInNjb3JlIjoiMjM6MTkiLCJwb2ludHMiOiIxNSJ9LHsicmFuayI6IjEzIiwidGVhbSI6IlNLIEJFU0tZRCBGcmVuxaF0w6F0IHAuIFIuIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjciLCJzY29yZSI6IjE2OjI2IiwicG9pbnRzIjoiMTEifSx7InJhbmsiOiIxNCIsInRlYW0iOiJEYXJrb3ZpxI1reSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvOGUyMDdiMzAtN2I2OC00NGJiLWFkMDgtYmMyNTQ5NWRkMDk0LzhlMjA3YjMwLTdiNjgtNDRiYi1hZDA4LWJjMjU0OTVkZDA5NF9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjIiLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiI3Iiwic2NvcmUiOiIxNjoyMyIsInBvaW50cyI6IjkifSx7InJhbmsiOiIxNSIsInRlYW0iOiJIZcWZbWFuaWNlIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9jMzJkYzMwNS02Yjc4LTQxYzctODA1My1kODY0NGVlZjk2ZjEvYzMyZGMzMDUtNmI3OC00MWM3LTgwNTMtZDg2NDRlZWY5NmYxX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMSIsImRyYXdzIjoiNSIsImxvc3NlcyI6IjYiLCJzY29yZSI6IjE3OjMwIiwicG9pbnRzIjoiOCJ9LHsicmFuayI6IjE2IiwidGVhbSI6IkZDIERvbG7DrSBCZW5lxaFvdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMDgwZTNhZTEtMmJjNC00ZDkzLWJlYTktZGIyNmRhNzY4ZmE1LzA4MGUzYWUxLTJiYzQtNGQ5My1iZWE5LWRiMjZkYTc2OGZhNV9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjIiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI5Iiwic2NvcmUiOiIxNjozNSIsInBvaW50cyI6IjcifV19fSx7ImlkIjoiN2FlN2UzZDAtYWIzYy00YWZlLWFmNmQtNGEyNmQ3NGVhNTU0IiwiY29kZSI6IkMxQSIsIm5hbWUiOiJLQUxNQU4gVFJBREUgS3JhanNrw70gcMWZZWJvciBzdGFyxaHDrSBkb3Jvc3QiLCJ0ZWFtX2NvdW50IjoiMTYiLCJtYXRjaGVzX2xpbmsiOiJodHRwczovL3d3dy5mb3RiYWwuY3ovc291dGV6ZS90dXJuYWplL3RhYmxlLzdhZTdlM2QwLWFiM2MtNGFmZS1hZjZkLTRhMjZkNzRlYTU1NCIsInRhYmxlIjp7Im92ZXJhbGwiOlt7InJhbmsiOiIxIiwidGVhbSI6IkhsdWJpbmEiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2RhNjJjNzA1LWNhNzMtNDU2MS05ZWE0LWFiOTNlNmFmY2U4OC9kYTYyYzcwNS1jYTczLTQ1NjEtOWVhNC1hYjkzZTZhZmNlODhfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiIxMSIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjEiLCJzY29yZSI6IjU5OjEwIiwicG9pbnRzIjoiMzMifSx7InJhbmsiOiIyIiwidGVhbSI6IlBvbGFua2EgbmFkIE9kcm91IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8zMWU1MzM4NC0zN2Q4LTQ3NTUtYmZkYy1jOGQxNjhmZmVhMjQvMzFlNTMzODQtMzdkOC00NzU1LWJmZGMtYzhkMTY4ZmZlYTI0X2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiOSIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjEiLCJzY29yZSI6IjY3OjgiLCJwb2ludHMiOiIyOSJ9LHsicmFuayI6IjMiLCJ0ZWFtIjoiTUZLIEhhdsOtxZlvdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMDVjMGU1ZDQtOTQ4NS00ZTQ5LWIwMDEtZmMxYTQzNzQ5NjM2LzA1YzBlNWQ0LTk0ODUtNGU0OS1iMDAxLWZjMWE0Mzc0OTYzNl9jcm9wLmpwZyIsInBsYXllZCI6IjExIiwid2lucyI6IjciLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiIxIiwic2NvcmUiOiIzMToxNiIsInBvaW50cyI6IjI0In0seyJyYW5rIjoiNCIsInRlYW0iOiJNRksgU2xhdm9qIEJydW50w6FsIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9lN2U1ZWU2NS0xMWY5LTRlZGYtODcyNC0xYmFiNjA0M2NhZGMvZTdlNWVlNjUtMTFmOS00ZWRmLTg3MjQtMWJhYjYwNDNjYWRjX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiNyIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjQwOjIyIiwicG9pbnRzIjoiMjIifSx7InJhbmsiOiI1IiwidGVhbSI6IkZyw71kbGFudCBuLiBPLiIsInRlYW1fbG9nb191cmwiOiIvZGlzdC9pbWcvbG9nby1jbHViLWVtcHR5LnN2ZyIsInBsYXllZCI6IjExIiwid2lucyI6IjYiLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiIyIiwic2NvcmUiOiI0MDoyMSIsInBvaW50cyI6IjIxIn0seyJyYW5rIjoiNiIsInRlYW0iOiJSw71tYcWZb3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2NlMDVjOWY5LTNiMjgtNGFlNi05MDc3LTQ5M2Y5MGQwMGZmYy9jZTA1YzlmOS0zYjI4LTRhZTYtOTA3Ny00OTNmOTBkMDBmZmNfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiI2IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNCIsInNjb3JlIjoiNDA6MjMiLCJwb2ludHMiOiIxOSJ9LHsicmFuayI6IjciLCJ0ZWFtIjoiS3JhdmHFmWUiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzM3N2JmMGFhLTMzZTktNDk4Ny1hYjQyLTM5NzRiYTU4OGQ2Zi8zNzdiZjBhYS0zM2U5LTQ5ODctYWI0Mi0zOTc0YmE1ODhkNmZfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI1IiwiZHJhd3MiOiIyIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiNDY6NDAiLCJwb2ludHMiOiIxNyJ9LHsicmFuayI6IjgiLCJ0ZWFtIjoiQnJ1xaFwZXJrIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjM2OjMzIiwicG9pbnRzIjoiMTcifSx7InJhbmsiOiI5IiwidGVhbSI6IlBldMWZa292aWNlIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9hNTc5YjhmNy00MTczLTRhZjAtODAzOS1jOGMxMjA1MmYyODAvYTU3OWI4ZjctNDE3My00YWYwLTgwMzktYzhjMTIwNTJmMjgwX2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjUiLCJzY29yZSI6IjIyOjE5IiwicG9pbnRzIjoiMTYifSx7InJhbmsiOiIxMCIsInRlYW0iOiJGcmVuxaF0w6F0IHAuIFIuIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjYiLCJzY29yZSI6IjMyOjQxIiwicG9pbnRzIjoiMTYifSx7InJhbmsiOiIxMSIsInRlYW0iOiJLcm5vdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvN2VhY2Q5ZjAtYmZhMC00OTI4LWE5YjYtOTM2MTQwMTY4ZjU4LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OF9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjQiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI3Iiwic2NvcmUiOiI0MzozNyIsInBvaW50cyI6IjEzIn0seyJyYW5rIjoiMTIiLCJ0ZWFtIjoiQm9zcG9yIEJvaHVtw61uIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9lOTJjNTFhNi0wNmI0LTQzNDEtOTFkMS1mMmZkZGMyNWZhNTkvZTkyYzUxYTYtMDZiNC00MzQxLTkxZDEtZjJmZGRjMjVmYTU5X2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMyIsImxvc3NlcyI6IjYiLCJzY29yZSI6IjIzOjI5IiwicG9pbnRzIjoiMTIifSx7InJhbmsiOiIxMyIsInRlYW0iOiJGSyBIXHUwMDI2UCBTdGFyw6kgTcSbc3RvIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9lYzNiOGY3Zi01NzY0LTRhNGUtYjM3Zi01NmRlYTcwNjk2Y2IvZWMzYjhmN2YtNTc2NC00YTRlLWIzN2YtNTZkZWE3MDY5NmNiX2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjciLCJzY29yZSI6IjIxOjMyIiwicG9pbnRzIjoiMTAifSx7InJhbmsiOiIxNCIsInRlYW0iOiJWZWxrw6EgUG9sb20iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2Q4NTZjZDZlLTc4MmUtNGY4OC05Y2Q0LTAyNGUyODllYThjOS9kODU2Y2Q2ZS03ODJlLTRmODgtOWNkNC0wMjRlMjg5ZWE4YzlfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiIzIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiOCIsInNjb3JlIjoiMjc6NDIiLCJwb2ludHMiOiI5In0seyJyYW5rIjoiMTUiLCJ0ZWFtIjoiUmFkdcWIIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS83NjFmYjI1ZS0xM2U2LTQ3OTItODM0My05MDZkNWEzY2I1NzIvNzYxZmIyNWUtMTNlNi00NzkyLTgzNDMtOTA2ZDVhM2NiNTcyX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMSIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjgiLCJzY29yZSI6IjE4OjY1IiwicG9pbnRzIjoiNCJ9LHsicmFuayI6IjE2IiwidGVhbSI6Ikhvcm7DrSBTdWNow6EiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2E2YzdjMzQ3LWVlYjUtNGYwZS1iMjE3LTE1NmY0NmEzMDA5MS9hNmM3YzM0Ny1lZWI1LTRmMGUtYjIxNy0xNTZmNDZhMzAwOTFfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiIwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMTEiLCJzY29yZSI6IjY6MTEzIiwicG9pbnRzIjoiMCJ9XX19LHsiaWQiOiJkZGRiMzk4Mi03MTU3LTRiZmUtYjhhMC1kMzUzMGVhYTBhNzciLCJjb2RlIjoiRDFBIiwibmFtZSI6IktBTE1BTiBUUkFERSBLcmFqc2vDvSBwxZllYm9yIG1sYWTFocOtIGRvcm9zdCIsInRlYW1fY291bnQiOiIxNiIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvZGRkYjM5ODItNzE1Ny00YmZlLWI4YTAtZDM1MzBlYWEwYTc3IiwidGFibGUiOnsib3ZlcmFsbCI6W3sicmFuayI6IjEiLCJ0ZWFtIjoiSGx1YmluYSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZGE2MmM3MDUtY2E3My00NTYxLTllYTQtYWI5M2U2YWZjZTg4L2RhNjJjNzA1LWNhNzMtNDU2MS05ZWE0LWFiOTNlNmFmY2U4OF9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjEwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMiIsInNjb3JlIjoiNzY6MTYiLCJwb2ludHMiOiIzMCJ9LHsicmFuayI6IjIiLCJ0ZWFtIjoiUG9sYW5rYSBuYWQgT2Ryb3UiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzMxZTUzMzg0LTM3ZDgtNDc1NS1iZmRjLWM4ZDE2OGZmZWEyNC8zMWU1MzM4NC0zN2Q4LTQ3NTUtYmZkYy1jOGQxNjhmZmVhMjRfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI5IiwiZHJhd3MiOiIyIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiNzI6MTYiLCJwb2ludHMiOiIyOSJ9LHsicmFuayI6IjMiLCJ0ZWFtIjoiUGV0xZlrb3ZpY2UiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2E1NzliOGY3LTQxNzMtNGFmMC04MDM5LWM4YzEyMDUyZjI4MC9hNTc5YjhmNy00MTczLTRhZjAtODAzOS1jOGMxMjA1MmYyODBfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI5IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiNjk6MTYiLCJwb2ludHMiOiIyNyJ9LHsicmFuayI6IjQiLCJ0ZWFtIjoiTUZLIFNsYXZvaiBCcnVudMOhbCIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZTdlNWVlNjUtMTFmOS00ZWRmLTg3MjQtMWJhYjYwNDNjYWRjL2U3ZTVlZTY1LTExZjktNGVkZi04NzI0LTFiYWI2MDQzY2FkY19jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjciLCJkcmF3cyI6IjIiLCJsb3NzZXMiOiIzIiwic2NvcmUiOiI1MjoyMSIsInBvaW50cyI6IjIzIn0seyJyYW5rIjoiNSIsInRlYW0iOiJLcmF2YcWZZSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMzc3YmYwYWEtMzNlOS00OTg3LWFiNDItMzk3NGJhNTg4ZDZmLzM3N2JmMGFhLTMzZTktNDk4Ny1hYjQyLTM5NzRiYTU4OGQ2Zl9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjciLCJkcmF3cyI6IjIiLCJsb3NzZXMiOiIzIiwic2NvcmUiOiI1NDoyNiIsInBvaW50cyI6IjIzIn0seyJyYW5rIjoiNiIsInRlYW0iOiJSw71tYcWZb3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2NlMDVjOWY5LTNiMjgtNGFlNi05MDc3LTQ5M2Y5MGQwMGZmYy9jZTA1YzlmOS0zYjI4LTRhZTYtOTA3Ny00OTNmOTBkMDBmZmNfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiI3IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiNjg6MjMiLCJwb2ludHMiOiIyMiJ9LHsicmFuayI6IjciLCJ0ZWFtIjoiTUZLIEhhdsOtxZlvdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMDVjMGU1ZDQtOTQ4NS00ZTQ5LWIwMDEtZmMxYTQzNzQ5NjM2LzA1YzBlNWQ0LTk0ODUtNGU0OS1iMDAxLWZjMWE0Mzc0OTYzNl9jcm9wLmpwZyIsInBsYXllZCI6IjExIiwid2lucyI6IjYiLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiIyIiwic2NvcmUiOiIzMDoyMyIsInBvaW50cyI6IjIxIn0seyJyYW5rIjoiOCIsInRlYW0iOiJLcm5vdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvN2VhY2Q5ZjAtYmZhMC00OTI4LWE5YjYtOTM2MTQwMTY4ZjU4LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OF9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjUiLCJkcmF3cyI6IjIiLCJsb3NzZXMiOiI1Iiwic2NvcmUiOiI0MzoyNSIsInBvaW50cyI6IjE3In0seyJyYW5rIjoiOSIsInRlYW0iOiJCb3Nwb3IgQm9odW3DrW4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2U5MmM1MWE2LTA2YjQtNDM0MS05MWQxLWYyZmRkYzI1ZmE1OS9lOTJjNTFhNi0wNmI0LTQzNDEtOTFkMS1mMmZkZGMyNWZhNTlfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI1IiwiZHJhd3MiOiIyIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiMzE6MzAiLCJwb2ludHMiOiIxNyJ9LHsicmFuayI6IjEwIiwidGVhbSI6IlZlbGvDoSBQb2xvbSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZDg1NmNkNmUtNzgyZS00Zjg4LTljZDQtMDI0ZTI4OWVhOGM5L2Q4NTZjZDZlLTc4MmUtNGY4OC05Y2Q0LTAyNGUyODllYThjOV9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjUiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI2Iiwic2NvcmUiOiIzMToyNyIsInBvaW50cyI6IjE2In0seyJyYW5rIjoiMTEiLCJ0ZWFtIjoiRnJlbsWhdMOhdCBwLiBSLiIsInRlYW1fbG9nb191cmwiOiIvZGlzdC9pbWcvbG9nby1jbHViLWVtcHR5LnN2ZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjUiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI2Iiwic2NvcmUiOiIzMToyOSIsInBvaW50cyI6IjE2In0seyJyYW5rIjoiMTIiLCJ0ZWFtIjoiRnLDvWRsYW50IG4uIE8uIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNCIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjUiLCJzY29yZSI6IjIyOjE4IiwicG9pbnRzIjoiMTQifSx7InJhbmsiOiIxMyIsInRlYW0iOiJCcnXFoXBlcmsiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI0IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiOCIsInNjb3JlIjoiMjg6MzQiLCJwb2ludHMiOiIxMiJ9LHsicmFuayI6IjE0IiwidGVhbSI6IkZLIEhcdTAwMjZQIFN0YXLDqSBNxJtzdG8iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2VjM2I4ZjdmLTU3NjQtNGE0ZS1iMzdmLTU2ZGVhNzA2OTZjYi9lYzNiOGY3Zi01NzY0LTRhNGUtYjM3Zi01NmRlYTcwNjk2Y2JfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiIxIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMTAiLCJzY29yZSI6IjEyOjUxIiwicG9pbnRzIjoiMyJ9LHsicmFuayI6IjE1IiwidGVhbSI6Ikhvcm7DrSBTdWNow6EiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2E2YzdjMzQ3LWVlYjUtNGYwZS1iMjE3LTE1NmY0NmEzMDA5MS9hNmM3YzM0Ny1lZWI1LTRmMGUtYjIxNy0xNTZmNDZhMzAwOTFfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiIwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMTEiLCJzY29yZSI6IjE6MTMxIiwicG9pbnRzIjoiMCJ9LHsicmFuayI6IjE2IiwidGVhbSI6IlJhZHXFiCIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNzYxZmIyNWUtMTNlNi00NzkyLTgzNDMtOTA2ZDVhM2NiNTcyLzc2MWZiMjVlLTEzZTYtNDc5Mi04MzQzLTkwNmQ1YTNjYjU3Ml9jcm9wLmpwZyIsInBsYXllZCI6IjExIiwid2lucyI6IjAiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIxMSIsInNjb3JlIjoiNjoxNDAiLCJwb2ludHMiOiIwIn1dfX0seyJpZCI6ImM5MGFjZTQ1LWUyZjAtNDcyMy05NGMyLTA2ODlkOWFmNTcyNiIsImNvZGUiOiJFMVMiLCJuYW1lIjoiMi5NU8W9TC1VIDE1ICBzay4gRSIsInRlYW1fY291bnQiOiIxMiIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvYzkwYWNlNDUtZTJmMC00NzIzLTk0YzItMDY4OWQ5YWY1NzI2IiwidGFibGUiOnsib3ZlcmFsbCI6W3sicmFuayI6IjEiLCJ0ZWFtIjoiSHJhbmljZSIsInRlYW1fbG9nb191cmwiOiIvZGlzdC9pbWcvbG9nby1jbHViLWVtcHR5LnN2ZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjEwIiwiZHJhd3MiOiIyIiwibG9zc2VzIjoiMCIsInNjb3JlIjoiNDg6MTciLCJwb2ludHMiOiIzMiJ9LHsicmFuayI6IjIiLCJ0ZWFtIjoiS2Fydmluw6EiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzRjYmUyNWU2LTU3ZjMtNDFjMC04ZDkyLTc4MmIxOWI2MTczMS80Y2JlMjVlNi01N2YzLTQxYzAtOGQ5Mi03ODJiMTliNjE3MzFfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI5IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiMzM6OSIsInBvaW50cyI6IjI3In0seyJyYW5rIjoiMyIsInRlYW0iOiJCw61sb3ZlYyIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZDMxZjRhNDEtODViOS00ZTU4LWJkZWUtNjNjYjU2M2FkYTViL2QzMWY0YTQxLTg1YjktNGU1OC1iZGVlLTYzY2I1NjNhZGE1Yl9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjgiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiIzIiwic2NvcmUiOiI1MzozNSIsInBvaW50cyI6IjI1In0seyJyYW5rIjoiNCIsInRlYW0iOiLFoHVtcGVyayIsInRlYW1fbG9nb191cmwiOiIvZGlzdC9pbWcvbG9nby1jbHViLWVtcHR5LnN2ZyIsInBsYXllZCI6IjExIiwid2lucyI6IjciLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiIzIiwic2NvcmUiOiIzNzoyMyIsInBvaW50cyI6IjIyIn0seyJyYW5rIjoiNSIsInRlYW0iOiJQb3J1YmEg4oCTIFBldMWZdmFsZCIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvOWQ5MzBlOTItOTJhNS00NWM0LTgzY2YtMjg2M2EwNzZmM2IwLzlkOTMwZTkyLTkyYTUtNDVjNC04M2NmLTI4NjNhMDc2ZjNiMF9jcm9wLmpwZyIsInBsYXllZCI6IjEwIiwid2lucyI6IjUiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI0Iiwic2NvcmUiOiIzMToyMyIsInBvaW50cyI6IjE2In0seyJyYW5rIjoiNiIsInRlYW0iOiJOb3bDvSBKacSNw61uIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNCIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjUiLCJzY29yZSI6IjMzOjM1IiwicG9pbnRzIjoiMTQifSx7InJhbmsiOiI3IiwidGVhbSI6IlZhbGHFoXNrw6kgTWV6acWZw63EjcOtIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiNCIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjYiLCJzY29yZSI6IjIzOjMzIiwicG9pbnRzIjoiMTQifSx7InJhbmsiOiI4IiwidGVhbSI6IlTFmElORUMiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzVjN2E3ZjFlLTBhNDUtNGUyYy1iNjQ4LTgwZjNjOTZiNWJmMS81YzdhN2YxZS0wYTQ1LTRlMmMtYjY0OC04MGYzYzk2YjViZjFfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI0IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNyIsInNjb3JlIjoiMjc6MzQiLCJwb2ludHMiOiIxMyJ9LHsicmFuayI6IjkiLCJ0ZWFtIjoiS3Jub3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OC83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNThfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMSIsIndpbnMiOiI0IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNiIsInNjb3JlIjoiMjc6NDEiLCJwb2ludHMiOiIxMyJ9LHsicmFuayI6IjEwIiwidGVhbSI6IkhsdcSNw61uIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84NTBkNmQ1Yy01ODEyLTQ4ZDYtOTNiYS1mODY2ZmFiZmFkYTMvODUwZDZkNWMtNTgxMi00OGQ2LTkzYmEtZjg2NmZhYmZhZGEzX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjgiLCJzY29yZSI6IjIyOjQwIiwicG9pbnRzIjoiMTAifSx7InJhbmsiOiIxMSIsInRlYW0iOiJVbmnEjW92IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84MTM3NzFiNi02NmYwLTQ1MGMtYTU1MS1jYzFhMGNmNGNlNmQvODEzNzcxYjYtNjZmMC00NTBjLWE1NTEtY2MxYTBjZjRjZTZkX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMiIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjgiLCJzY29yZSI6IjI1OjM5IiwicG9pbnRzIjoiOCJ9LHsicmFuayI6IjEyIiwidGVhbSI6IkhhdsOtxZlvdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMDVjMGU1ZDQtOTQ4NS00ZTQ5LWIwMDEtZmMxYTQzNzQ5NjM2LzA1YzBlNWQ0LTk0ODUtNGU0OS1iMDAxLWZjMWE0Mzc0OTYzNl9jcm9wLmpwZyIsInBsYXllZCI6IjExIiwid2lucyI6IjEiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIxMCIsInNjb3JlIjoiMTc6NDciLCJwb2ludHMiOiIzIn1dfX0seyJpZCI6ImI5YWMyMzI5LTJkYzEtNGMwMS05YWNiLTJiMGRlYTdiMDNkNiIsImNvZGUiOiJFMlMiLCJuYW1lIjoiMi5NU8W9TC1VIDE0ICBzay4gRSIsInRlYW1fY291bnQiOiIxMiIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvYjlhYzIzMjktMmRjMS00YzAxLTlhY2ItMmIwZGVhN2IwM2Q2IiwidGFibGUiOnsib3ZlcmFsbCI6W3sicmFuayI6IjEiLCJ0ZWFtIjoiVW5pxI1vdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvODEzNzcxYjYtNjZmMC00NTBjLWE1NTEtY2MxYTBjZjRjZTZkLzgxMzc3MWI2LTY2ZjAtNDUwYy1hNTUxLWNjMWEwY2Y0Y2U2ZF9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjExIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiMTIyOjE3IiwicG9pbnRzIjoiMzMifSx7InJhbmsiOiIyIiwidGVhbSI6IkthcnZpbsOhIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS80Y2JlMjVlNi01N2YzLTQxYzAtOGQ5Mi03ODJiMTliNjE3MzEvNGNiZTI1ZTYtNTdmMy00MWMwLThkOTItNzgyYjE5YjYxNzMxX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiOSIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjEiLCJzY29yZSI6IjYxOjEwIiwicG9pbnRzIjoiMjcifSx7InJhbmsiOiIzIiwidGVhbSI6IsWgdW1wZXJrIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiOCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjMiLCJzY29yZSI6IjUzOjI5IiwicG9pbnRzIjoiMjQifSx7InJhbmsiOiI0IiwidGVhbSI6IkhyYW5pY2UiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiI3IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNCIsInNjb3JlIjoiNjk6MzQiLCJwb2ludHMiOiIyMiJ9LHsicmFuayI6IjUiLCJ0ZWFtIjoiVMWYSU5FQyIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNWM3YTdmMWUtMGE0NS00ZTJjLWI2NDgtODBmM2M5NmI1YmYxLzVjN2E3ZjFlLTBhNDUtNGUyYy1iNjQ4LTgwZjNjOTZiNWJmMV9jcm9wLmpwZyIsInBsYXllZCI6IjEyIiwid2lucyI6IjYiLCJkcmF3cyI6IjEiLCJsb3NzZXMiOiI1Iiwic2NvcmUiOiI1NTo0MiIsInBvaW50cyI6IjE5In0seyJyYW5rIjoiNiIsInRlYW0iOiJOb3bDvSBKacSNw61uIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjUiLCJzY29yZSI6IjU0OjM3IiwicG9pbnRzIjoiMTYifSx7InJhbmsiOiI3IiwidGVhbSI6IkLDrWxvdmVjIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9kMzFmNGE0MS04NWI5LTRlNTgtYmRlZS02M2NiNTYzYWRhNWIvZDMxZjRhNDEtODViOS00ZTU4LWJkZWUtNjNjYjU2M2FkYTViX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiNCIsImRyYXdzIjoiNCIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjU0OjM3IiwicG9pbnRzIjoiMTYifSx7InJhbmsiOiI4IiwidGVhbSI6IkhsdcSNw61uIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84NTBkNmQ1Yy01ODEyLTQ4ZDYtOTNiYS1mODY2ZmFiZmFkYTMvODUwZDZkNWMtNTgxMi00OGQ2LTkzYmEtZjg2NmZhYmZhZGEzX2Nyb3AuanBnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMyIsImRyYXdzIjoiNCIsImxvc3NlcyI6IjUiLCJzY29yZSI6IjMxOjMyIiwicG9pbnRzIjoiMTMifSx7InJhbmsiOiI5IiwidGVhbSI6IlBvcnViYSDigJMgUGV0xZl2YWxkIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS85ZDkzMGU5Mi05MmE1LTQ1YzQtODNjZi0yODYzYTA3NmYzYjAvOWQ5MzBlOTItOTJhNS00NWM0LTgzY2YtMjg2M2EwNzZmM2IwX2Nyb3AuanBnIiwicGxheWVkIjoiOSIsIndpbnMiOiIzIiwiZHJhd3MiOiIyIiwibG9zc2VzIjoiNCIsInNjb3JlIjoiMjY6MjkiLCJwb2ludHMiOiIxMSJ9LHsicmFuayI6IjEwIiwidGVhbSI6IlZhbGHFoXNrw6kgTWV6acWZw63EjcOtIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTIiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjciLCJzY29yZSI6IjM0OjUxIiwicG9pbnRzIjoiMTEifSx7InJhbmsiOiIxMSIsInRlYW0iOiJIYXbDrcWZb3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzA1YzBlNWQ0LTk0ODUtNGU0OS1iMDAxLWZjMWE0Mzc0OTYzNi8wNWMwZTVkNC05NDg1LTRlNDktYjAwMS1mYzFhNDM3NDk2MzZfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMiIsIndpbnMiOiIxIiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiMTAiLCJzY29yZSI6Ijg6MTM3IiwicG9pbnRzIjoiNCJ9LHsicmFuayI6IjEyIiwidGVhbSI6Iktybm92IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNTgvN2VhY2Q5ZjAtYmZhMC00OTI4LWE5YjYtOTM2MTQwMTY4ZjU4X2Nyb3AuanBnIiwicGxheWVkIjoiMTEiLCJ3aW5zIjoiMCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjExIiwic2NvcmUiOiIxMjoxMjQiLCJwb2ludHMiOiIwIn1dfX0seyJpZCI6ImFlMTJkZjg0LWVhYmEtNDY0My1hYzE1LWUwZDk4ODhmNWE4NyIsImNvZGUiOiJGMVMiLCJuYW1lIjoiMS4gbGlnYSBTcFNNLVUgMTMgU0VWRVIiLCJ0ZWFtX2NvdW50IjoiMTgiLCJtYXRjaGVzX2xpbmsiOiJodHRwczovL3d3dy5mb3RiYWwuY3ovc291dGV6ZS90dXJuYWplL3RhYmxlL2FlMTJkZjg0LWVhYmEtNDY0My1hYzE1LWUwZDk4ODhmNWE4NyIsInRhYmxlIjp7Im92ZXJhbGwiOlt7InJhbmsiOiIxIiwidGVhbSI6IkJhbsOtayBPc3RyYXZhIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9lNjhlNjhjNi1jMjYzLTQzY2UtYTI0Ny0yMGVlMWQzMjNiNTUvZTY4ZTY4YzYtYzI2My00M2NlLWEyNDctMjBlZTFkMzIzYjU1X2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMTAiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIwIiwic2NvcmUiOiIxNDI6MTgiLCJwb2ludHMiOiIzMCJ9LHsicmFuayI6IjIiLCJ0ZWFtIjoiT3BhdmEiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzY0NWFhZDFiLTlhNDYtNDM1MS05MGI2LTZkZmI5ODk0NTNkZC82NDVhYWQxYi05YTQ2LTQzNTEtOTBiNi02ZGZiOTg5NDUzZGRfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI5IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiMTEwOjE5IiwicG9pbnRzIjoiMjcifSx7InJhbmsiOiIzIiwidGVhbSI6IkthcnZpbsOhIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS80Y2JlMjVlNi01N2YzLTQxYzAtOGQ5Mi03ODJiMTliNjE3MzEvNGNiZTI1ZTYtNTdmMy00MWMwLThkOTItNzgyYjE5YjYxNzMxX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiOCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjIiLCJzY29yZSI6IjEzNTozNiIsInBvaW50cyI6IjI0In0seyJyYW5rIjoiNCIsInRlYW0iOiJWw41US09WSUNFIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9hM2ZmMTdkNi0wODg4LTQ3ZTctOWRlZS0wYTk4ZWM4NzM0ZDAvYTNmZjE3ZDYtMDg4OC00N2U3LTlkZWUtMGE5OGVjODczNGQwX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiNyIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjMiLCJzY29yZSI6IjgzOjI5IiwicG9pbnRzIjoiMjEifSx7InJhbmsiOiI1IiwidGVhbSI6IlZhbGHFoXNrw6kgTWV6acWZw63EjcOtIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiNyIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjMiLCJzY29yZSI6IjcwOjM2IiwicG9pbnRzIjoiMjEifSx7InJhbmsiOiI2IiwidGVhbSI6IkZyw71kZWstTcOtc3RlayIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNTIxNWMxYzEtYTFiNy00YTRkLWJhNDAtZWIwZDM2YjE5YTYxLzUyMTVjMWMxLWExYjctNGE0ZC1iYTQwLWViMGQzNmIxOWE2MV9jcm9wLmpwZyIsInBsYXllZCI6IjkiLCJ3aW5zIjoiNiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjIiLCJzY29yZSI6IjcyOjM3IiwicG9pbnRzIjoiMTkifSx7InJhbmsiOiI3IiwidGVhbSI6IlVuacSNb3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzgxMzc3MWI2LTY2ZjAtNDUwYy1hNTUxLWNjMWEwY2Y0Y2U2ZC84MTM3NzFiNi02NmYwLTQ1MGMtYTU1MS1jYzFhMGNmNGNlNmRfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI2IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiNzU6NjEiLCJwb2ludHMiOiIxOSJ9LHsicmFuayI6IjgiLCJ0ZWFtIjoiUG9ydWJhIOKAkyBQZXTFmXZhbGQiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzlkOTMwZTkyLTkyYTUtNDVjNC04M2NmLTI4NjNhMDc2ZjNiMC85ZDkzMGU5Mi05MmE1LTQ1YzQtODNjZi0yODYzYTA3NmYzYjBfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI1IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNCIsInNjb3JlIjoiNjk6NTIiLCJwb2ludHMiOiIxNiJ9LHsicmFuayI6IjkiLCJ0ZWFtIjoixaB1bXBlcmsiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiI5Iiwid2lucyI6IjUiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiI0Iiwic2NvcmUiOiI3ODo2NyIsInBvaW50cyI6IjE1In0seyJyYW5rIjoiMTAiLCJ0ZWFtIjoiSGx1xI3DrW4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5Lzg1MGQ2ZDVjLTU4MTItNDhkNi05M2JhLWY4NjZmYWJmYWRhMy84NTBkNmQ1Yy01ODEyLTQ4ZDYtOTNiYS1mODY2ZmFiZmFkYTNfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI0IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiNzc6NDYiLCJwb2ludHMiOiIxMyJ9LHsicmFuayI6IjExIiwidGVhbSI6IlDFmWVyb3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzFmZDFhMDQ3LTRjZjUtNDdjYy1hNzEyLTkxNTkyOGNiYTZmYi8xZmQxYTA0Ny00Y2Y1LTQ3Y2MtYTcxMi05MTU5MjhjYmE2ZmJfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI0IiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiMzQ6NTciLCJwb2ludHMiOiIxMyJ9LHsicmFuayI6IjEyIiwidGVhbSI6IkhyYW5pY2UiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiI5Iiwid2lucyI6IjQiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiI1Iiwic2NvcmUiOiI0NDo2MiIsInBvaW50cyI6IjEyIn0seyJyYW5rIjoiMTMiLCJ0ZWFtIjoiSEZLIE9sb21vdWMiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzFmYmFkOTM1LWRhNDEtNDU2Ny04M2RjLTM5N2VjMDRkNjRkMy8xZmJhZDkzNS1kYTQxLTQ1NjctODNkYy0zOTdlYzA0ZDY0ZDNfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIyIiwiZHJhd3MiOiIzIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiNDU6NjYiLCJwb2ludHMiOiI5In0seyJyYW5rIjoiMTQiLCJ0ZWFtIjoiVMWYSU5FQyIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNWM3YTdmMWUtMGE0NS00ZTJjLWI2NDgtODBmM2M5NmI1YmYxLzVjN2E3ZjFlLTBhNDUtNGUyYy1iNjQ4LTgwZjNjOTZiNWJmMV9jcm9wLmpwZyIsInBsYXllZCI6IjkiLCJ3aW5zIjoiMiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjYiLCJzY29yZSI6IjM5OjUyIiwicG9pbnRzIjoiNyJ9LHsicmFuayI6IjE1IiwidGVhbSI6IkLDrWxvdmVjIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9kMzFmNGE0MS04NWI5LTRlNTgtYmRlZS02M2NiNTYzYWRhNWIvZDMxZjRhNDEtODViOS00ZTU4LWJkZWUtNjNjYjU2M2FkYTViX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjciLCJzY29yZSI6IjM4OjcwIiwicG9pbnRzIjoiNyJ9LHsicmFuayI6IjE2IiwidGVhbSI6Ik5vdsO9IEppxI3DrW4iLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIyIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiOCIsInNjb3JlIjoiMTk6OTIiLCJwb2ludHMiOiI2In0seyJyYW5rIjoiMTciLCJ0ZWFtIjoiSGF2w63FmW92IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8wNWMwZTVkNC05NDg1LTRlNDktYjAwMS1mYzFhNDM3NDk2MzYvMDVjMGU1ZDQtOTQ4NS00ZTQ5LWIwMDEtZmMxYTQzNzQ5NjM2X2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjEwIiwic2NvcmUiOiIxMzoxNTIiLCJwb2ludHMiOiIwIn0seyJyYW5rIjoiMTgiLCJ0ZWFtIjoiS3Jub3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OC83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNThfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMTAiLCJzY29yZSI6IjIyOjIxMyIsInBvaW50cyI6IjAifV19fSx7ImlkIjoiM2YzNzkwMWMtNWMzNi00YTEzLThhODQtMjQ0ZjY0ZjFlYTFhIiwiY29kZSI6IkYyUyIsIm5hbWUiOiIxLiBsaWdhIFNwU00tVSAxMiBTRVZFUiIsInRlYW1fY291bnQiOiIxOCIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvM2YzNzkwMWMtNWMzNi00YTEzLThhODQtMjQ0ZjY0ZjFlYTFhIiwidGFibGUiOnsib3ZlcmFsbCI6W3sicmFuayI6IjEiLCJ0ZWFtIjoiSGx1xI3DrW4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5Lzg1MGQ2ZDVjLTU4MTItNDhkNi05M2JhLWY4NjZmYWJmYWRhMy84NTBkNmQ1Yy01ODEyLTQ4ZDYtOTNiYS1mODY2ZmFiZmFkYTNfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIxMCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjAiLCJzY29yZSI6IjEwNDoxMSIsInBvaW50cyI6IjMwIn0seyJyYW5rIjoiMiIsInRlYW0iOiJCYW7DrWsgT3N0cmF2YSIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZTY4ZTY4YzYtYzI2My00M2NlLWEyNDctMjBlZTFkMzIzYjU1L2U2OGU2OGM2LWMyNjMtNDNjZS1hMjQ3LTIwZWUxZDMyM2I1NV9jcm9wLmpwZyIsInBsYXllZCI6IjEwIiwid2lucyI6IjkiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIxIiwic2NvcmUiOiIxMjE6MTUiLCJwb2ludHMiOiIyNyJ9LHsicmFuayI6IjMiLCJ0ZWFtIjoiS2Fydmluw6EiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzRjYmUyNWU2LTU3ZjMtNDFjMC04ZDkyLTc4MmIxOWI2MTczMS80Y2JlMjVlNi01N2YzLTQxYzAtOGQ5Mi03ODJiMTliNjE3MzFfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI5IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiMTIwOjI1IiwicG9pbnRzIjoiMjcifSx7InJhbmsiOiI0IiwidGVhbSI6IlbDjVRLT1ZJQ0UiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2EzZmYxN2Q2LTA4ODgtNDdlNy05ZGVlLTBhOThlYzg3MzRkMC9hM2ZmMTdkNi0wODg4LTQ3ZTctOWRlZS0wYTk4ZWM4NzM0ZDBfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI5IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiNTI6MTMiLCJwb2ludHMiOiIyNyJ9LHsicmFuayI6IjUiLCJ0ZWFtIjoiT3BhdmEiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzY0NWFhZDFiLTlhNDYtNDM1MS05MGI2LTZkZmI5ODk0NTNkZC82NDVhYWQxYi05YTQ2LTQzNTEtOTBiNi02ZGZiOTg5NDUzZGRfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiI4IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMiIsInNjb3JlIjoiMTA5OjIxIiwicG9pbnRzIjoiMjQifSx7InJhbmsiOiI2IiwidGVhbSI6IkhGSyBPbG9tb3VjIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8xZmJhZDkzNS1kYTQxLTQ1NjctODNkYy0zOTdlYzA0ZDY0ZDMvMWZiYWQ5MzUtZGE0MS00NTY3LTgzZGMtMzk3ZWMwNGQ2NGQzX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiNiIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjIiLCJzY29yZSI6Ijg1OjE4IiwicG9pbnRzIjoiMjAifSx7InJhbmsiOiI3IiwidGVhbSI6IkZyw71kZWstTcOtc3RlayIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNTIxNWMxYzEtYTFiNy00YTRkLWJhNDAtZWIwZDM2YjE5YTYxLzUyMTVjMWMxLWExYjctNGE0ZC1iYTQwLWViMGQzNmIxOWE2MV9jcm9wLmpwZyIsInBsYXllZCI6IjkiLCJ3aW5zIjoiNSIsImRyYXdzIjoiMiIsImxvc3NlcyI6IjIiLCJzY29yZSI6IjU2OjIyIiwicG9pbnRzIjoiMTcifSx7InJhbmsiOiI4IiwidGVhbSI6IkhyYW5pY2UiLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiI5Iiwid2lucyI6IjQiLCJkcmF3cyI6IjMiLCJsb3NzZXMiOiIyIiwic2NvcmUiOiI2MjozOCIsInBvaW50cyI6IjE1In0seyJyYW5rIjoiOSIsInRlYW0iOiJQb3J1YmEg4oCTIFBldMWZdmFsZCIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvOWQ5MzBlOTItOTJhNS00NWM0LTgzY2YtMjg2M2EwNzZmM2IwLzlkOTMwZTkyLTkyYTUtNDVjNC04M2NmLTI4NjNhMDc2ZjNiMF9jcm9wLmpwZyIsInBsYXllZCI6IjEwIiwid2lucyI6IjQiLCJkcmF3cyI6IjIiLCJsb3NzZXMiOiI0Iiwic2NvcmUiOiI1NjozNSIsInBvaW50cyI6IjE0In0seyJyYW5rIjoiMTAiLCJ0ZWFtIjoiVMWYSU5FQyIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvNWM3YTdmMWUtMGE0NS00ZTJjLWI2NDgtODBmM2M5NmI1YmYxLzVjN2E3ZjFlLTBhNDUtNGUyYy1iNjQ4LTgwZjNjOTZiNWJmMV9jcm9wLmpwZyIsInBsYXllZCI6IjkiLCJ3aW5zIjoiNCIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjQiLCJzY29yZSI6IjQwOjIxIiwicG9pbnRzIjoiMTMifSx7InJhbmsiOiIxMSIsInRlYW0iOiJQxZllcm92IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8xZmQxYTA0Ny00Y2Y1LTQ3Y2MtYTcxMi05MTU5MjhjYmE2ZmIvMWZkMWEwNDctNGNmNS00N2NjLWE3MTItOTE1OTI4Y2JhNmZiX2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMyIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjciLCJzY29yZSI6IjMwOjU4IiwicG9pbnRzIjoiOSJ9LHsicmFuayI6IjEyIiwidGVhbSI6Ik5vdsO9IEppxI3DrW4iLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIzIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiNyIsInNjb3JlIjoiMzA6NzgiLCJwb2ludHMiOiI5In0seyJyYW5rIjoiMTMiLCJ0ZWFtIjoiVmFsYcWhc2vDqSBNZXppxZnDrcSNw60iLCJ0ZWFtX2xvZ29fdXJsIjoiL2Rpc3QvaW1nL2xvZ28tY2x1Yi1lbXB0eS5zdmciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIyIiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiNyIsInNjb3JlIjoiNDU6NDQiLCJwb2ludHMiOiI3In0seyJyYW5rIjoiMTQiLCJ0ZWFtIjoiSGF2w63FmW92IiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8wNWMwZTVkNC05NDg1LTRlNDktYjAwMS1mYzFhNDM3NDk2MzYvMDVjMGU1ZDQtOTQ4NS00ZTQ5LWIwMDEtZmMxYTQzNzQ5NjM2X2Nyb3AuanBnIiwicGxheWVkIjoiMTAiLCJ3aW5zIjoiMiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjciLCJzY29yZSI6IjE4OjcyIiwicG9pbnRzIjoiNyJ9LHsicmFuayI6IjE1IiwidGVhbSI6IsWgdW1wZXJrIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiOSIsIndpbnMiOiIyIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiNyIsInNjb3JlIjoiNDA6OTUiLCJwb2ludHMiOiI2In0seyJyYW5rIjoiMTYiLCJ0ZWFtIjoiQsOtbG92ZWMiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2QzMWY0YTQxLTg1YjktNGU1OC1iZGVlLTYzY2I1NjNhZGE1Yi9kMzFmNGE0MS04NWI5LTRlNTgtYmRlZS02M2NiNTYzYWRhNWJfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIyIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiOCIsInNjb3JlIjoiMjU6ODEiLCJwb2ludHMiOiI2In0seyJyYW5rIjoiMTciLCJ0ZWFtIjoiVW5pxI1vdiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvODEzNzcxYjYtNjZmMC00NTBjLWE1NTEtY2MxYTBjZjRjZTZkLzgxMzc3MWI2LTY2ZjAtNDUwYy1hNTUxLWNjMWEwY2Y0Y2U2ZF9jcm9wLmpwZyIsInBsYXllZCI6IjEwIiwid2lucyI6IjAiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIxMCIsInNjb3JlIjoiODoxMDYiLCJwb2ludHMiOiIwIn0seyJyYW5rIjoiMTgiLCJ0ZWFtIjoiS3Jub3YiLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OC83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNThfY3JvcC5qcGciLCJwbGF5ZWQiOiIxMCIsIndpbnMiOiIwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMTAiLCJzY29yZSI6IjQ6MjUyIiwicG9pbnRzIjoiMCJ9XX19LHsiaWQiOiI3ODQ5ZDZjYS0zYzYxLTRlMmItYmE0Zi1lODc1YmYxMWZkOTUiLCJjb2RlIjoiRzFEIiwibmFtZSI6IlN0YXLFocOtIHDFmcOtcHJhdmthIDErNSBzay5EIiwidGVhbV9jb3VudCI6IjkiLCJtYXRjaGVzX2xpbmsiOiJodHRwczovL3d3dy5mb3RiYWwuY3ovc291dGV6ZS90dXJuYWplL3RhYmxlLzc4NDlkNmNhLTNjNjEtNGUyYi1iYTRmLWU4NzViZjExZmQ5NSIsInRhYmxlIjp7Im92ZXJhbGwiOm51bGx9fSx7ImlkIjoiYmE1MGMzMTktNDE0ZC00NzhmLTk3MTktNzZkNTlkZGZiODdjIiwiY29kZSI6IkgxQSIsIm5hbWUiOiJPa3Jlc27DrSBwxZllYm9yIG1sYWTFocOtIHDFmcOtcHJhdmt5ICg0KzEpIiwidGVhbV9jb3VudCI6IjEwIiwibWF0Y2hlc19saW5rIjoiaHR0cHM6Ly93d3cuZm90YmFsLmN6L3NvdXRlemUvdHVybmFqZS90YWJsZS9iYTUwYzMxOS00MTRkLTQ3OGYtOTcxOS03NmQ1OWRkZmI4N2MiLCJ0YWJsZSI6eyJvdmVyYWxsIjpudWxsfX0seyJpZCI6Ijc1ODBiODAzLTY2NWQtNDgwOC04Y2VjLWM5MTZkY2IyMjM0MyIsImNvZGUiOiJIMUMiLCJuYW1lIjoiTWxhZMWhw60gcMWZw61wcmF2a2EgMSs0IHNrLkMiLCJ0ZWFtX2NvdW50IjoiMTAiLCJtYXRjaGVzX2xpbmsiOiJodHRwczovL3d3dy5mb3RiYWwuY3ovc291dGV6ZS90dXJuYWplL3RhYmxlLzc1ODBiODAzLTY2NWQtNDgwOC04Y2VjLWM5MTZkY2IyMjM0MyIsInRhYmxlIjp7Im92ZXJhbGwiOm51bGx9fSx7ImlkIjoiZWNjYjkxYmEtY2JjZS00NmUxLWFmNTEtNDQ5YmRiZDQyZjhmIiwiY29kZSI6IlUxRSIsIm5hbWUiOiJQQyAgVTFFICBVLTEwICDFoHVtcGVyayIsInRlYW1fY291bnQiOiI2IiwibWF0Y2hlc19saW5rIjoiaHR0cHM6Ly93d3cuZm90YmFsLmN6L3NvdXRlemUvdHVybmFqZS90YWJsZS9lY2NiOTFiYS1jYmNlLTQ2ZTEtYWY1MS00NDliZGJkNDJmOGYiLCJ0YWJsZSI6eyJvdmVyYWxsIjpbeyJyYW5rIjoiMSIsInRlYW0iOiJGSyBXQVJFWCBKZXNlbsOtayB6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS8wM2RkMzMwYi1kNDY5LTRhNjUtOTlmMS0yOWI3ZWNlN2MyZWQvMDNkZDMzMGItZDQ2OS00YTY1LTk5ZjEtMjliN2VjZTdjMmVkX2Nyb3AuanBnIiwicGxheWVkIjoiNSIsIndpbnMiOiI1IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMCIsInNjb3JlIjoiMjk6NSIsInBvaW50cyI6IjE1In0seyJyYW5rIjoiMiIsInRlYW0iOiJTSyBVbmnEjW92LCB6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84MTM3NzFiNi02NmYwLTQ1MGMtYTU1MS1jYzFhMGNmNGNlNmQvODEzNzcxYjYtNjZmMC00NTBjLWE1NTEtY2MxYTBjZjRjZTZkX2Nyb3AuanBnIiwicGxheWVkIjoiNSIsIndpbnMiOiI0IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMSIsInNjb3JlIjoiMzU6NiIsInBvaW50cyI6IjEyIn0seyJyYW5rIjoiMyIsInRlYW0iOiJNRksgU2xhdm9qIEJydW50w6FsLCB6LiBzLiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvZTdlNWVlNjUtMTFmOS00ZWRmLTg3MjQtMWJhYjYwNDNjYWRjL2U3ZTVlZTY1LTExZjktNGVkZi04NzI0LTFiYWI2MDQzY2FkY19jcm9wLmpwZyIsInBsYXllZCI6IjUiLCJ3aW5zIjoiMiIsImRyYXdzIjoiMSIsImxvc3NlcyI6IjIiLCJzY29yZSI6IjE3OjIxIiwicG9pbnRzIjoiNyJ9LHsicmFuayI6IjQiLCJ0ZWFtIjoiRksgS29mb2xhIEtybm92LCB6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNTgvN2VhY2Q5ZjAtYmZhMC00OTI4LWE5YjYtOTM2MTQwMTY4ZjU4X2Nyb3AuanBnIiwicGxheWVkIjoiNSIsIndpbnMiOiIyIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiMTA6MjUiLCJwb2ludHMiOiI2In0seyJyYW5rIjoiNSIsInRlYW0iOiJGSyBQcnVtcmVudCDFoHVtcGVyayB6LnMuIiwidGVhbV9sb2dvX3VybCI6Ii9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiNSIsIndpbnMiOiIxIiwiZHJhd3MiOiIxIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiOToyNSIsInBvaW50cyI6IjQifSx7InJhbmsiOiI2IiwidGVhbSI6IkZPVEJBTE9Ww50gS0xVQiDFoFRFUk5CRVJLLCB6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS9lNTIwZDE4NS0xMDlmLTRiYzYtYmNjYy02MzEyNjU0YWFjOWIvZTUyMGQxODUtMTA5Zi00YmM2LWJjY2MtNjMxMjY1NGFhYzliX2Nyb3AuanBnIiwicGxheWVkIjoiNSIsIndpbnMiOiIwIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiNSIsInNjb3JlIjoiNjoyNCIsInBvaW50cyI6IjAifV19fSx7ImlkIjoiYjg0YzY3OGYtYzMzYy00NjIyLTk3YWQtNmMzZTg4MjcwOTRiIiwiY29kZSI6IlYxQyIsIm5hbWUiOiJQQyAgVjFDICBVLTggIE5vdsO9IEppxI3DrW4iLCJ0ZWFtX2NvdW50IjoiNiIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvYjg0YzY3OGYtYzMzYy00NjIyLTk3YWQtNmMzZTg4MjcwOTRiIiwidGFibGUiOnsib3ZlcmFsbCI6bnVsbH19LHsiaWQiOiI2YjQwZDljYS1kYTg3LTQ2YmEtOGU5Mi0yODUyMmFkZGEzMjIiLCJjb2RlIjoiVjVCIiwibmFtZSI6IlBDICBWNUIgIFUtOSAgSGx1xI3DrW4iLCJ0ZWFtX2NvdW50IjoiNiIsIm1hdGNoZXNfbGluayI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9zb3V0ZXplL3R1cm5hamUvdGFibGUvNmI0MGQ5Y2EtZGE4Ny00NmJhLThlOTItMjg1MjJhZGRhMzIyIiwidGFibGUiOnsib3ZlcmFsbCI6W3sicmFuayI6IjEiLCJ0ZWFtIjoiU3BvcnRvdm7DrSBrbHViIEZDIEhsdcSNw61uLCB6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vaXMxLmZvdGJhbC5jei9tZWRpYS9rbHVieS84NTBkNmQ1Yy01ODEyLTQ4ZDYtOTNiYS1mODY2ZmFiZmFkYTMvODUwZDZkNWMtNTgxMi00OGQ2LTkzYmEtZjg2NmZhYmZhZGEzX2Nyb3AuanBnIiwicGxheWVkIjoiNSIsIndpbnMiOiI1IiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMCIsInNjb3JlIjoiNTg6NiIsInBvaW50cyI6IjE1In0seyJyYW5rIjoiMiIsInRlYW0iOiJGb3RiYWxvdsO9IGtsdWIgU0sgUG9sYW5rYSBuYWQgT2Ryb3Ugei5zLiIsInRlYW1fbG9nb191cmwiOiJodHRwczovL2lzMS5mb3RiYWwuY3ovbWVkaWEva2x1YnkvMzFlNTMzODQtMzdkOC00NzU1LWJmZGMtYzhkMTY4ZmZlYTI0LzMxZTUzMzg0LTM3ZDgtNDc1NS1iZmRjLWM4ZDE2OGZmZWEyNF9jcm9wLmpwZyIsInBsYXllZCI6IjUiLCJ3aW5zIjoiNCIsImRyYXdzIjoiMCIsImxvc3NlcyI6IjEiLCJzY29yZSI6IjQ1OjE3IiwicG9pbnRzIjoiMTIifSx7InJhbmsiOiIzIiwidGVhbSI6IjEuIEZDIFBvcnViYSDigJMgUGV0xZl2YWxkIG5hIE1vcmF2xJssIHoucy4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzlkOTMwZTkyLTkyYTUtNDVjNC04M2NmLTI4NjNhMDc2ZjNiMC85ZDkzMGU5Mi05MmE1LTQ1YzQtODNjZi0yODYzYTA3NmYzYjBfY3JvcC5qcGciLCJwbGF5ZWQiOiI1Iiwid2lucyI6IjMiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiIyIiwic2NvcmUiOiI0MToxNSIsInBvaW50cyI6IjkifSx7InJhbmsiOiI0IiwidGVhbSI6IsWga29sbsOtIHNwb3J0b3Zuw60ga2x1YiBCw61sb3ZlYyx6LnMuIiwidGVhbV9sb2dvX3VybCI6Imh0dHBzOi8vd3d3LmZvdGJhbC5jei9kaXN0L2ltZy9sb2dvLWNsdWItZW1wdHkuc3ZnIiwicGxheWVkIjoiNSIsIndpbnMiOiIyIiwiZHJhd3MiOiIwIiwibG9zc2VzIjoiMyIsInNjb3JlIjoiMTA6MzIiLCJwb2ludHMiOiI2In0seyJyYW5rIjoiNSIsInRlYW0iOiJGSyBLb2ZvbGEgS3Jub3YsIHoucy4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5LzdlYWNkOWYwLWJmYTAtNDkyOC1hOWI2LTkzNjE0MDE2OGY1OC83ZWFjZDlmMC1iZmEwLTQ5MjgtYTliNi05MzYxNDAxNjhmNThfY3JvcC5qcGciLCJwbGF5ZWQiOiI1Iiwid2lucyI6IjEiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiI0Iiwic2NvcmUiOiIxMjozNCIsInBvaW50cyI6IjMifSx7InJhbmsiOiI2IiwidGVhbSI6IlTEm2xvdsO9Y2hvdm7DoSBqZWRub3RhIFNva29sIEtvem1pY2UsIHoucy4iLCJ0ZWFtX2xvZ29fdXJsIjoiaHR0cHM6Ly9pczEuZm90YmFsLmN6L21lZGlhL2tsdWJ5L2ZlYTdjN2NjLTJhNGUtNDU4Yy1hOTc5LTU3ODlhYWZhMDljMC9mZWE3YzdjYy0yYTRlLTQ1OGMtYTk3OS01Nzg5YWFmYTA5YzBfY3JvcC5qcGciLCJwbGF5ZWQiOiI1Iiwid2lucyI6IjAiLCJkcmF3cyI6IjAiLCJsb3NzZXMiOiI1Iiwic2NvcmUiOiIxOjYzIiwicG9pbnRzIjoiMCJ9XX19XX0K","stored_at":"2025-10-19T15:35:00.041187853Z"} \ No newline at end of file diff --git a/cache/prefetch/articles.json.hdr b/cache/prefetch/articles.json.hdr index 2f6b583..ec17454 100644 --- a/cache/prefetch/articles.json.hdr +++ b/cache/prefetch/articles.json.hdr @@ -1 +1 @@ -{"etag":"","fetched_at":"2025-10-19T15:29:54Z","last_modified":""} \ No newline at end of file +{"etag":"","fetched_at":"2025-10-19T15:34:56Z","last_modified":""} \ No newline at end of file diff --git a/cache/prefetch/competition_aliases.json.hdr b/cache/prefetch/competition_aliases.json.hdr index 2f6b583..ec17454 100644 --- a/cache/prefetch/competition_aliases.json.hdr +++ b/cache/prefetch/competition_aliases.json.hdr @@ -1 +1 @@ -{"etag":"","fetched_at":"2025-10-19T15:29:54Z","last_modified":""} \ No newline at end of file +{"etag":"","fetched_at":"2025-10-19T15:34:56Z","last_modified":""} \ No newline at end of file diff --git a/cache/prefetch/events_upcoming.json.hdr b/cache/prefetch/events_upcoming.json.hdr index 2f6b583..ec17454 100644 --- a/cache/prefetch/events_upcoming.json.hdr +++ b/cache/prefetch/events_upcoming.json.hdr @@ -1 +1 @@ -{"etag":"","fetched_at":"2025-10-19T15:29:54Z","last_modified":""} \ No newline at end of file +{"etag":"","fetched_at":"2025-10-19T15:34:56Z","last_modified":""} \ No newline at end of file diff --git a/cache/prefetch/facr_club_info.json.hdr b/cache/prefetch/facr_club_info.json.hdr index 2f6b583..fed8847 100644 --- a/cache/prefetch/facr_club_info.json.hdr +++ b/cache/prefetch/facr_club_info.json.hdr @@ -1 +1 @@ -{"etag":"","fetched_at":"2025-10-19T15:29:54Z","last_modified":""} \ No newline at end of file +{"etag":"","fetched_at":"2025-10-19T15:35:00Z","last_modified":""} \ No newline at end of file diff --git a/cache/prefetch/facr_tables.json b/cache/prefetch/facr_tables.json index bac354b..9f4cb92 100644 --- a/cache/prefetch/facr_tables.json +++ b/cache/prefetch/facr_tables.json @@ -1 +1 @@ -{"name":"Fotbalovรฝ klub Krnov","club_id":"7eacd9f0-bfa0-4928-a9b6-936140168f58","club_type":"football","club_internal_id":"8010211","logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","address":"8010211","category":"ID klubu","competitions":[{"id":"e3127865-a109-45cd-9048-3e6429e2eb11","code":"A1A","name":"SATUM 5. liga muลพลฏ","team_count":"16","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/e3127865-a109-45cd-9048-3e6429e2eb11","table":{"overall":[{"rank":"1","team":"Kravaล™e","team_logo_url":"https://is1.fotbal.cz/media/kluby/377bf0aa-33e9-4987-ab42-3974ba588d6f/377bf0aa-33e9-4987-ab42-3974ba588d6f_crop.jpg","played":"12","wins":"9","draws":"1","losses":"2","score":"37:12","points":"28"},{"rank":"2","team":"Hรกj ve Slezsku","team_logo_url":"https://is1.fotbal.cz/media/kluby/2578b9ff-938e-461b-9090-d9697eb9371f/2578b9ff-938e-461b-9090-d9697eb9371f_crop.jpg","played":"12","wins":"7","draws":"3","losses":"2","score":"27:13","points":"24"},{"rank":"3","team":"Jakubฤovice","team_logo_url":"https://is1.fotbal.cz/media/kluby/4e0b5f2f-4a27-444c-bf77-e3725b898086/4e0b5f2f-4a27-444c-bf77-e3725b898086_crop.jpg","played":"12","wins":"7","draws":"0","losses":"5","score":"18:22","points":"21"},{"rank":"4","team":"FK H\u0026P Starรฉ Mฤ›sto","team_logo_url":"https://is1.fotbal.cz/media/kluby/ec3b8f7f-5764-4a4e-b37f-56dea70696cb/ec3b8f7f-5764-4a4e-b37f-56dea70696cb_crop.jpg","played":"12","wins":"6","draws":"2","losses":"4","score":"22:20","points":"20"},{"rank":"5","team":"Bruลกperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"6","draws":"1","losses":"5","score":"29:27","points":"19"},{"rank":"6","team":"Banรญk Albrechtice","team_logo_url":"https://is1.fotbal.cz/media/kluby/887a67d6-c607-4e80-91be-d1aff9406698/887a67d6-c607-4e80-91be-d1aff9406698_crop.jpg","played":"11","wins":"6","draws":"1","losses":"4","score":"24:23","points":"19"},{"rank":"7","team":"FK Mฤ›sto Albrechtice","team_logo_url":"https://is1.fotbal.cz/media/kluby/750b8d81-542b-485c-8a18-fc0c494ff411/750b8d81-542b-485c-8a18-fc0c494ff411_crop.jpg","played":"12","wins":"5","draws":"4","losses":"3","score":"19:18","points":"19"},{"rank":"8","team":"MFK Vรญtkovice B","team_logo_url":"https://is1.fotbal.cz/media/kluby/af880d06-6ffc-493a-94bb-90e2bdab7119/af880d06-6ffc-493a-94bb-90e2bdab7119_crop.jpg","played":"10","wins":"5","draws":"3","losses":"2","score":"25:18","points":"18"},{"rank":"9","team":"Slavia Orlovรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/6ea06d3a-a7bf-4ee2-99ff-1ba1edc62c8f/6ea06d3a-a7bf-4ee2-99ff-1ba1edc62c8f_crop.jpg","played":"11","wins":"5","draws":"2","losses":"4","score":"24:23","points":"17"},{"rank":"10","team":"FC Vล™esina","team_logo_url":"https://is1.fotbal.cz/media/kluby/dc05f9c5-a436-4fce-b9cb-06c7ff85d019/dc05f9c5-a436-4fce-b9cb-06c7ff85d019_crop.jpg","played":"12","wins":"5","draws":"1","losses":"6","score":"26:25","points":"16"},{"rank":"11","team":"Kobeล™ice","team_logo_url":"https://is1.fotbal.cz/media/kluby/55f96307-c916-4801-948b-bc84f46f21bd/55f96307-c916-4801-948b-bc84f46f21bd_crop.jpg","played":"12","wins":"5","draws":"0","losses":"7","score":"23:19","points":"15"},{"rank":"12","team":"FK Kofola Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"10","wins":"4","draws":"1","losses":"5","score":"15:20","points":"13"},{"rank":"13","team":"SK BESKYD Frenลกtรกt p. R.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"3","draws":"2","losses":"7","score":"16:26","points":"11"},{"rank":"14","team":"Darkoviฤky","team_logo_url":"https://is1.fotbal.cz/media/kluby/8e207b30-7b68-44bb-ad08-bc25495dd094/8e207b30-7b68-44bb-ad08-bc25495dd094_crop.jpg","played":"12","wins":"2","draws":"3","losses":"7","score":"16:23","points":"9"},{"rank":"15","team":"Heล™manice","team_logo_url":"https://is1.fotbal.cz/media/kluby/c32dc305-6b78-41c7-8053-d8644eef96f1/c32dc305-6b78-41c7-8053-d8644eef96f1_crop.jpg","played":"12","wins":"1","draws":"5","losses":"6","score":"17:30","points":"8"},{"rank":"16","team":"FC Dolnรญ Beneลกov","team_logo_url":"https://is1.fotbal.cz/media/kluby/080e3ae1-2bc4-4d93-bea9-db26da768fa5/080e3ae1-2bc4-4d93-bea9-db26da768fa5_crop.jpg","played":"12","wins":"2","draws":"1","losses":"9","score":"16:35","points":"7"}]}},{"id":"7ae7e3d0-ab3c-4afe-af6d-4a26d74ea554","code":"C1A","name":"KALMAN TRADE Krajskรฝ pล™ebor starลกรญ dorost","team_count":"16","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/7ae7e3d0-ab3c-4afe-af6d-4a26d74ea554","table":{"overall":[{"rank":"1","team":"Hlubina","team_logo_url":"https://is1.fotbal.cz/media/kluby/da62c705-ca73-4561-9ea4-ab93e6afce88/da62c705-ca73-4561-9ea4-ab93e6afce88_crop.jpg","played":"12","wins":"11","draws":"0","losses":"1","score":"59:10","points":"33"},{"rank":"2","team":"Polanka nad Odrou","team_logo_url":"https://is1.fotbal.cz/media/kluby/31e53384-37d8-4755-bfdc-c8d168ffea24/31e53384-37d8-4755-bfdc-c8d168ffea24_crop.jpg","played":"12","wins":"9","draws":"2","losses":"1","score":"67:8","points":"29"},{"rank":"3","team":"MFK Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"11","wins":"7","draws":"3","losses":"1","score":"31:16","points":"24"},{"rank":"4","team":"MFK Slavoj Bruntรกl","team_logo_url":"https://is1.fotbal.cz/media/kluby/e7e5ee65-11f9-4edf-8724-1bab6043cadc/e7e5ee65-11f9-4edf-8724-1bab6043cadc_crop.jpg","played":"12","wins":"7","draws":"1","losses":"4","score":"40:22","points":"22"},{"rank":"5","team":"Frรฝdlant n. O.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"6","draws":"3","losses":"2","score":"40:21","points":"21"},{"rank":"6","team":"Rรฝmaล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/ce05c9f9-3b28-4ae6-9077-493f90d00ffc/ce05c9f9-3b28-4ae6-9077-493f90d00ffc_crop.jpg","played":"11","wins":"6","draws":"1","losses":"4","score":"40:23","points":"19"},{"rank":"7","team":"Kravaล™e","team_logo_url":"https://is1.fotbal.cz/media/kluby/377bf0aa-33e9-4987-ab42-3974ba588d6f/377bf0aa-33e9-4987-ab42-3974ba588d6f_crop.jpg","played":"12","wins":"5","draws":"2","losses":"5","score":"46:40","points":"17"},{"rank":"8","team":"Bruลกperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"5","draws":"2","losses":"4","score":"36:33","points":"17"},{"rank":"9","team":"Petล™kovice","team_logo_url":"https://is1.fotbal.cz/media/kluby/a579b8f7-4173-4af0-8039-c8c12052f280/a579b8f7-4173-4af0-8039-c8c12052f280_crop.jpg","played":"11","wins":"5","draws":"1","losses":"5","score":"22:19","points":"16"},{"rank":"10","team":"Frenลกtรกt p. R.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"5","draws":"1","losses":"6","score":"32:41","points":"16"},{"rank":"11","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"12","wins":"4","draws":"1","losses":"7","score":"43:37","points":"13"},{"rank":"12","team":"Bospor Bohumรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/e92c51a6-06b4-4341-91d1-f2fddc25fa59/e92c51a6-06b4-4341-91d1-f2fddc25fa59_crop.jpg","played":"12","wins":"3","draws":"3","losses":"6","score":"23:29","points":"12"},{"rank":"13","team":"FK H\u0026P Starรฉ Mฤ›sto","team_logo_url":"https://is1.fotbal.cz/media/kluby/ec3b8f7f-5764-4a4e-b37f-56dea70696cb/ec3b8f7f-5764-4a4e-b37f-56dea70696cb_crop.jpg","played":"11","wins":"3","draws":"1","losses":"7","score":"21:32","points":"10"},{"rank":"14","team":"Velkรก Polom","team_logo_url":"https://is1.fotbal.cz/media/kluby/d856cd6e-782e-4f88-9cd4-024e289ea8c9/d856cd6e-782e-4f88-9cd4-024e289ea8c9_crop.jpg","played":"11","wins":"3","draws":"0","losses":"8","score":"27:42","points":"9"},{"rank":"15","team":"Raduลˆ","team_logo_url":"https://is1.fotbal.cz/media/kluby/761fb25e-13e6-4792-8343-906d5a3cb572/761fb25e-13e6-4792-8343-906d5a3cb572_crop.jpg","played":"10","wins":"1","draws":"1","losses":"8","score":"18:65","points":"4"},{"rank":"16","team":"Hornรญ Suchรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/a6c7c347-eeb5-4f0e-b217-156f46a30091/a6c7c347-eeb5-4f0e-b217-156f46a30091_crop.jpg","played":"11","wins":"0","draws":"0","losses":"11","score":"6:113","points":"0"}]}},{"id":"dddb3982-7157-4bfe-b8a0-d3530eaa0a77","code":"D1A","name":"KALMAN TRADE Krajskรฝ pล™ebor mladลกรญ dorost","team_count":"16","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/dddb3982-7157-4bfe-b8a0-d3530eaa0a77","table":{"overall":[{"rank":"1","team":"Hlubina","team_logo_url":"https://is1.fotbal.cz/media/kluby/da62c705-ca73-4561-9ea4-ab93e6afce88/da62c705-ca73-4561-9ea4-ab93e6afce88_crop.jpg","played":"12","wins":"10","draws":"0","losses":"2","score":"76:16","points":"30"},{"rank":"2","team":"Polanka nad Odrou","team_logo_url":"https://is1.fotbal.cz/media/kluby/31e53384-37d8-4755-bfdc-c8d168ffea24/31e53384-37d8-4755-bfdc-c8d168ffea24_crop.jpg","played":"12","wins":"9","draws":"2","losses":"1","score":"72:16","points":"29"},{"rank":"3","team":"Petล™kovice","team_logo_url":"https://is1.fotbal.cz/media/kluby/a579b8f7-4173-4af0-8039-c8c12052f280/a579b8f7-4173-4af0-8039-c8c12052f280_crop.jpg","played":"12","wins":"9","draws":"0","losses":"3","score":"69:16","points":"27"},{"rank":"4","team":"MFK Slavoj Bruntรกl","team_logo_url":"https://is1.fotbal.cz/media/kluby/e7e5ee65-11f9-4edf-8724-1bab6043cadc/e7e5ee65-11f9-4edf-8724-1bab6043cadc_crop.jpg","played":"12","wins":"7","draws":"2","losses":"3","score":"52:21","points":"23"},{"rank":"5","team":"Kravaล™e","team_logo_url":"https://is1.fotbal.cz/media/kluby/377bf0aa-33e9-4987-ab42-3974ba588d6f/377bf0aa-33e9-4987-ab42-3974ba588d6f_crop.jpg","played":"12","wins":"7","draws":"2","losses":"3","score":"54:26","points":"23"},{"rank":"6","team":"Rรฝmaล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/ce05c9f9-3b28-4ae6-9077-493f90d00ffc/ce05c9f9-3b28-4ae6-9077-493f90d00ffc_crop.jpg","played":"11","wins":"7","draws":"1","losses":"3","score":"68:23","points":"22"},{"rank":"7","team":"MFK Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"11","wins":"6","draws":"3","losses":"2","score":"30:23","points":"21"},{"rank":"8","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"12","wins":"5","draws":"2","losses":"5","score":"43:25","points":"17"},{"rank":"9","team":"Bospor Bohumรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/e92c51a6-06b4-4341-91d1-f2fddc25fa59/e92c51a6-06b4-4341-91d1-f2fddc25fa59_crop.jpg","played":"12","wins":"5","draws":"2","losses":"5","score":"31:30","points":"17"},{"rank":"10","team":"Velkรก Polom","team_logo_url":"https://is1.fotbal.cz/media/kluby/d856cd6e-782e-4f88-9cd4-024e289ea8c9/d856cd6e-782e-4f88-9cd4-024e289ea8c9_crop.jpg","played":"12","wins":"5","draws":"1","losses":"6","score":"31:27","points":"16"},{"rank":"11","team":"Frenลกtรกt p. R.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"5","draws":"1","losses":"6","score":"31:29","points":"16"},{"rank":"12","team":"Frรฝdlant n. O.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"4","draws":"2","losses":"5","score":"22:18","points":"14"},{"rank":"13","team":"Bruลกperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"4","draws":"0","losses":"8","score":"28:34","points":"12"},{"rank":"14","team":"FK H\u0026P Starรฉ Mฤ›sto","team_logo_url":"https://is1.fotbal.cz/media/kluby/ec3b8f7f-5764-4a4e-b37f-56dea70696cb/ec3b8f7f-5764-4a4e-b37f-56dea70696cb_crop.jpg","played":"11","wins":"1","draws":"0","losses":"10","score":"12:51","points":"3"},{"rank":"15","team":"Hornรญ Suchรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/a6c7c347-eeb5-4f0e-b217-156f46a30091/a6c7c347-eeb5-4f0e-b217-156f46a30091_crop.jpg","played":"11","wins":"0","draws":"0","losses":"11","score":"1:131","points":"0"},{"rank":"16","team":"Raduลˆ","team_logo_url":"https://is1.fotbal.cz/media/kluby/761fb25e-13e6-4792-8343-906d5a3cb572/761fb25e-13e6-4792-8343-906d5a3cb572_crop.jpg","played":"11","wins":"0","draws":"0","losses":"11","score":"6:140","points":"0"}]}},{"id":"c90ace45-e2f0-4723-94c2-0689d9af5726","code":"E1S","name":"2.MSลฝL-U 15 sk. E","team_count":"12","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/c90ace45-e2f0-4723-94c2-0689d9af5726","table":{"overall":[{"rank":"1","team":"Hranice","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"10","draws":"2","losses":"0","score":"48:17","points":"32"},{"rank":"2","team":"Karvinรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/4cbe25e6-57f3-41c0-8d92-782b19b61731/4cbe25e6-57f3-41c0-8d92-782b19b61731_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"33:9","points":"27"},{"rank":"3","team":"Bรญlovec","team_logo_url":"https://is1.fotbal.cz/media/kluby/d31f4a41-85b9-4e58-bdee-63cb563ada5b/d31f4a41-85b9-4e58-bdee-63cb563ada5b_crop.jpg","played":"12","wins":"8","draws":"1","losses":"3","score":"53:35","points":"25"},{"rank":"4","team":"ล umperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"7","draws":"1","losses":"3","score":"37:23","points":"22"},{"rank":"5","team":"Poruba โ€“ Petล™vald","team_logo_url":"https://is1.fotbal.cz/media/kluby/9d930e92-92a5-45c4-83cf-2863a076f3b0/9d930e92-92a5-45c4-83cf-2863a076f3b0_crop.jpg","played":"10","wins":"5","draws":"1","losses":"4","score":"31:23","points":"16"},{"rank":"6","team":"Novรฝ Jiฤรญn","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"4","draws":"2","losses":"5","score":"33:35","points":"14"},{"rank":"7","team":"Valaลกskรฉ Meziล™รญฤรญ","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"4","draws":"2","losses":"6","score":"23:33","points":"14"},{"rank":"8","team":"Tล˜INEC","team_logo_url":"https://is1.fotbal.cz/media/kluby/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1_crop.jpg","played":"12","wins":"4","draws":"1","losses":"7","score":"27:34","points":"13"},{"rank":"9","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"11","wins":"4","draws":"1","losses":"6","score":"27:41","points":"13"},{"rank":"10","team":"Hluฤรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/850d6d5c-5812-48d6-93ba-f866fabfada3/850d6d5c-5812-48d6-93ba-f866fabfada3_crop.jpg","played":"12","wins":"3","draws":"1","losses":"8","score":"22:40","points":"10"},{"rank":"11","team":"Uniฤov","team_logo_url":"https://is1.fotbal.cz/media/kluby/813771b6-66f0-450c-a551-cc1a0cf4ce6d/813771b6-66f0-450c-a551-cc1a0cf4ce6d_crop.jpg","played":"12","wins":"2","draws":"2","losses":"8","score":"25:39","points":"8"},{"rank":"12","team":"Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"11","wins":"1","draws":"0","losses":"10","score":"17:47","points":"3"}]}},{"id":"b9ac2329-2dc1-4c01-9acb-2b0dea7b03d6","code":"E2S","name":"2.MSลฝL-U 14 sk. E","team_count":"12","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/b9ac2329-2dc1-4c01-9acb-2b0dea7b03d6","table":{"overall":[{"rank":"1","team":"Uniฤov","team_logo_url":"https://is1.fotbal.cz/media/kluby/813771b6-66f0-450c-a551-cc1a0cf4ce6d/813771b6-66f0-450c-a551-cc1a0cf4ce6d_crop.jpg","played":"12","wins":"11","draws":"0","losses":"1","score":"122:17","points":"33"},{"rank":"2","team":"Karvinรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/4cbe25e6-57f3-41c0-8d92-782b19b61731/4cbe25e6-57f3-41c0-8d92-782b19b61731_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"61:10","points":"27"},{"rank":"3","team":"ล umperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"8","draws":"0","losses":"3","score":"53:29","points":"24"},{"rank":"4","team":"Hranice","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"7","draws":"1","losses":"4","score":"69:34","points":"22"},{"rank":"5","team":"Tล˜INEC","team_logo_url":"https://is1.fotbal.cz/media/kluby/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1_crop.jpg","played":"12","wins":"6","draws":"1","losses":"5","score":"55:42","points":"19"},{"rank":"6","team":"Novรฝ Jiฤรญn","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"5","draws":"1","losses":"5","score":"54:37","points":"16"},{"rank":"7","team":"Bรญlovec","team_logo_url":"https://is1.fotbal.cz/media/kluby/d31f4a41-85b9-4e58-bdee-63cb563ada5b/d31f4a41-85b9-4e58-bdee-63cb563ada5b_crop.jpg","played":"12","wins":"4","draws":"4","losses":"4","score":"54:37","points":"16"},{"rank":"8","team":"Hluฤรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/850d6d5c-5812-48d6-93ba-f866fabfada3/850d6d5c-5812-48d6-93ba-f866fabfada3_crop.jpg","played":"12","wins":"3","draws":"4","losses":"5","score":"31:32","points":"13"},{"rank":"9","team":"Poruba โ€“ Petล™vald","team_logo_url":"https://is1.fotbal.cz/media/kluby/9d930e92-92a5-45c4-83cf-2863a076f3b0/9d930e92-92a5-45c4-83cf-2863a076f3b0_crop.jpg","played":"9","wins":"3","draws":"2","losses":"4","score":"26:29","points":"11"},{"rank":"10","team":"Valaลกskรฉ Meziล™รญฤรญ","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"3","draws":"2","losses":"7","score":"34:51","points":"11"},{"rank":"11","team":"Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"12","wins":"1","draws":"1","losses":"10","score":"8:137","points":"4"},{"rank":"12","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"11","wins":"0","draws":"0","losses":"11","score":"12:124","points":"0"}]}},{"id":"ae12df84-eaba-4643-ac15-e0d9888f5a87","code":"F1S","name":"1. liga SpSM-U 13 SEVER","team_count":"18","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/ae12df84-eaba-4643-ac15-e0d9888f5a87","table":{"overall":[{"rank":"1","team":"Banรญk Ostrava","team_logo_url":"https://is1.fotbal.cz/media/kluby/e68e68c6-c263-43ce-a247-20ee1d323b55/e68e68c6-c263-43ce-a247-20ee1d323b55_crop.jpg","played":"10","wins":"10","draws":"0","losses":"0","score":"142:18","points":"30"},{"rank":"2","team":"Opava","team_logo_url":"https://is1.fotbal.cz/media/kluby/645aad1b-9a46-4351-90b6-6dfb989453dd/645aad1b-9a46-4351-90b6-6dfb989453dd_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"110:19","points":"27"},{"rank":"3","team":"Karvinรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/4cbe25e6-57f3-41c0-8d92-782b19b61731/4cbe25e6-57f3-41c0-8d92-782b19b61731_crop.jpg","played":"10","wins":"8","draws":"0","losses":"2","score":"135:36","points":"24"},{"rank":"4","team":"VรTKOVICE","team_logo_url":"https://is1.fotbal.cz/media/kluby/a3ff17d6-0888-47e7-9dee-0a98ec8734d0/a3ff17d6-0888-47e7-9dee-0a98ec8734d0_crop.jpg","played":"10","wins":"7","draws":"0","losses":"3","score":"83:29","points":"21"},{"rank":"5","team":"Valaลกskรฉ Meziล™รญฤรญ","team_logo_url":"/dist/img/logo-club-empty.svg","played":"10","wins":"7","draws":"0","losses":"3","score":"70:36","points":"21"},{"rank":"6","team":"Frรฝdek-Mรญstek","team_logo_url":"https://is1.fotbal.cz/media/kluby/5215c1c1-a1b7-4a4d-ba40-eb0d36b19a61/5215c1c1-a1b7-4a4d-ba40-eb0d36b19a61_crop.jpg","played":"9","wins":"6","draws":"1","losses":"2","score":"72:37","points":"19"},{"rank":"7","team":"Uniฤov","team_logo_url":"https://is1.fotbal.cz/media/kluby/813771b6-66f0-450c-a551-cc1a0cf4ce6d/813771b6-66f0-450c-a551-cc1a0cf4ce6d_crop.jpg","played":"10","wins":"6","draws":"1","losses":"3","score":"75:61","points":"19"},{"rank":"8","team":"Poruba โ€“ Petล™vald","team_logo_url":"https://is1.fotbal.cz/media/kluby/9d930e92-92a5-45c4-83cf-2863a076f3b0/9d930e92-92a5-45c4-83cf-2863a076f3b0_crop.jpg","played":"10","wins":"5","draws":"1","losses":"4","score":"69:52","points":"16"},{"rank":"9","team":"ล umperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"9","wins":"5","draws":"0","losses":"4","score":"78:67","points":"15"},{"rank":"10","team":"Hluฤรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/850d6d5c-5812-48d6-93ba-f866fabfada3/850d6d5c-5812-48d6-93ba-f866fabfada3_crop.jpg","played":"10","wins":"4","draws":"1","losses":"5","score":"77:46","points":"13"},{"rank":"11","team":"Pล™erov","team_logo_url":"https://is1.fotbal.cz/media/kluby/1fd1a047-4cf5-47cc-a712-915928cba6fb/1fd1a047-4cf5-47cc-a712-915928cba6fb_crop.jpg","played":"10","wins":"4","draws":"1","losses":"5","score":"34:57","points":"13"},{"rank":"12","team":"Hranice","team_logo_url":"/dist/img/logo-club-empty.svg","played":"9","wins":"4","draws":"0","losses":"5","score":"44:62","points":"12"},{"rank":"13","team":"HFK Olomouc","team_logo_url":"https://is1.fotbal.cz/media/kluby/1fbad935-da41-4567-83dc-397ec04d64d3/1fbad935-da41-4567-83dc-397ec04d64d3_crop.jpg","played":"10","wins":"2","draws":"3","losses":"5","score":"45:66","points":"9"},{"rank":"14","team":"Tล˜INEC","team_logo_url":"https://is1.fotbal.cz/media/kluby/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1_crop.jpg","played":"9","wins":"2","draws":"1","losses":"6","score":"39:52","points":"7"},{"rank":"15","team":"Bรญlovec","team_logo_url":"https://is1.fotbal.cz/media/kluby/d31f4a41-85b9-4e58-bdee-63cb563ada5b/d31f4a41-85b9-4e58-bdee-63cb563ada5b_crop.jpg","played":"10","wins":"2","draws":"1","losses":"7","score":"38:70","points":"7"},{"rank":"16","team":"Novรฝ Jiฤรญn","team_logo_url":"/dist/img/logo-club-empty.svg","played":"10","wins":"2","draws":"0","losses":"8","score":"19:92","points":"6"},{"rank":"17","team":"Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"10","wins":"0","draws":"0","losses":"10","score":"13:152","points":"0"},{"rank":"18","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"10","wins":"0","draws":"0","losses":"10","score":"22:213","points":"0"}]}},{"id":"3f37901c-5c36-4a13-8a84-244f64f1ea1a","code":"F2S","name":"1. liga SpSM-U 12 SEVER","team_count":"18","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/3f37901c-5c36-4a13-8a84-244f64f1ea1a","table":{"overall":[{"rank":"1","team":"Hluฤรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/850d6d5c-5812-48d6-93ba-f866fabfada3/850d6d5c-5812-48d6-93ba-f866fabfada3_crop.jpg","played":"10","wins":"10","draws":"0","losses":"0","score":"104:11","points":"30"},{"rank":"2","team":"Banรญk Ostrava","team_logo_url":"https://is1.fotbal.cz/media/kluby/e68e68c6-c263-43ce-a247-20ee1d323b55/e68e68c6-c263-43ce-a247-20ee1d323b55_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"121:15","points":"27"},{"rank":"3","team":"Karvinรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/4cbe25e6-57f3-41c0-8d92-782b19b61731/4cbe25e6-57f3-41c0-8d92-782b19b61731_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"120:25","points":"27"},{"rank":"4","team":"VรTKOVICE","team_logo_url":"https://is1.fotbal.cz/media/kluby/a3ff17d6-0888-47e7-9dee-0a98ec8734d0/a3ff17d6-0888-47e7-9dee-0a98ec8734d0_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"52:13","points":"27"},{"rank":"5","team":"Opava","team_logo_url":"https://is1.fotbal.cz/media/kluby/645aad1b-9a46-4351-90b6-6dfb989453dd/645aad1b-9a46-4351-90b6-6dfb989453dd_crop.jpg","played":"10","wins":"8","draws":"0","losses":"2","score":"109:21","points":"24"},{"rank":"6","team":"HFK Olomouc","team_logo_url":"https://is1.fotbal.cz/media/kluby/1fbad935-da41-4567-83dc-397ec04d64d3/1fbad935-da41-4567-83dc-397ec04d64d3_crop.jpg","played":"10","wins":"6","draws":"2","losses":"2","score":"85:18","points":"20"},{"rank":"7","team":"Frรฝdek-Mรญstek","team_logo_url":"https://is1.fotbal.cz/media/kluby/5215c1c1-a1b7-4a4d-ba40-eb0d36b19a61/5215c1c1-a1b7-4a4d-ba40-eb0d36b19a61_crop.jpg","played":"9","wins":"5","draws":"2","losses":"2","score":"56:22","points":"17"},{"rank":"8","team":"Hranice","team_logo_url":"/dist/img/logo-club-empty.svg","played":"9","wins":"4","draws":"3","losses":"2","score":"62:38","points":"15"},{"rank":"9","team":"Poruba โ€“ Petล™vald","team_logo_url":"https://is1.fotbal.cz/media/kluby/9d930e92-92a5-45c4-83cf-2863a076f3b0/9d930e92-92a5-45c4-83cf-2863a076f3b0_crop.jpg","played":"10","wins":"4","draws":"2","losses":"4","score":"56:35","points":"14"},{"rank":"10","team":"Tล˜INEC","team_logo_url":"https://is1.fotbal.cz/media/kluby/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1_crop.jpg","played":"9","wins":"4","draws":"1","losses":"4","score":"40:21","points":"13"},{"rank":"11","team":"Pล™erov","team_logo_url":"https://is1.fotbal.cz/media/kluby/1fd1a047-4cf5-47cc-a712-915928cba6fb/1fd1a047-4cf5-47cc-a712-915928cba6fb_crop.jpg","played":"10","wins":"3","draws":"0","losses":"7","score":"30:58","points":"9"},{"rank":"12","team":"Novรฝ Jiฤรญn","team_logo_url":"/dist/img/logo-club-empty.svg","played":"10","wins":"3","draws":"0","losses":"7","score":"30:78","points":"9"},{"rank":"13","team":"Valaลกskรฉ Meziล™รญฤรญ","team_logo_url":"/dist/img/logo-club-empty.svg","played":"10","wins":"2","draws":"1","losses":"7","score":"45:44","points":"7"},{"rank":"14","team":"Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"10","wins":"2","draws":"1","losses":"7","score":"18:72","points":"7"},{"rank":"15","team":"ล umperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"9","wins":"2","draws":"0","losses":"7","score":"40:95","points":"6"},{"rank":"16","team":"Bรญlovec","team_logo_url":"https://is1.fotbal.cz/media/kluby/d31f4a41-85b9-4e58-bdee-63cb563ada5b/d31f4a41-85b9-4e58-bdee-63cb563ada5b_crop.jpg","played":"10","wins":"2","draws":"0","losses":"8","score":"25:81","points":"6"},{"rank":"17","team":"Uniฤov","team_logo_url":"https://is1.fotbal.cz/media/kluby/813771b6-66f0-450c-a551-cc1a0cf4ce6d/813771b6-66f0-450c-a551-cc1a0cf4ce6d_crop.jpg","played":"10","wins":"0","draws":"0","losses":"10","score":"8:106","points":"0"},{"rank":"18","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"10","wins":"0","draws":"0","losses":"10","score":"4:252","points":"0"}]}},{"id":"7849d6ca-3c61-4e2b-ba4f-e875bf11fd95","code":"G1D","name":"Starลกรญ pล™รญpravka 1+5 sk.D","team_count":"9","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/7849d6ca-3c61-4e2b-ba4f-e875bf11fd95","table":{"overall":null}},{"id":"ba50c319-414d-478f-9719-76d59ddfb87c","code":"H1A","name":"Okresnรญ pล™ebor mladลกรญ pล™รญpravky (4+1)","team_count":"10","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/ba50c319-414d-478f-9719-76d59ddfb87c","table":{"overall":null}},{"id":"7580b803-665d-4808-8cec-c916dcb22343","code":"H1C","name":"Mladลกรญ pล™รญpravka 1+4 sk.C","team_count":"10","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/7580b803-665d-4808-8cec-c916dcb22343","table":{"overall":null}},{"id":"eccb91ba-cbce-46e1-af51-449bdbd42f8f","code":"U1E","name":"PC U1E U-10 ล umperk","team_count":"6","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/eccb91ba-cbce-46e1-af51-449bdbd42f8f","table":{"overall":[{"rank":"1","team":"FK WAREX Jesenรญk z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/03dd330b-d469-4a65-99f1-29b7ece7c2ed/03dd330b-d469-4a65-99f1-29b7ece7c2ed_crop.jpg","played":"5","wins":"5","draws":"0","losses":"0","score":"29:5","points":"15"},{"rank":"2","team":"SK Uniฤov, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/813771b6-66f0-450c-a551-cc1a0cf4ce6d/813771b6-66f0-450c-a551-cc1a0cf4ce6d_crop.jpg","played":"5","wins":"4","draws":"0","losses":"1","score":"35:6","points":"12"},{"rank":"3","team":"MFK Slavoj Bruntรกl, z. s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/e7e5ee65-11f9-4edf-8724-1bab6043cadc/e7e5ee65-11f9-4edf-8724-1bab6043cadc_crop.jpg","played":"5","wins":"2","draws":"1","losses":"2","score":"17:21","points":"7"},{"rank":"4","team":"FK Kofola Krnov, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"5","wins":"2","draws":"0","losses":"3","score":"10:25","points":"6"},{"rank":"5","team":"FK Prumrent ล umperk z.s.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"5","wins":"1","draws":"1","losses":"3","score":"9:25","points":"4"},{"rank":"6","team":"FOTBALOVร KLUB ล TERNBERK, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/e520d185-109f-4bc6-bccc-6312654aac9b/e520d185-109f-4bc6-bccc-6312654aac9b_crop.jpg","played":"5","wins":"0","draws":"0","losses":"5","score":"6:24","points":"0"}]}},{"id":"b84c678f-c33c-4622-97ad-6c3e8827094b","code":"V1C","name":"PC V1C U-8 Novรฝ Jiฤรญn","team_count":"6","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/b84c678f-c33c-4622-97ad-6c3e8827094b","table":{"overall":null}},{"id":"6b40d9ca-da87-46ba-8e92-28522adda322","code":"V5B","name":"PC V5B U-9 Hluฤรญn","team_count":"6","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/6b40d9ca-da87-46ba-8e92-28522adda322","table":{"overall":[{"rank":"1","team":"Sportovnรญ klub FC Hluฤรญn, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/850d6d5c-5812-48d6-93ba-f866fabfada3/850d6d5c-5812-48d6-93ba-f866fabfada3_crop.jpg","played":"5","wins":"5","draws":"0","losses":"0","score":"58:6","points":"15"},{"rank":"2","team":"Fotbalovรฝ klub SK Polanka nad Odrou z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/31e53384-37d8-4755-bfdc-c8d168ffea24/31e53384-37d8-4755-bfdc-c8d168ffea24_crop.jpg","played":"5","wins":"4","draws":"0","losses":"1","score":"45:17","points":"12"},{"rank":"3","team":"1. FC Poruba โ€“ Petล™vald na Moravฤ›, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/9d930e92-92a5-45c4-83cf-2863a076f3b0/9d930e92-92a5-45c4-83cf-2863a076f3b0_crop.jpg","played":"5","wins":"3","draws":"0","losses":"2","score":"41:15","points":"9"},{"rank":"4","team":"ล kolnรญ sportovnรญ klub Bรญlovec,z.s.","team_logo_url":"https://www.fotbal.cz/dist/img/logo-club-empty.svg","played":"5","wins":"2","draws":"0","losses":"3","score":"10:32","points":"6"},{"rank":"5","team":"FK Kofola Krnov, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"5","wins":"1","draws":"0","losses":"4","score":"12:34","points":"3"},{"rank":"6","team":"Tฤ›lovรฝchovnรก jednota Sokol Kozmice, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/fea7c7cc-2a4e-458c-a979-5789aafa09c0/fea7c7cc-2a4e-458c-a979-5789aafa09c0_crop.jpg","played":"5","wins":"0","draws":"0","losses":"5","score":"1:63","points":"0"}]}}]} +{"name":"Fotbalovรฝ klub Krnov","club_id":"7eacd9f0-bfa0-4928-a9b6-936140168f58","club_type":"football","club_internal_id":"8010211","logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","address":"8010211","category":"ID klubu","competitions":[{"id":"e3127865-a109-45cd-9048-3e6429e2eb11","code":"A1A","name":"SATUM 5. liga muลพลฏ","team_count":"16","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/e3127865-a109-45cd-9048-3e6429e2eb11","table":{"overall":[{"rank":"1","team":"Kravaล™e","team_logo_url":"https://is1.fotbal.cz/media/kluby/377bf0aa-33e9-4987-ab42-3974ba588d6f/377bf0aa-33e9-4987-ab42-3974ba588d6f_crop.jpg","played":"12","wins":"9","draws":"1","losses":"2","score":"37:12","points":"28"},{"rank":"2","team":"Hรกj ve Slezsku","team_logo_url":"https://is1.fotbal.cz/media/kluby/2578b9ff-938e-461b-9090-d9697eb9371f/2578b9ff-938e-461b-9090-d9697eb9371f_crop.jpg","played":"12","wins":"7","draws":"3","losses":"2","score":"27:13","points":"24"},{"rank":"3","team":"Jakubฤovice","team_logo_url":"https://is1.fotbal.cz/media/kluby/4e0b5f2f-4a27-444c-bf77-e3725b898086/4e0b5f2f-4a27-444c-bf77-e3725b898086_crop.jpg","played":"12","wins":"7","draws":"0","losses":"5","score":"18:22","points":"21"},{"rank":"4","team":"FK H\u0026P Starรฉ Mฤ›sto","team_logo_url":"https://is1.fotbal.cz/media/kluby/ec3b8f7f-5764-4a4e-b37f-56dea70696cb/ec3b8f7f-5764-4a4e-b37f-56dea70696cb_crop.jpg","played":"12","wins":"6","draws":"2","losses":"4","score":"22:20","points":"20"},{"rank":"5","team":"Bruลกperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"6","draws":"1","losses":"5","score":"29:27","points":"19"},{"rank":"6","team":"Banรญk Albrechtice","team_logo_url":"https://is1.fotbal.cz/media/kluby/887a67d6-c607-4e80-91be-d1aff9406698/887a67d6-c607-4e80-91be-d1aff9406698_crop.jpg","played":"11","wins":"6","draws":"1","losses":"4","score":"24:23","points":"19"},{"rank":"7","team":"FK Mฤ›sto Albrechtice","team_logo_url":"https://is1.fotbal.cz/media/kluby/750b8d81-542b-485c-8a18-fc0c494ff411/750b8d81-542b-485c-8a18-fc0c494ff411_crop.jpg","played":"12","wins":"5","draws":"4","losses":"3","score":"19:18","points":"19"},{"rank":"8","team":"MFK Vรญtkovice B","team_logo_url":"https://is1.fotbal.cz/media/kluby/af880d06-6ffc-493a-94bb-90e2bdab7119/af880d06-6ffc-493a-94bb-90e2bdab7119_crop.jpg","played":"11","wins":"5","draws":"3","losses":"3","score":"26:20","points":"18"},{"rank":"9","team":"Slavia Orlovรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/6ea06d3a-a7bf-4ee2-99ff-1ba1edc62c8f/6ea06d3a-a7bf-4ee2-99ff-1ba1edc62c8f_crop.jpg","played":"11","wins":"5","draws":"2","losses":"4","score":"24:23","points":"17"},{"rank":"10","team":"FC Vล™esina","team_logo_url":"https://is1.fotbal.cz/media/kluby/dc05f9c5-a436-4fce-b9cb-06c7ff85d019/dc05f9c5-a436-4fce-b9cb-06c7ff85d019_crop.jpg","played":"12","wins":"5","draws":"1","losses":"6","score":"26:25","points":"16"},{"rank":"11","team":"FK Kofola Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"11","wins":"5","draws":"1","losses":"5","score":"17:21","points":"16"},{"rank":"12","team":"Kobeล™ice","team_logo_url":"https://is1.fotbal.cz/media/kluby/55f96307-c916-4801-948b-bc84f46f21bd/55f96307-c916-4801-948b-bc84f46f21bd_crop.jpg","played":"12","wins":"5","draws":"0","losses":"7","score":"23:19","points":"15"},{"rank":"13","team":"SK BESKYD Frenลกtรกt p. R.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"3","draws":"2","losses":"7","score":"16:26","points":"11"},{"rank":"14","team":"Darkoviฤky","team_logo_url":"https://is1.fotbal.cz/media/kluby/8e207b30-7b68-44bb-ad08-bc25495dd094/8e207b30-7b68-44bb-ad08-bc25495dd094_crop.jpg","played":"12","wins":"2","draws":"3","losses":"7","score":"16:23","points":"9"},{"rank":"15","team":"Heล™manice","team_logo_url":"https://is1.fotbal.cz/media/kluby/c32dc305-6b78-41c7-8053-d8644eef96f1/c32dc305-6b78-41c7-8053-d8644eef96f1_crop.jpg","played":"12","wins":"1","draws":"5","losses":"6","score":"17:30","points":"8"},{"rank":"16","team":"FC Dolnรญ Beneลกov","team_logo_url":"https://is1.fotbal.cz/media/kluby/080e3ae1-2bc4-4d93-bea9-db26da768fa5/080e3ae1-2bc4-4d93-bea9-db26da768fa5_crop.jpg","played":"12","wins":"2","draws":"1","losses":"9","score":"16:35","points":"7"}]}},{"id":"7ae7e3d0-ab3c-4afe-af6d-4a26d74ea554","code":"C1A","name":"KALMAN TRADE Krajskรฝ pล™ebor starลกรญ dorost","team_count":"16","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/7ae7e3d0-ab3c-4afe-af6d-4a26d74ea554","table":{"overall":[{"rank":"1","team":"Hlubina","team_logo_url":"https://is1.fotbal.cz/media/kluby/da62c705-ca73-4561-9ea4-ab93e6afce88/da62c705-ca73-4561-9ea4-ab93e6afce88_crop.jpg","played":"12","wins":"11","draws":"0","losses":"1","score":"59:10","points":"33"},{"rank":"2","team":"Polanka nad Odrou","team_logo_url":"https://is1.fotbal.cz/media/kluby/31e53384-37d8-4755-bfdc-c8d168ffea24/31e53384-37d8-4755-bfdc-c8d168ffea24_crop.jpg","played":"12","wins":"9","draws":"2","losses":"1","score":"67:8","points":"29"},{"rank":"3","team":"MFK Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"11","wins":"7","draws":"3","losses":"1","score":"31:16","points":"24"},{"rank":"4","team":"MFK Slavoj Bruntรกl","team_logo_url":"https://is1.fotbal.cz/media/kluby/e7e5ee65-11f9-4edf-8724-1bab6043cadc/e7e5ee65-11f9-4edf-8724-1bab6043cadc_crop.jpg","played":"12","wins":"7","draws":"1","losses":"4","score":"40:22","points":"22"},{"rank":"5","team":"Frรฝdlant n. O.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"6","draws":"3","losses":"2","score":"40:21","points":"21"},{"rank":"6","team":"Rรฝmaล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/ce05c9f9-3b28-4ae6-9077-493f90d00ffc/ce05c9f9-3b28-4ae6-9077-493f90d00ffc_crop.jpg","played":"11","wins":"6","draws":"1","losses":"4","score":"40:23","points":"19"},{"rank":"7","team":"Kravaล™e","team_logo_url":"https://is1.fotbal.cz/media/kluby/377bf0aa-33e9-4987-ab42-3974ba588d6f/377bf0aa-33e9-4987-ab42-3974ba588d6f_crop.jpg","played":"12","wins":"5","draws":"2","losses":"5","score":"46:40","points":"17"},{"rank":"8","team":"Bruลกperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"5","draws":"2","losses":"4","score":"36:33","points":"17"},{"rank":"9","team":"Petล™kovice","team_logo_url":"https://is1.fotbal.cz/media/kluby/a579b8f7-4173-4af0-8039-c8c12052f280/a579b8f7-4173-4af0-8039-c8c12052f280_crop.jpg","played":"11","wins":"5","draws":"1","losses":"5","score":"22:19","points":"16"},{"rank":"10","team":"Frenลกtรกt p. R.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"5","draws":"1","losses":"6","score":"32:41","points":"16"},{"rank":"11","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"12","wins":"4","draws":"1","losses":"7","score":"43:37","points":"13"},{"rank":"12","team":"Bospor Bohumรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/e92c51a6-06b4-4341-91d1-f2fddc25fa59/e92c51a6-06b4-4341-91d1-f2fddc25fa59_crop.jpg","played":"12","wins":"3","draws":"3","losses":"6","score":"23:29","points":"12"},{"rank":"13","team":"FK H\u0026P Starรฉ Mฤ›sto","team_logo_url":"https://is1.fotbal.cz/media/kluby/ec3b8f7f-5764-4a4e-b37f-56dea70696cb/ec3b8f7f-5764-4a4e-b37f-56dea70696cb_crop.jpg","played":"11","wins":"3","draws":"1","losses":"7","score":"21:32","points":"10"},{"rank":"14","team":"Velkรก Polom","team_logo_url":"https://is1.fotbal.cz/media/kluby/d856cd6e-782e-4f88-9cd4-024e289ea8c9/d856cd6e-782e-4f88-9cd4-024e289ea8c9_crop.jpg","played":"11","wins":"3","draws":"0","losses":"8","score":"27:42","points":"9"},{"rank":"15","team":"Raduลˆ","team_logo_url":"https://is1.fotbal.cz/media/kluby/761fb25e-13e6-4792-8343-906d5a3cb572/761fb25e-13e6-4792-8343-906d5a3cb572_crop.jpg","played":"10","wins":"1","draws":"1","losses":"8","score":"18:65","points":"4"},{"rank":"16","team":"Hornรญ Suchรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/a6c7c347-eeb5-4f0e-b217-156f46a30091/a6c7c347-eeb5-4f0e-b217-156f46a30091_crop.jpg","played":"11","wins":"0","draws":"0","losses":"11","score":"6:113","points":"0"}]}},{"id":"dddb3982-7157-4bfe-b8a0-d3530eaa0a77","code":"D1A","name":"KALMAN TRADE Krajskรฝ pล™ebor mladลกรญ dorost","team_count":"16","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/dddb3982-7157-4bfe-b8a0-d3530eaa0a77","table":{"overall":[{"rank":"1","team":"Hlubina","team_logo_url":"https://is1.fotbal.cz/media/kluby/da62c705-ca73-4561-9ea4-ab93e6afce88/da62c705-ca73-4561-9ea4-ab93e6afce88_crop.jpg","played":"12","wins":"10","draws":"0","losses":"2","score":"76:16","points":"30"},{"rank":"2","team":"Polanka nad Odrou","team_logo_url":"https://is1.fotbal.cz/media/kluby/31e53384-37d8-4755-bfdc-c8d168ffea24/31e53384-37d8-4755-bfdc-c8d168ffea24_crop.jpg","played":"12","wins":"9","draws":"2","losses":"1","score":"72:16","points":"29"},{"rank":"3","team":"Petล™kovice","team_logo_url":"https://is1.fotbal.cz/media/kluby/a579b8f7-4173-4af0-8039-c8c12052f280/a579b8f7-4173-4af0-8039-c8c12052f280_crop.jpg","played":"12","wins":"9","draws":"0","losses":"3","score":"69:16","points":"27"},{"rank":"4","team":"MFK Slavoj Bruntรกl","team_logo_url":"https://is1.fotbal.cz/media/kluby/e7e5ee65-11f9-4edf-8724-1bab6043cadc/e7e5ee65-11f9-4edf-8724-1bab6043cadc_crop.jpg","played":"12","wins":"7","draws":"2","losses":"3","score":"52:21","points":"23"},{"rank":"5","team":"Kravaล™e","team_logo_url":"https://is1.fotbal.cz/media/kluby/377bf0aa-33e9-4987-ab42-3974ba588d6f/377bf0aa-33e9-4987-ab42-3974ba588d6f_crop.jpg","played":"12","wins":"7","draws":"2","losses":"3","score":"54:26","points":"23"},{"rank":"6","team":"Rรฝmaล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/ce05c9f9-3b28-4ae6-9077-493f90d00ffc/ce05c9f9-3b28-4ae6-9077-493f90d00ffc_crop.jpg","played":"11","wins":"7","draws":"1","losses":"3","score":"68:23","points":"22"},{"rank":"7","team":"MFK Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"11","wins":"6","draws":"3","losses":"2","score":"30:23","points":"21"},{"rank":"8","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"12","wins":"5","draws":"2","losses":"5","score":"43:25","points":"17"},{"rank":"9","team":"Bospor Bohumรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/e92c51a6-06b4-4341-91d1-f2fddc25fa59/e92c51a6-06b4-4341-91d1-f2fddc25fa59_crop.jpg","played":"12","wins":"5","draws":"2","losses":"5","score":"31:30","points":"17"},{"rank":"10","team":"Velkรก Polom","team_logo_url":"https://is1.fotbal.cz/media/kluby/d856cd6e-782e-4f88-9cd4-024e289ea8c9/d856cd6e-782e-4f88-9cd4-024e289ea8c9_crop.jpg","played":"12","wins":"5","draws":"1","losses":"6","score":"31:27","points":"16"},{"rank":"11","team":"Frenลกtรกt p. R.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"5","draws":"1","losses":"6","score":"31:29","points":"16"},{"rank":"12","team":"Frรฝdlant n. O.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"4","draws":"2","losses":"5","score":"22:18","points":"14"},{"rank":"13","team":"Bruลกperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"4","draws":"0","losses":"8","score":"28:34","points":"12"},{"rank":"14","team":"FK H\u0026P Starรฉ Mฤ›sto","team_logo_url":"https://is1.fotbal.cz/media/kluby/ec3b8f7f-5764-4a4e-b37f-56dea70696cb/ec3b8f7f-5764-4a4e-b37f-56dea70696cb_crop.jpg","played":"11","wins":"1","draws":"0","losses":"10","score":"12:51","points":"3"},{"rank":"15","team":"Hornรญ Suchรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/a6c7c347-eeb5-4f0e-b217-156f46a30091/a6c7c347-eeb5-4f0e-b217-156f46a30091_crop.jpg","played":"11","wins":"0","draws":"0","losses":"11","score":"1:131","points":"0"},{"rank":"16","team":"Raduลˆ","team_logo_url":"https://is1.fotbal.cz/media/kluby/761fb25e-13e6-4792-8343-906d5a3cb572/761fb25e-13e6-4792-8343-906d5a3cb572_crop.jpg","played":"11","wins":"0","draws":"0","losses":"11","score":"6:140","points":"0"}]}},{"id":"c90ace45-e2f0-4723-94c2-0689d9af5726","code":"E1S","name":"2.MSลฝL-U 15 sk. E","team_count":"12","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/c90ace45-e2f0-4723-94c2-0689d9af5726","table":{"overall":[{"rank":"1","team":"Hranice","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"10","draws":"2","losses":"0","score":"48:17","points":"32"},{"rank":"2","team":"Karvinรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/4cbe25e6-57f3-41c0-8d92-782b19b61731/4cbe25e6-57f3-41c0-8d92-782b19b61731_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"33:9","points":"27"},{"rank":"3","team":"Bรญlovec","team_logo_url":"https://is1.fotbal.cz/media/kluby/d31f4a41-85b9-4e58-bdee-63cb563ada5b/d31f4a41-85b9-4e58-bdee-63cb563ada5b_crop.jpg","played":"12","wins":"8","draws":"1","losses":"3","score":"53:35","points":"25"},{"rank":"4","team":"ล umperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"7","draws":"1","losses":"3","score":"37:23","points":"22"},{"rank":"5","team":"Poruba โ€“ Petล™vald","team_logo_url":"https://is1.fotbal.cz/media/kluby/9d930e92-92a5-45c4-83cf-2863a076f3b0/9d930e92-92a5-45c4-83cf-2863a076f3b0_crop.jpg","played":"10","wins":"5","draws":"1","losses":"4","score":"31:23","points":"16"},{"rank":"6","team":"Novรฝ Jiฤรญn","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"4","draws":"2","losses":"5","score":"33:35","points":"14"},{"rank":"7","team":"Valaลกskรฉ Meziล™รญฤรญ","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"4","draws":"2","losses":"6","score":"23:33","points":"14"},{"rank":"8","team":"Tล˜INEC","team_logo_url":"https://is1.fotbal.cz/media/kluby/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1_crop.jpg","played":"12","wins":"4","draws":"1","losses":"7","score":"27:34","points":"13"},{"rank":"9","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"11","wins":"4","draws":"1","losses":"6","score":"27:41","points":"13"},{"rank":"10","team":"Hluฤรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/850d6d5c-5812-48d6-93ba-f866fabfada3/850d6d5c-5812-48d6-93ba-f866fabfada3_crop.jpg","played":"12","wins":"3","draws":"1","losses":"8","score":"22:40","points":"10"},{"rank":"11","team":"Uniฤov","team_logo_url":"https://is1.fotbal.cz/media/kluby/813771b6-66f0-450c-a551-cc1a0cf4ce6d/813771b6-66f0-450c-a551-cc1a0cf4ce6d_crop.jpg","played":"12","wins":"2","draws":"2","losses":"8","score":"25:39","points":"8"},{"rank":"12","team":"Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"11","wins":"1","draws":"0","losses":"10","score":"17:47","points":"3"}]}},{"id":"b9ac2329-2dc1-4c01-9acb-2b0dea7b03d6","code":"E2S","name":"2.MSลฝL-U 14 sk. E","team_count":"12","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/b9ac2329-2dc1-4c01-9acb-2b0dea7b03d6","table":{"overall":[{"rank":"1","team":"Uniฤov","team_logo_url":"https://is1.fotbal.cz/media/kluby/813771b6-66f0-450c-a551-cc1a0cf4ce6d/813771b6-66f0-450c-a551-cc1a0cf4ce6d_crop.jpg","played":"12","wins":"11","draws":"0","losses":"1","score":"122:17","points":"33"},{"rank":"2","team":"Karvinรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/4cbe25e6-57f3-41c0-8d92-782b19b61731/4cbe25e6-57f3-41c0-8d92-782b19b61731_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"61:10","points":"27"},{"rank":"3","team":"ล umperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"8","draws":"0","losses":"3","score":"53:29","points":"24"},{"rank":"4","team":"Hranice","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"7","draws":"1","losses":"4","score":"69:34","points":"22"},{"rank":"5","team":"Tล˜INEC","team_logo_url":"https://is1.fotbal.cz/media/kluby/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1_crop.jpg","played":"12","wins":"6","draws":"1","losses":"5","score":"55:42","points":"19"},{"rank":"6","team":"Novรฝ Jiฤรญn","team_logo_url":"/dist/img/logo-club-empty.svg","played":"11","wins":"5","draws":"1","losses":"5","score":"54:37","points":"16"},{"rank":"7","team":"Bรญlovec","team_logo_url":"https://is1.fotbal.cz/media/kluby/d31f4a41-85b9-4e58-bdee-63cb563ada5b/d31f4a41-85b9-4e58-bdee-63cb563ada5b_crop.jpg","played":"12","wins":"4","draws":"4","losses":"4","score":"54:37","points":"16"},{"rank":"8","team":"Hluฤรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/850d6d5c-5812-48d6-93ba-f866fabfada3/850d6d5c-5812-48d6-93ba-f866fabfada3_crop.jpg","played":"12","wins":"3","draws":"4","losses":"5","score":"31:32","points":"13"},{"rank":"9","team":"Poruba โ€“ Petล™vald","team_logo_url":"https://is1.fotbal.cz/media/kluby/9d930e92-92a5-45c4-83cf-2863a076f3b0/9d930e92-92a5-45c4-83cf-2863a076f3b0_crop.jpg","played":"9","wins":"3","draws":"2","losses":"4","score":"26:29","points":"11"},{"rank":"10","team":"Valaลกskรฉ Meziล™รญฤรญ","team_logo_url":"/dist/img/logo-club-empty.svg","played":"12","wins":"3","draws":"2","losses":"7","score":"34:51","points":"11"},{"rank":"11","team":"Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"12","wins":"1","draws":"1","losses":"10","score":"8:137","points":"4"},{"rank":"12","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"11","wins":"0","draws":"0","losses":"11","score":"12:124","points":"0"}]}},{"id":"ae12df84-eaba-4643-ac15-e0d9888f5a87","code":"F1S","name":"1. liga SpSM-U 13 SEVER","team_count":"18","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/ae12df84-eaba-4643-ac15-e0d9888f5a87","table":{"overall":[{"rank":"1","team":"Banรญk Ostrava","team_logo_url":"https://is1.fotbal.cz/media/kluby/e68e68c6-c263-43ce-a247-20ee1d323b55/e68e68c6-c263-43ce-a247-20ee1d323b55_crop.jpg","played":"10","wins":"10","draws":"0","losses":"0","score":"142:18","points":"30"},{"rank":"2","team":"Opava","team_logo_url":"https://is1.fotbal.cz/media/kluby/645aad1b-9a46-4351-90b6-6dfb989453dd/645aad1b-9a46-4351-90b6-6dfb989453dd_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"110:19","points":"27"},{"rank":"3","team":"Karvinรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/4cbe25e6-57f3-41c0-8d92-782b19b61731/4cbe25e6-57f3-41c0-8d92-782b19b61731_crop.jpg","played":"10","wins":"8","draws":"0","losses":"2","score":"135:36","points":"24"},{"rank":"4","team":"VรTKOVICE","team_logo_url":"https://is1.fotbal.cz/media/kluby/a3ff17d6-0888-47e7-9dee-0a98ec8734d0/a3ff17d6-0888-47e7-9dee-0a98ec8734d0_crop.jpg","played":"10","wins":"7","draws":"0","losses":"3","score":"83:29","points":"21"},{"rank":"5","team":"Valaลกskรฉ Meziล™รญฤรญ","team_logo_url":"/dist/img/logo-club-empty.svg","played":"10","wins":"7","draws":"0","losses":"3","score":"70:36","points":"21"},{"rank":"6","team":"Frรฝdek-Mรญstek","team_logo_url":"https://is1.fotbal.cz/media/kluby/5215c1c1-a1b7-4a4d-ba40-eb0d36b19a61/5215c1c1-a1b7-4a4d-ba40-eb0d36b19a61_crop.jpg","played":"9","wins":"6","draws":"1","losses":"2","score":"72:37","points":"19"},{"rank":"7","team":"Uniฤov","team_logo_url":"https://is1.fotbal.cz/media/kluby/813771b6-66f0-450c-a551-cc1a0cf4ce6d/813771b6-66f0-450c-a551-cc1a0cf4ce6d_crop.jpg","played":"10","wins":"6","draws":"1","losses":"3","score":"75:61","points":"19"},{"rank":"8","team":"Poruba โ€“ Petล™vald","team_logo_url":"https://is1.fotbal.cz/media/kluby/9d930e92-92a5-45c4-83cf-2863a076f3b0/9d930e92-92a5-45c4-83cf-2863a076f3b0_crop.jpg","played":"10","wins":"5","draws":"1","losses":"4","score":"69:52","points":"16"},{"rank":"9","team":"ล umperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"9","wins":"5","draws":"0","losses":"4","score":"78:67","points":"15"},{"rank":"10","team":"Hluฤรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/850d6d5c-5812-48d6-93ba-f866fabfada3/850d6d5c-5812-48d6-93ba-f866fabfada3_crop.jpg","played":"10","wins":"4","draws":"1","losses":"5","score":"77:46","points":"13"},{"rank":"11","team":"Pล™erov","team_logo_url":"https://is1.fotbal.cz/media/kluby/1fd1a047-4cf5-47cc-a712-915928cba6fb/1fd1a047-4cf5-47cc-a712-915928cba6fb_crop.jpg","played":"10","wins":"4","draws":"1","losses":"5","score":"34:57","points":"13"},{"rank":"12","team":"Hranice","team_logo_url":"/dist/img/logo-club-empty.svg","played":"9","wins":"4","draws":"0","losses":"5","score":"44:62","points":"12"},{"rank":"13","team":"HFK Olomouc","team_logo_url":"https://is1.fotbal.cz/media/kluby/1fbad935-da41-4567-83dc-397ec04d64d3/1fbad935-da41-4567-83dc-397ec04d64d3_crop.jpg","played":"10","wins":"2","draws":"3","losses":"5","score":"45:66","points":"9"},{"rank":"14","team":"Tล˜INEC","team_logo_url":"https://is1.fotbal.cz/media/kluby/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1_crop.jpg","played":"9","wins":"2","draws":"1","losses":"6","score":"39:52","points":"7"},{"rank":"15","team":"Bรญlovec","team_logo_url":"https://is1.fotbal.cz/media/kluby/d31f4a41-85b9-4e58-bdee-63cb563ada5b/d31f4a41-85b9-4e58-bdee-63cb563ada5b_crop.jpg","played":"10","wins":"2","draws":"1","losses":"7","score":"38:70","points":"7"},{"rank":"16","team":"Novรฝ Jiฤรญn","team_logo_url":"/dist/img/logo-club-empty.svg","played":"10","wins":"2","draws":"0","losses":"8","score":"19:92","points":"6"},{"rank":"17","team":"Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"10","wins":"0","draws":"0","losses":"10","score":"13:152","points":"0"},{"rank":"18","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"10","wins":"0","draws":"0","losses":"10","score":"22:213","points":"0"}]}},{"id":"3f37901c-5c36-4a13-8a84-244f64f1ea1a","code":"F2S","name":"1. liga SpSM-U 12 SEVER","team_count":"18","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/3f37901c-5c36-4a13-8a84-244f64f1ea1a","table":{"overall":[{"rank":"1","team":"Hluฤรญn","team_logo_url":"https://is1.fotbal.cz/media/kluby/850d6d5c-5812-48d6-93ba-f866fabfada3/850d6d5c-5812-48d6-93ba-f866fabfada3_crop.jpg","played":"10","wins":"10","draws":"0","losses":"0","score":"104:11","points":"30"},{"rank":"2","team":"Banรญk Ostrava","team_logo_url":"https://is1.fotbal.cz/media/kluby/e68e68c6-c263-43ce-a247-20ee1d323b55/e68e68c6-c263-43ce-a247-20ee1d323b55_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"121:15","points":"27"},{"rank":"3","team":"Karvinรก","team_logo_url":"https://is1.fotbal.cz/media/kluby/4cbe25e6-57f3-41c0-8d92-782b19b61731/4cbe25e6-57f3-41c0-8d92-782b19b61731_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"120:25","points":"27"},{"rank":"4","team":"VรTKOVICE","team_logo_url":"https://is1.fotbal.cz/media/kluby/a3ff17d6-0888-47e7-9dee-0a98ec8734d0/a3ff17d6-0888-47e7-9dee-0a98ec8734d0_crop.jpg","played":"10","wins":"9","draws":"0","losses":"1","score":"52:13","points":"27"},{"rank":"5","team":"Opava","team_logo_url":"https://is1.fotbal.cz/media/kluby/645aad1b-9a46-4351-90b6-6dfb989453dd/645aad1b-9a46-4351-90b6-6dfb989453dd_crop.jpg","played":"10","wins":"8","draws":"0","losses":"2","score":"109:21","points":"24"},{"rank":"6","team":"HFK Olomouc","team_logo_url":"https://is1.fotbal.cz/media/kluby/1fbad935-da41-4567-83dc-397ec04d64d3/1fbad935-da41-4567-83dc-397ec04d64d3_crop.jpg","played":"10","wins":"6","draws":"2","losses":"2","score":"85:18","points":"20"},{"rank":"7","team":"Frรฝdek-Mรญstek","team_logo_url":"https://is1.fotbal.cz/media/kluby/5215c1c1-a1b7-4a4d-ba40-eb0d36b19a61/5215c1c1-a1b7-4a4d-ba40-eb0d36b19a61_crop.jpg","played":"9","wins":"5","draws":"2","losses":"2","score":"56:22","points":"17"},{"rank":"8","team":"Hranice","team_logo_url":"/dist/img/logo-club-empty.svg","played":"9","wins":"4","draws":"3","losses":"2","score":"62:38","points":"15"},{"rank":"9","team":"Poruba โ€“ Petล™vald","team_logo_url":"https://is1.fotbal.cz/media/kluby/9d930e92-92a5-45c4-83cf-2863a076f3b0/9d930e92-92a5-45c4-83cf-2863a076f3b0_crop.jpg","played":"10","wins":"4","draws":"2","losses":"4","score":"56:35","points":"14"},{"rank":"10","team":"Tล˜INEC","team_logo_url":"https://is1.fotbal.cz/media/kluby/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1/5c7a7f1e-0a45-4e2c-b648-80f3c96b5bf1_crop.jpg","played":"9","wins":"4","draws":"1","losses":"4","score":"40:21","points":"13"},{"rank":"11","team":"Pล™erov","team_logo_url":"https://is1.fotbal.cz/media/kluby/1fd1a047-4cf5-47cc-a712-915928cba6fb/1fd1a047-4cf5-47cc-a712-915928cba6fb_crop.jpg","played":"10","wins":"3","draws":"0","losses":"7","score":"30:58","points":"9"},{"rank":"12","team":"Novรฝ Jiฤรญn","team_logo_url":"/dist/img/logo-club-empty.svg","played":"10","wins":"3","draws":"0","losses":"7","score":"30:78","points":"9"},{"rank":"13","team":"Valaลกskรฉ Meziล™รญฤรญ","team_logo_url":"/dist/img/logo-club-empty.svg","played":"10","wins":"2","draws":"1","losses":"7","score":"45:44","points":"7"},{"rank":"14","team":"Havรญล™ov","team_logo_url":"https://is1.fotbal.cz/media/kluby/05c0e5d4-9485-4e49-b001-fc1a43749636/05c0e5d4-9485-4e49-b001-fc1a43749636_crop.jpg","played":"10","wins":"2","draws":"1","losses":"7","score":"18:72","points":"7"},{"rank":"15","team":"ล umperk","team_logo_url":"/dist/img/logo-club-empty.svg","played":"9","wins":"2","draws":"0","losses":"7","score":"40:95","points":"6"},{"rank":"16","team":"Bรญlovec","team_logo_url":"https://is1.fotbal.cz/media/kluby/d31f4a41-85b9-4e58-bdee-63cb563ada5b/d31f4a41-85b9-4e58-bdee-63cb563ada5b_crop.jpg","played":"10","wins":"2","draws":"0","losses":"8","score":"25:81","points":"6"},{"rank":"17","team":"Uniฤov","team_logo_url":"https://is1.fotbal.cz/media/kluby/813771b6-66f0-450c-a551-cc1a0cf4ce6d/813771b6-66f0-450c-a551-cc1a0cf4ce6d_crop.jpg","played":"10","wins":"0","draws":"0","losses":"10","score":"8:106","points":"0"},{"rank":"18","team":"Krnov","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"10","wins":"0","draws":"0","losses":"10","score":"4:252","points":"0"}]}},{"id":"7849d6ca-3c61-4e2b-ba4f-e875bf11fd95","code":"G1D","name":"Starลกรญ pล™รญpravka 1+5 sk.D","team_count":"9","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/7849d6ca-3c61-4e2b-ba4f-e875bf11fd95","table":{"overall":null}},{"id":"ba50c319-414d-478f-9719-76d59ddfb87c","code":"H1A","name":"Okresnรญ pล™ebor mladลกรญ pล™รญpravky (4+1)","team_count":"10","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/ba50c319-414d-478f-9719-76d59ddfb87c","table":{"overall":null}},{"id":"7580b803-665d-4808-8cec-c916dcb22343","code":"H1C","name":"Mladลกรญ pล™รญpravka 1+4 sk.C","team_count":"10","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/7580b803-665d-4808-8cec-c916dcb22343","table":{"overall":null}},{"id":"eccb91ba-cbce-46e1-af51-449bdbd42f8f","code":"U1E","name":"PC U1E U-10 ล umperk","team_count":"6","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/eccb91ba-cbce-46e1-af51-449bdbd42f8f","table":{"overall":[{"rank":"1","team":"FK WAREX Jesenรญk z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/03dd330b-d469-4a65-99f1-29b7ece7c2ed/03dd330b-d469-4a65-99f1-29b7ece7c2ed_crop.jpg","played":"5","wins":"5","draws":"0","losses":"0","score":"29:5","points":"15"},{"rank":"2","team":"SK Uniฤov, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/813771b6-66f0-450c-a551-cc1a0cf4ce6d/813771b6-66f0-450c-a551-cc1a0cf4ce6d_crop.jpg","played":"5","wins":"4","draws":"0","losses":"1","score":"35:6","points":"12"},{"rank":"3","team":"MFK Slavoj Bruntรกl, z. s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/e7e5ee65-11f9-4edf-8724-1bab6043cadc/e7e5ee65-11f9-4edf-8724-1bab6043cadc_crop.jpg","played":"5","wins":"2","draws":"1","losses":"2","score":"17:21","points":"7"},{"rank":"4","team":"FK Kofola Krnov, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"5","wins":"2","draws":"0","losses":"3","score":"10:25","points":"6"},{"rank":"5","team":"FK Prumrent ล umperk z.s.","team_logo_url":"/dist/img/logo-club-empty.svg","played":"5","wins":"1","draws":"1","losses":"3","score":"9:25","points":"4"},{"rank":"6","team":"FOTBALOVร KLUB ล TERNBERK, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/e520d185-109f-4bc6-bccc-6312654aac9b/e520d185-109f-4bc6-bccc-6312654aac9b_crop.jpg","played":"5","wins":"0","draws":"0","losses":"5","score":"6:24","points":"0"}]}},{"id":"b84c678f-c33c-4622-97ad-6c3e8827094b","code":"V1C","name":"PC V1C U-8 Novรฝ Jiฤรญn","team_count":"6","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/b84c678f-c33c-4622-97ad-6c3e8827094b","table":{"overall":null}},{"id":"6b40d9ca-da87-46ba-8e92-28522adda322","code":"V5B","name":"PC V5B U-9 Hluฤรญn","team_count":"6","matches_link":"https://www.fotbal.cz/souteze/turnaje/table/6b40d9ca-da87-46ba-8e92-28522adda322","table":{"overall":[{"rank":"1","team":"Sportovnรญ klub FC Hluฤรญn, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/850d6d5c-5812-48d6-93ba-f866fabfada3/850d6d5c-5812-48d6-93ba-f866fabfada3_crop.jpg","played":"5","wins":"5","draws":"0","losses":"0","score":"58:6","points":"15"},{"rank":"2","team":"Fotbalovรฝ klub SK Polanka nad Odrou z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/31e53384-37d8-4755-bfdc-c8d168ffea24/31e53384-37d8-4755-bfdc-c8d168ffea24_crop.jpg","played":"5","wins":"4","draws":"0","losses":"1","score":"45:17","points":"12"},{"rank":"3","team":"1. FC Poruba โ€“ Petล™vald na Moravฤ›, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/9d930e92-92a5-45c4-83cf-2863a076f3b0/9d930e92-92a5-45c4-83cf-2863a076f3b0_crop.jpg","played":"5","wins":"3","draws":"0","losses":"2","score":"41:15","points":"9"},{"rank":"4","team":"ล kolnรญ sportovnรญ klub Bรญlovec,z.s.","team_logo_url":"https://www.fotbal.cz/dist/img/logo-club-empty.svg","played":"5","wins":"2","draws":"0","losses":"3","score":"10:32","points":"6"},{"rank":"5","team":"FK Kofola Krnov, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/7eacd9f0-bfa0-4928-a9b6-936140168f58/7eacd9f0-bfa0-4928-a9b6-936140168f58_crop.jpg","played":"5","wins":"1","draws":"0","losses":"4","score":"12:34","points":"3"},{"rank":"6","team":"Tฤ›lovรฝchovnรก jednota Sokol Kozmice, z.s.","team_logo_url":"https://is1.fotbal.cz/media/kluby/fea7c7cc-2a4e-458c-a979-5789aafa09c0/fea7c7cc-2a4e-458c-a979-5789aafa09c0_crop.jpg","played":"5","wins":"0","draws":"0","losses":"5","score":"1:63","points":"0"}]}}]} diff --git a/cache/prefetch/facr_tables.json.hdr b/cache/prefetch/facr_tables.json.hdr index 2f6b583..fed8847 100644 --- a/cache/prefetch/facr_tables.json.hdr +++ b/cache/prefetch/facr_tables.json.hdr @@ -1 +1 @@ -{"etag":"","fetched_at":"2025-10-19T15:29:54Z","last_modified":""} \ No newline at end of file +{"etag":"","fetched_at":"2025-10-19T15:35:00Z","last_modified":""} \ No newline at end of file diff --git a/cache/prefetch/meta.json b/cache/prefetch/meta.json index 66099bf..0826a10 100644 --- a/cache/prefetch/meta.json +++ b/cache/prefetch/meta.json @@ -1 +1 @@ -{"lastUpdated":"2025-10-19T15:29:54Z"} \ No newline at end of file +{"lastUpdated":"2025-10-19T15:35:00Z"} \ No newline at end of file diff --git a/cache/prefetch/prefetch_status.json b/cache/prefetch/prefetch_status.json index d8d032a..36a8fc9 100644 --- a/cache/prefetch/prefetch_status.json +++ b/cache/prefetch/prefetch_status.json @@ -1,12 +1,7 @@ { "baseURL": "http://127.0.0.1:8080/api/v1", - "duration_ms": 41, + "duration_ms": 3857, "endpoints": [ - { - "path": "/articles?page=1\u0026page_size=10\u0026published=true", - "file": "articles.json", - "ok": true - }, { "path": "/sponsors", "file": "sponsors.json", @@ -33,15 +28,20 @@ "ok": true }, { - "path": "/facr/club/football/7eacd9f0-bfa0-4928-a9b6-936140168f58", - "file": "facr_club_info.json", + "path": "/articles?page=1\u0026page_size=10\u0026published=true", + "file": "articles.json", "ok": true }, { "path": "/facr/club/football/7eacd9f0-bfa0-4928-a9b6-936140168f58/table", "file": "facr_tables.json", "ok": true + }, + { + "path": "/facr/club/football/7eacd9f0-bfa0-4928-a9b6-936140168f58", + "file": "facr_club_info.json", + "ok": true } ], - "lastUpdated": "2025-10-19T15:29:54Z" + "lastUpdated": "2025-10-19T15:35:00Z" } \ No newline at end of file diff --git a/cache/prefetch/settings.json.hdr b/cache/prefetch/settings.json.hdr index 2f6b583..ec17454 100644 --- a/cache/prefetch/settings.json.hdr +++ b/cache/prefetch/settings.json.hdr @@ -1 +1 @@ -{"etag":"","fetched_at":"2025-10-19T15:29:54Z","last_modified":""} \ No newline at end of file +{"etag":"","fetched_at":"2025-10-19T15:34:56Z","last_modified":""} \ No newline at end of file diff --git a/cache/prefetch/sponsors.json.hdr b/cache/prefetch/sponsors.json.hdr index 2f6b583..ec17454 100644 --- a/cache/prefetch/sponsors.json.hdr +++ b/cache/prefetch/sponsors.json.hdr @@ -1 +1 @@ -{"etag":"","fetched_at":"2025-10-19T15:29:54Z","last_modified":""} \ No newline at end of file +{"etag":"","fetched_at":"2025-10-19T15:34:56Z","last_modified":""} \ No newline at end of file diff --git a/cache/prefetch/team_logo_overrides.json.hdr b/cache/prefetch/team_logo_overrides.json.hdr index 2f6b583..ec17454 100644 --- a/cache/prefetch/team_logo_overrides.json.hdr +++ b/cache/prefetch/team_logo_overrides.json.hdr @@ -1 +1 @@ -{"etag":"","fetched_at":"2025-10-19T15:29:54Z","last_modified":""} \ No newline at end of file +{"etag":"","fetched_at":"2025-10-19T15:34:56Z","last_modified":""} \ No newline at end of file diff --git a/frontend/FRONTEND_UTILITIES_GUIDE.md b/frontend/FRONTEND_UTILITIES_GUIDE.md new file mode 100644 index 0000000..9139750 --- /dev/null +++ b/frontend/FRONTEND_UTILITIES_GUIDE.md @@ -0,0 +1,711 @@ +# Frontend Utility Hooks & Components Guide + +Complete TypeScript/TSX utilities that mirror the backend helpers and make frontend development much easier. + +## Table of Contents + +1. [Hooks](#hooks) + - [usePaginatedData](#usepaginateddata) + - [useApiMutation](#useapimutation) + - [useFormValidation](#useformvalidation) + - [useQueryBuilder](#usequerybuilder) + - [useToast](#usetoast) + - [useBatchSelection](#usebatchselection) +2. [Components](#components) + - [DataTable](#datatable) + - [ToastContainer](#toastcontainer) +3. [Utilities](#utilities) + - [Export Functions](#export-functions) +4. [Complete Example](#complete-example) + +--- + +## Hooks + +### usePaginatedData + +**Purpose:** Fetch paginated data with search, sort, and filters in one line. + +**Features:** +- Automatic pagination management +- Search functionality +- Sorting +- Filtering +- Loading and error states +- Works seamlessly with backend QueryParser + +```tsx +import { usePaginatedData } from '../hooks/usePaginatedData'; + +interface Article { + id: number; + title: string; + published: boolean; +} + +function ArticleList() { + const { + data: articles, + meta, + loading, + error, + setPage, + setSearch, + setSort, + setFilters, + refresh, + } = usePaginatedData
('/articles', { + page_size: 20, + }); + + return ( +
+ setSearch(e.target.value)} + placeholder="Search..." + /> + + + + {loading &&

Loading...

} + {error &&

Error: {error}

} + +
    + {articles.map(article => ( +
  • {article.title}
  • + ))} +
+ + {meta && ( + + )} +
+ ); +} +``` + +### useApiMutation + +**Purpose:** Handle POST, PUT, PATCH, DELETE requests with loading states. + +**Features:** +- Automatic loading states +- Error handling +- Success tracking +- TypeScript support + +```tsx +import { useApiPost, useApiDelete } from '../hooks/useApiMutation'; + +function ArticleForm() { + // Create article + const { mutate: createArticle, loading, error, success } = useApiPost
('/articles'); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + const article = await createArticle({ + title: 'New Article', + content: 'Content here...', + }); + + if (article) { + console.log('Created:', article); + } + }; + + // Delete article + const deleteArticle = useApiDelete((data: { id: number }) => `/articles/${data.id}`); + + const handleDelete = async (id: number) => { + await deleteArticle.mutate({ id }); + }; + + return ( +
+ + {error &&

{error}

} + {success &&

Article created!

} +
+ ); +} +``` + +### useFormValidation + +**Purpose:** Form validation with built-in rules and error messages. + +**Features:** +- Required, min/max length, pattern, email, URL validators +- Custom validators +- Automatic error messages +- Touch tracking +- Easy integration with forms + +```tsx +import { useFormValidation } from '../hooks/useFormValidation'; + +interface ArticleForm { + title: string; + content: string; + email: string; + url: string; +} + +function CreateArticleForm() { + const { + values, + errors, + touched, + handleChange, + handleBlur, + handleSubmit, + } = useFormValidation( + { + title: '', + content: '', + email: '', + url: '', + }, + { + title: { required: true, min: 3, max: 200 }, + content: { required: true, min: 10 }, + email: { required: true, email: true }, + url: { url: true }, + } + ); + + const onSubmit = async (data: ArticleForm) => { + console.log('Valid data:', data); + // Call API here + }; + + return ( +
+
+ + {touched.title && errors.title && ( + {errors.title} + )} +
+ +
+