From fc81365cc6dae63ba5f0df2a6da6efa7b781e507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20L=C3=B8nskov?= Date: Fri, 9 Jan 2026 20:22:46 +0100 Subject: [PATCH 1/6] Added Knowledge base for built in BPA rules --- ...a-avoid-invalid-characters-descriptions.md | 124 +++++++++++++++ .../kb/bpa-avoid-invalid-characters-names.md | 125 +++++++++++++++ ...pa-avoid-provider-partitions-structured.md | 96 ++++++++++++ content/kb/bpa-calculation-groups-no-items.md | 102 +++++++++++++ content/kb/bpa-data-column-source.md | 93 +++++++++++ content/kb/bpa-date-table-exists.md | 113 ++++++++++++++ content/kb/bpa-do-not-summarize-numeric.md | 119 +++++++++++++++ content/kb/bpa-expression-required.md | 98 ++++++++++++ content/kb/bpa-format-string-columns.md | 84 ++++++++++ content/kb/bpa-format-string-measures.md | 105 +++++++++++++ content/kb/bpa-hide-foreign-keys.md | 118 ++++++++++++++ .../kb/bpa-many-to-many-single-direction.md | 115 ++++++++++++++ content/kb/bpa-perspectives-no-objects.md | 89 +++++++++++ .../kb/bpa-powerbi-latest-compatibility.md | 86 +++++++++++ content/kb/bpa-relationship-same-datatype.md | 92 +++++++++++ content/kb/bpa-remove-auto-date-table.md | 106 +++++++++++++ content/kb/bpa-remove-unused-data-sources.md | 120 +++++++++++++++ content/kb/bpa-set-isavailableinmdx-false.md | 91 +++++++++++ ...bpa-set-isavailableinmdx-true-necessary.md | 144 ++++++++++++++++++ content/kb/bpa-specify-application-name.md | 70 +++++++++ content/kb/bpa-translate-descriptions.md | 99 ++++++++++++ content/kb/bpa-translate-display-folders.md | 104 +++++++++++++ content/kb/bpa-translate-hierarchy-levels.md | 92 +++++++++++ content/kb/bpa-translate-perspectives.md | 87 +++++++++++ content/kb/bpa-translate-visible-names.md | 99 ++++++++++++ content/kb/bpa-trim-object-names.md | 103 +++++++++++++ .../kb/bpa-visible-objects-no-description.md | 106 +++++++++++++ 27 files changed, 2780 insertions(+) create mode 100644 content/kb/bpa-avoid-invalid-characters-descriptions.md create mode 100644 content/kb/bpa-avoid-invalid-characters-names.md create mode 100644 content/kb/bpa-avoid-provider-partitions-structured.md create mode 100644 content/kb/bpa-calculation-groups-no-items.md create mode 100644 content/kb/bpa-data-column-source.md create mode 100644 content/kb/bpa-date-table-exists.md create mode 100644 content/kb/bpa-do-not-summarize-numeric.md create mode 100644 content/kb/bpa-expression-required.md create mode 100644 content/kb/bpa-format-string-columns.md create mode 100644 content/kb/bpa-format-string-measures.md create mode 100644 content/kb/bpa-hide-foreign-keys.md create mode 100644 content/kb/bpa-many-to-many-single-direction.md create mode 100644 content/kb/bpa-perspectives-no-objects.md create mode 100644 content/kb/bpa-powerbi-latest-compatibility.md create mode 100644 content/kb/bpa-relationship-same-datatype.md create mode 100644 content/kb/bpa-remove-auto-date-table.md create mode 100644 content/kb/bpa-remove-unused-data-sources.md create mode 100644 content/kb/bpa-set-isavailableinmdx-false.md create mode 100644 content/kb/bpa-set-isavailableinmdx-true-necessary.md create mode 100644 content/kb/bpa-specify-application-name.md create mode 100644 content/kb/bpa-translate-descriptions.md create mode 100644 content/kb/bpa-translate-display-folders.md create mode 100644 content/kb/bpa-translate-hierarchy-levels.md create mode 100644 content/kb/bpa-translate-perspectives.md create mode 100644 content/kb/bpa-translate-visible-names.md create mode 100644 content/kb/bpa-trim-object-names.md create mode 100644 content/kb/bpa-visible-objects-no-description.md diff --git a/content/kb/bpa-avoid-invalid-characters-descriptions.md b/content/kb/bpa-avoid-invalid-characters-descriptions.md new file mode 100644 index 00000000..0c322b1c --- /dev/null +++ b/content/kb/bpa-avoid-invalid-characters-descriptions.md @@ -0,0 +1,124 @@ +--- +uid: kb.bpa-avoid-invalid-characters-descriptions +title: Avoid Invalid Characters in Descriptions +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule preventing display and deployment issues by identifying control characters in object descriptions. +--- + +# Avoid Invalid Characters in Descriptions + +## Overview + +This best practice rule identifies objects whose descriptions contain invalid control characters (non-printable characters excluding standard whitespace). These characters can cause display problems, metadata corruption, and deployment failures. + +- Category: **Error Prevention** + +- Severity: High (3) + +## Applies To + +- Tables +- Measures +- Hierarchies +- Levels +- Perspectives +- Partitions +- Data Columns +- Calculated Columns +- Calculated Table Columns +- KPIs +- Model Roles +- Calculation Groups +- Calculation Items + +## Why This Matters + +Control characters in descriptions cause various issues: + +- **Display corruption**: Tooltips and documentation panels may show garbled text +- **Metadata problems**: TMSL/XMLA export may produce invalid XML +- **Deployment failures**: Power BI Service or Analysis Services may reject the model +- **Documentation issues**: Generated documentation may break formatting +- **Encoding errors**: Cross-platform synchronization problems +- **User confusion**: Invisible characters create confusing or corrupted descriptions + +Standard whitespace (spaces, newlines, tabs) is acceptable, but non-printable control characters should be removed. + +## When This Rule Triggers + +The rule triggers when an object's description contains control characters that are not standard whitespace: + +```csharp +Description.ToCharArray().Any(char.IsControl(it) and !char.IsWhiteSpace(it)) +``` + +This detects problematic characters while allowing legitimate whitespace formatting. + +## How to Fix + +### Automatic Fix + +This rule includes an automatic fix that replaces invalid characters with spaces: + +```csharp +Description = string.Concat( + it.Description.ToCharArray().Select( + c => (char.IsControl(c) && !char.IsWhiteSpace(c)) ? ' ' : c + ) +) +``` + +To apply: +1. In the **Best Practice Analyzer** select flagged objects +3. Click **Apply Fix** + +### Manual Fix + +1. In **TOM Explorer**, select the object +2. In **Properties** pane, locate the **Description** field +3. Edit the description to remove invalid characters +4. Save changes + +## Common Causes + +### Cause 1: Copy/Paste from Rich Text + +Copying descriptions from Word documents, web pages, or emails can introduce hidden formatting characters. + +### Cause 2: Automated Documentation Generation + +Scripts generating descriptions may include control characters from source systems. + +### Cause 3: Data Import from External Sources + +Importing metadata that contains encoding artifacts or control codes. + +## Example + +### Before Fix + +``` +Measure: [Total Revenue] +Description: "Calculates\x00total\x0Brevenue" (contains NULL and vertical tab) +``` + +Tooltip displays: "Calculates□total□revenue" (with visible corruption) + +### After Fix + +``` +Measure: [Total Revenue] +Description: "Calculates total revenue" (control characters replaced with spaces) +``` + +Tooltip displays correctly: "Calculates total revenue" + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Avoid Invalid Characters in Names](xref:kb.bpa-avoid-invalid-characters-names) - Similar validation for object names +- [Visible Objects Should Have Descriptions](xref:kb.bpa-visible-objects-no-description) - Ensuring descriptions exist diff --git a/content/kb/bpa-avoid-invalid-characters-names.md b/content/kb/bpa-avoid-invalid-characters-names.md new file mode 100644 index 00000000..6dcda095 --- /dev/null +++ b/content/kb/bpa-avoid-invalid-characters-names.md @@ -0,0 +1,125 @@ +--- +uid: kb.bpa-avoid-invalid-characters-names +title: Avoid Invalid Characters in Object Names +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule preventing deployment errors by identifying control characters in object names. +--- + +# Avoid Invalid Characters in Object Names + +## Overview + +This best practice rule identifies objects whose names contain invalid control characters (non-printable characters excluding standard whitespace). These characters can cause deployment failures, rendering issues, and data corruption. + +- Category: **Error Prevention** +- Severity: High (3) + +## Applies To + +- Tables +- Measures +- Hierarchies +- Levels +- Perspectives +- Partitions +- Data Columns +- Calculated Columns +- Calculated Table Columns +- KPIs +- Model Roles +- Calculation Groups +- Calculation Items + +## Why This Matters + +Control characters in object names cause serious issues: + +- **Deployment failures**: Power BI Service and Analysis Services may reject models with invalid characters +- **Rendering problems**: Client tools may display garbled or invisible names +- **DAX parsing errors**: Invalid characters can break DAX expressions referencing the object +- **XML corruption**: Model metadata (TMSL/XMLA) may become malformed +- **Copy/paste issues**: Names may not transfer correctly between applications +- **Encoding problems**: Cross-platform compatibility issues + +Standard whitespace (spaces, newlines, carriage returns) is allowed, but control characters should be removed. + +## When This Rule Triggers + +The rule triggers when an object's name contains control characters that are not standard whitespace: + +```csharp +Name.ToCharArray().Any(char.IsControl(it) and !char.IsWhiteSpace(it)) +``` + +This detects problematic characters while allowing legitimate whitespace formatting. + +## How to Fix + +### Automatic Fix + +This rule includes an automatic fix that replaces invalid characters with spaces: + +```csharp +Name = string.Concat( + it.Name.ToCharArray().Select( + c => (char.IsControl(c) && !char.IsWhiteSpace(c)) ? ' ' : c + ) +) +``` + +To apply: +1. In the **Best Practice Analyzer** select flagged objects +2. Click **Apply Fix** + +### Manual Fix + +1. In **TOM Explorer**, select the object +2. In **Properties** pane, locate the **Name** field +3. Edit the name to remove invalid characters +4. Save changes + +## Common Causes + +### Cause 1: Copy/Paste from Rich Text + +Copying names from Word documents, web pages, or emails can introduce hidden formatting characters. + +### Cause 2: Automated Name Generation + +Scripts generating names may include control characters from source systems. + +### Cause 3: Data Import from External Sources + +Importing metadata that contains encoding artifacts or control codes. + +## Example + +### Before Fix + +``` +Measure Name: "Total\x00Sales" (contains NULL character) +``` + +Deployment fails with "Invalid character in object name" + +### After Fix + +``` +Measure Name: "Total Sales" (NULL replaced with space) +``` + +Deploys successfully and displays correctly in all tools. + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Avoid Invalid Characters in Descriptions](xref:kb.bpa-avoid-invalid-characters-descriptions) - Similar validation for description properties +- [Trim Object Names](xref:kb.bpa-trim-object-names) - Removing leading/trailing spaces + +## Learn More + +- [DAX Naming Rules](https://learn.microsoft.com/dax/dax-syntax-reference) diff --git a/content/kb/bpa-avoid-provider-partitions-structured.md b/content/kb/bpa-avoid-provider-partitions-structured.md new file mode 100644 index 00000000..e6654042 --- /dev/null +++ b/content/kb/bpa-avoid-provider-partitions-structured.md @@ -0,0 +1,96 @@ +--- +uid: kb.bpa-avoid-provider-partitions-structured +title: Avoid Provider Partitions with Structured Data Sources +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule preventing deployment errors by identifying legacy provider partitions used with structured data sources in Power BI. +--- + +# Avoid Provider Partitions with Structured Data Sources + +## Overview + +This best practice rule identifies partitions that use legacy provider-based queries (SourceType = Query) with structured data sources in Power BI models. This combination is not supported in Power BI Service and will cause deployment failures. + +- Category: **Error Prevention** + +- Severity: Medium (2) + +## Applies To + +- Partitions + +## Why This Matters + +Power BI Service requires structured data sources to use Power Query (M) partitions rather than legacy provider partitions. Using provider partitions with structured data sources causes: + +- **Deployment failures**: Models fail to publish to Power BI Service +- **Refresh errors**: Scheduled refresh operations fail in the service +- **Compatibility issues**: The model cannot be shared or deployed properly +- **Migration blockers**: Prevents moving from Analysis Services to Power BI + +## When This Rule Triggers + +The rule triggers when a partition meets all these conditions: + +1. `SourceType = "Query"` (legacy provider partition) +2. `DataSource.Type = "Structured"` (Power Query/M data source) +3. `Model.Database.CompatibilityMode != "AnalysisServices"` (Power BI or Azure AS) + +This combination indicates a structural mismatch that Power BI cannot process. + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, select the affected partition +2. In **Properties** pane, note the existing query +3. Create a new **Power Query** partition with M expression +4. Delete the old provider partition after verifying the new one works + +## Common Causes + +### Cause 1: Migration from Analysis Services + +Models migrated from SQL Server Analysis Services retain legacy provider partitions. + +### Cause 2: Mixed Partition Types + +Mixing partition types during model development creates incompatible configurations. + +## Example + +### Before Fix + +``` +Partition: Sales_Partition + SourceType: Query + Query: SELECT * FROM Sales + DataSource: PowerQuerySource (Type: Structured) +``` + +**Error**: Deployment fails to Power BI Service + +### After Fix + +``` +Partition: Sales_Partition + SourceType: M + Expression: + let + Source = Sql.Database("server", "database"), + Sales = Source{[Schema="dbo",Item="Sales"]}[Data] + in + Sales + DataSource: PowerQuerySource (Type: Structured) +``` + +**Result**: Deploys successfully to Power BI Service + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher when deployed to Power BI or Azure Analysis Services. + +## Related Rules + +- [Data Column Must Have Source](xref:kb.bpa-data-column-source) - Ensuring column source mappings diff --git a/content/kb/bpa-calculation-groups-no-items.md b/content/kb/bpa-calculation-groups-no-items.md new file mode 100644 index 00000000..58d66019 --- /dev/null +++ b/content/kb/bpa-calculation-groups-no-items.md @@ -0,0 +1,102 @@ +--- +uid: kb.bpa-calculation-groups-no-items +title: Calculation Groups Should Contain Items +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule identifying calculation groups without calculation items that should be populated or removed. +--- + +# Calculation Groups Should Contain Items + +## Overview + +This best practice rule identifies calculation groups that contain no calculation items. Empty calculation groups serve no purpose and should be populated or removed. + +- Category: **Maintenance** +- Severity: Medium (2) + +## Applies To + +- Calculation Groups + +## Why This Matters + +- **Deployment errors**: Empty groups may fail validation in Power BI Service +- **Model errors**: Can cause unexpected behavior in DAX calculations +- **Developer confusion**: Team members waste time investigating incomplete structures +- **Performance overhead**: Engine processes unnecessary metadata + +## When This Rule Triggers + +The rule triggers when a calculation group has zero calculation items: + +```csharp +CalculationItems.Count == 0 +``` + +## How to Fix + +### Option 1: Add Calculation Items + +If the calculation group has a valid business purpose: + +1. In **TOM Explorer**, expand the calculation group table +2. Expand the **Calculation Group** column +3. Right-click and select **Add Calculation Item** +4. Define the calculation item expression + +### Option 2: Delete the Calculation Group + +If no longer needed: + +1. In **TOM Explorer**, locate the calculation group table +2. Right-click the table +3. Select **Delete** + +## Common Causes + +### Cause 1: Incomplete Development + +Calculation group created during planning but not yet implemented. + +### Cause 2: Migration from Other Models + +Calculation group structure copied without items. + +### Cause 3: Refactoring + +All calculation items moved to a different calculation group. + +## Example + +### Before Fix + +``` +Calculation Group: Time Intelligence + Items: (none) ← Problem +``` + +### After Fix + +``` +Calculation Group: Time Intelligence + Items: + - Current Period: SELECTEDMEASURE() + - Year-to-Date: CALCULATE(SELECTEDMEASURE(), DATESYTD('Date'[Date])) + - Prior Year: CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Date'[Date])) +``` + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Perspectives Should Contain Objects](xref:kb.bpa-perspectives-no-objects) - Similar rule for empty perspectives +- [Expression Required](xref:kb.bpa-expression-required) - Ensuring calculation items have expressions + +## Learn More + +- [Calculation Groups in Tabular Models](https://learn.microsoft.com/analysis-services/tabular-models/calculation-groups) +- [Creating Calculation Groups](https://www.sqlbi.com/articles/introducing-calculation-groups/) +- [Calculation Group Patterns](https://www.sqlbi.com/calculation-groups/) diff --git a/content/kb/bpa-data-column-source.md b/content/kb/bpa-data-column-source.md new file mode 100644 index 00000000..f9a29af0 --- /dev/null +++ b/content/kb/bpa-data-column-source.md @@ -0,0 +1,93 @@ +--- +uid: kb.bpa-data-column-source +title: Data Column Must Have Source +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring data columns have a valid source column mapping to prevent refresh errors. +--- + +# Data Column Must Have Source + +## Overview + +This best practice rule identifies data columns that lack a valid `SourceColumn` property. Every data column must reference a source column from the underlying data source to function correctly during refresh. + +- Category: **Error Prevention** +- Severity: High (3) + +## Applies To + +- Data Columns + +## Why This Matters + +- **Refresh failures**: Data refresh operations fail with column not found errors +- **Deployment issues**: Model validation fails in Power BI Service or Analysis Services +- **Data integrity**: Column remains empty or contains stale data +- **Broken dependencies**: Measures and relationships produce incorrect results + +## When This Rule Triggers + +The rule triggers when a data column has: + +```csharp +string.IsNullOrWhitespace(SourceColumn) +``` + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, locate the flagged data column +2. In **Properties** pane, find the `Source Column` property +3. Enter the correct source column name from your data source query +4. Verify the mapping matches the partition query + +The source column name must exactly match: +- For Power Query: Column name in M expression output +- For SQL: Column name or alias in SELECT statement +- For Direct Lake: Column name in Delta Lake table + +## Common Causes + +### Cause 1: Renamed Source Column + +Source query was modified and column renamed. + +### Cause 2: Manual Column Creation + +Column created manually without specifying source. + +### Cause 3: Copy/Paste Corruption + +Columns copied from another table without preserving metadata. + +## Example + +### Before Fix + +``` +Table: Sales +Column: ProductName (DataColumn) + SourceColumn: [empty] +``` + +Result: Refresh fails with "Column 'ProductName' not found in source query" + +### After Fix + +``` +Table: Sales +Column: ProductName (DataColumn) + SourceColumn: ProductName +``` + +Result: Column populates correctly during refresh + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Expression Required for Calculated Objects](xref:kb.bpa-expression-required) - Ensuring calculated columns have expressions diff --git a/content/kb/bpa-date-table-exists.md b/content/kb/bpa-date-table-exists.md new file mode 100644 index 00000000..682572a9 --- /dev/null +++ b/content/kb/bpa-date-table-exists.md @@ -0,0 +1,113 @@ +--- +uid: kb.bpa-date-table-exists +title: Date Table Should Exist +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring your model includes a dedicated date table for proper time intelligence functionality. +--- + +# Date Table Should Exist + +## Overview + +This best practice rule verifies that your tabular model contains at least one properly configured date table. Date tables are essential for time intelligence calculations and ensuring consistent date-based filtering across your model. + +- Category: **Performance** + +- Severity: Medium (2) + +## Applies To + +- Model + +## Why This Matters + +A dedicated date table is essential because it: + +- **Enables time intelligence**: Functions like `DATESYTD`, `SAMEPERIODLASTYEAR`, and `TOTALYTD` require a date table +- **Ensures consistent filtering**: Provides single source of truth for date attributes +- **Improves performance**: Establishes proper calendar relationships +- **Supports custom calendars**: Enables fiscal year calculations and custom hierarchies + +Without a properly marked date table, many DAX time intelligence functions will fail or produce incorrect results. + +## When This Rule Triggers + +The rule triggers when **all** tables in your model meet the following conditions: + +1. No table has any calendars defined (`Calendars.Count = 0`) +2. No table contains a column marked as a key with `DataType = DateTime` +3. No table has `DataCategory = "Time"` + +This indicates that the model lacks a proper date dimension. + +## How to Fix + +### Option 1: Create a Date Table Using DAX + +Add a calculated table with a complete date range: + +```dax +DateTable = +ADDCOLUMNS ( + CALENDAR (DATE(2020, 1, 1), DATE(2030, 12, 31)), + "Year", YEAR([Date]), + "Quarter", "Q" & FORMAT([Date], "Q"), + "Month", FORMAT([Date], "MMMM"), + "MonthNumber", MONTH([Date]), + "Day", DAY([Date]), + "WeekDay", FORMAT([Date], "dddd") +) +``` + +### Option 2: Import from Data Source + +Create a date dimension table in your data warehouse or data source and import it into the model. + +### Mark as Date Table + +After creating the table: + +1. Select the date table in the **TOM Explorer** +2. Right-click and choose **Mark as Date Table** +3. Select the date column as the key column +4. Create relationships between the date table and your fact tables + +### Set Calendar Metadata + +Alternatively, configure the calendar metadata: + +1. Select the date table +2. In the **Properties** pane, expand **Calendars** +3. Add a new calendar and configure the date column reference + +## Example + +A typical date table structure: + +| Date | Year | Quarter | Month | MonthNumber | Day | +|------|------|---------|-------|-------------|-----| +| 2025-01-01 | 2025 | Q1 | January | 1 | 1 | +| 2025-01-02 | 2025 | Q1 | January | 1 | 2 | +| ... | ... | ... | ... | ... | ... | + +Once created, establish relationships: + +``` +'DateTable'[Date] (1) -> (*) 'Sales'[OrderDate] +'DateTable'[Date] (1) -> (*) 'Orders'[ShipDate] +``` + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Remove Auto Date Table](xref:kb.bpa-remove-auto-date-table) - Removing automatic date tables that duplicate functionality + +## Learn More + +- [Create Date Tables in Power BI](https://learn.microsoft.com/power-bi/guidance/model-date-tables) +- [Time Intelligence Functions in DAX](https://learn.microsoft.com/dax/time-intelligence-functions-dax) +- [Mark as Date Table](https://learn.microsoft.com/power-bi/transform-model/desktop-date-tables) diff --git a/content/kb/bpa-do-not-summarize-numeric.md b/content/kb/bpa-do-not-summarize-numeric.md new file mode 100644 index 00000000..de97647f --- /dev/null +++ b/content/kb/bpa-do-not-summarize-numeric.md @@ -0,0 +1,119 @@ +--- +uid: kb.bpa-do-not-summarize-numeric +title: Set SummarizeBy to None for Numeric Columns +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule preventing incorrect default aggregations on numeric columns that should not be summed. +--- + +# Set SummarizeBy to None for Numeric Columns + +## Overview + +This best practice rule identifies visible numeric columns (Int64, Decimal, Double) that have a default aggregation behavior (`SummarizeBy`) other than `None`. Most numeric columns should not be automatically aggregated, as summing values like IDs, quantities in non-additive contexts, or codes produces meaningless results. + +- Category: **Formatting** + +- Severity: High (3) + +## Applies To + +- Data Columns +- Calculated Columns +- Calculated Table Columns + +## Why This Matters + +Default aggregation on inappropriate columns causes serious issues: + +- **Incorrect analysis**: Users get meaningless totals (sum of CustomerIDs, etc.) +- **Misleading dashboards**: Visualizations show wrong numbers by default +- **User confusion**: Users must manually change aggregation for every visual +- **Wrong decisions**: Business decisions based on incorrect automatic aggregations +- **Data credibility**: Users lose trust in the model and data + +Common columns that should NOT be aggregated include IDs, keys, codes, ratios, percentages, and non-additive quantities. + +## When This Rule Triggers + +The rule triggers when a column meets ALL these conditions: + +```csharp +(DataType = "Int64" or DataType="Decimal" or DataType="Double") +and +SummarizeBy <> "None" +and not (IsHidden or Table.IsHidden) +``` + +In other words: visible numeric columns that have a summarization behavior other than "None". + +## How to Fix + +### Automatic Fix + +This rule includes an automatic fix: + +```csharp +SummarizeBy = AggregateFunction.None +``` + +To apply: +1. In the **Best Practice Analyzer** select flagged objects +3. Click **Apply Fix** + +### Manual Fix + +1. In **TOM Explorer**, locate the column +2. In **Properties** pane, find **Summarize By** +3. Change from **Sum**, **Average**, **Min**, **Max**, **Count**, or **DistinctCount** to **None** +4. Save changes + +## Common Causes + +### Cause 1: Default Import Behavior + +Numeric columns default to Sum aggregation during import. + +### Cause 2: Lack of Column Review + +Models deployed without reviewing column aggregation settings. + +### Cause 3: ID Columns Not Hidden + +Numeric ID columns remain visible with default Sum aggregation. + +## Example + +### Before Fix + +``` +Column: CustomerID + DataType: Int64 + SummarizeBy: Sum +``` + +**Result**: Visual shows "Sum of CustomerID: 12,456,789" (meaningless number) + +### After Fix + +``` +Column: CustomerID + DataType: Int64 + SummarizeBy: None +``` + +**Result**: Visual requires explicit aggregation or shows individual Customer IDs + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Hide Foreign Keys](xref:kb.bpa-hide-foreign-keys) - Related column hygiene rule +- [Format String for Columns](xref:kb.bpa-format-string-columns) - Column formatting + +## Learn More + +- [Column Properties](https://learn.microsoft.com/analysis-services/tabular-models/column-properties-ssas-tabular) +- [When to Use Measures vs. Calculated Columns](https://learn.microsoft.com/power-bi/transform-model/desktop-tutorial-create-measures) diff --git a/content/kb/bpa-expression-required.md b/content/kb/bpa-expression-required.md new file mode 100644 index 00000000..0e76abf9 --- /dev/null +++ b/content/kb/bpa-expression-required.md @@ -0,0 +1,98 @@ +--- +uid: kb.bpa-expression-required +title: Expression Required for Calculated Objects +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring measures, calculated columns, and calculation items have valid DAX expressions. +--- + +# Expression Required for Calculated Objects + +## Overview + +This best practice rule identifies measures, calculated columns, and calculation items that lack a DAX expression. All calculated objects must have a valid, non-empty expression to function correctly and prevent errors during model deployment and query execution. + +- Category: **Error Prevention** + +- Severity: High (3) + +## Applies To + +- Measures +- Calculated Columns +- Calculation Items + +## Why This Matters + +Calculated objects without expressions will cause critical failures: + +- **Model validation errors**: The model will fail validation when saved or deployed +- **Query failures**: Attempts to use the object in queries will generate errors +- **Broken dependencies**: Other measures or calculations referencing the object will fail +- **Deployment blockers**: Power BI Service and Analysis Services will reject models with empty expressions +- **Unexpected behavior**: The object may appear in field lists but produce no results + +Empty expressions typically result from incomplete object creation, copy/paste operations, or programmatic model generation errors. + +## When This Rule Triggers + +The rule triggers when any of the following objects have an empty or whitespace-only expression: + +```csharp +string.IsNullOrWhiteSpace(Expression) +``` + +This applies to: +- **Measures**: Should contain a DAX aggregation or calculation +- **Calculated Columns**: Should contain a row-context DAX expression +- **Calculation Items**: Should contain a DAX expression modifying the base measure + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, locate the measure, calculated column, or calculation item +2. Double-click to open the **DAX Editor** +3. Enter a valid DAX expression +4. Validate the syntax and save + +## Common Causes + +### Cause 1: Incomplete Creation + +Object was created intending to define it later but was forgotten. + +### Cause 2: Template-Based Creation + +Scripts or templates created objects without expressions. + +### Cause 3: Failed Copy Operation + +Copied an object but the expression didn't transfer. + +## Example + +### Before Fix + +``` +Measure: [Total Revenue] + Expression: [empty] + FormatString: $#,0.00 +``` + +**Error when queried**: "The expression for measure '[Total Revenue]' is not valid." + +### After Fix + +``` +Measure: [Total Revenue] + Expression: SUM('Sales'[Revenue]) + FormatString: $#,0.00 +``` + +**Result**: Measure functions correctly and returns aggregated revenue. + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + diff --git a/content/kb/bpa-format-string-columns.md b/content/kb/bpa-format-string-columns.md new file mode 100644 index 00000000..e36aa703 --- /dev/null +++ b/content/kb/bpa-format-string-columns.md @@ -0,0 +1,84 @@ +--- +uid: kb.bpa-format-string-columns +title: Provide Format String for Numeric and Date Columns +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring visible numeric and date columns have appropriate format strings for consistent display. +--- + +# Provide Format String for Numeric and Date Columns + +## Overview + +This best practice rule identifies visible columns with numeric or date data types that lack format strings. Format strings ensure consistent, professional data display across all client tools. + +- Category: **Formatting** + +- Severity: Medium (2) + +## Applies To + +- Data Columns +- Calculated Columns +- Calculated Table Columns + +## Why This Matters + +Columns without format strings display inconsistently: + +- **Unprofessional appearance**: Raw numbers like 1234567.89 instead of $1,234,567.89 +- **User confusion**: Users can't tell if values are currency, percentages, or plain numbers +- **Inconsistent formatting**: Different visuals may show different formats +- **Manual formatting burden**: Users must format every visual individually +- **Date ambiguity**: Dates show timestamps when only dates are needed + +## When This Rule Triggers + +```csharp +IsVisible +and string.IsNullOrWhitespace(FormatString) +and (DataType = "Int64" or DataType = "DateTime" or DataType = "Double" or DataType = "Decimal") +``` + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, select the column +2. In **Properties** pane, locate the **Format String** field +3. Choose from standard formats or enter custom format +4. Save changes + +## Common Causes + +### Cause 1: Missing Format Definition + +Columns do not have a format string when imported. + +## Example + +### Before Fix + +``` +Column: SalesAmount +Format String: (empty) +``` + +**Display**: 1234567.89 (hard to read, no currency symbol) + +### After Fix + +``` +Column: SalesAmount +Format String: "$#,0.00" +``` + +**Display**: $1,234,567.89 (clear, professional formatting) + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Provide Format String for Measures](xref:kb.bpa-format-string-measures) - Similar validation for measures diff --git a/content/kb/bpa-format-string-measures.md b/content/kb/bpa-format-string-measures.md new file mode 100644 index 00000000..3f150e64 --- /dev/null +++ b/content/kb/bpa-format-string-measures.md @@ -0,0 +1,105 @@ +--- +uid: kb.bpa-format-string-measures +title: Provide Format String for Measures +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring visible measures have appropriate format strings for consistent display. +--- + +# Provide Format String for Measures + +## Overview + +This best practice rule identifies visible measures with numeric or date data types that lack format strings. All measures should have explicit format strings for professional, consistent display. + +- Category: **Formatting** + +- Severity: Medium (2) + +## Applies To + +- Measures + +## Why This Matters + +Measures without format strings display raw values, causing user confusion and inconsistent reporting. Format strings ensure: + +- **Professional appearance**: Values display with appropriate currency, percentage, or number formatting +- **Consistency**: All reports show values in the same format +- **User confidence**: Properly formatted numbers are easier to read and interpret +- **Business alignment**: Formatting matches corporate standards + +## When This Rule Triggers + +```csharp +IsVisible +and string.IsNullOrWhitespace(FormatString) +and (DataType = "Int64" or DataType = "DateTime" or DataType = "Double" or DataType = "Decimal") +``` + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, select the measure +2. In **Properties** pane, locate the **Format String** field +3. Enter an appropriate format string based on what the measure calculates +4. Save changes + +### Common Format Patterns + +```dax +Total Revenue = +SUM('Sales'[Amount]) +// Format String: "$#,0" + +Average Price = +AVERAGE('Sales'[UnitPrice]) +// Format String: "$#,0.00" + +YoY Growth = +DIVIDE([This Year] - [Last Year], [Last Year], 0) +// Format String: "0.0%" + +Order Count = +COUNTROWS('Orders') +// Format String: "#,0" +``` + +## Common Causes + +### Cause 1: Missing Format Definition + +When creating a new measure the defualt state is to not have any format string set. + +### Cause 2: Copy/Paste from Calculated Columns + +Copying measures from columns that don't require format strings. + +## Example + +### Before Fix + +```dax +Total Revenue = SUM('Sales'[Amount]) +// No Format String +``` + +**Display**: 1234567.89 (hard to read, no currency symbol) + +### After Fix + +```dax +Total Revenue = SUM('Sales'[Amount]) +// Format String: "$#,0" +``` + +**Display**: $1,234,568 (clear, professional formatting) + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Format String for Columns](xref:kb.bpa-format-string-columns) - Similar validation for columns diff --git a/content/kb/bpa-hide-foreign-keys.md b/content/kb/bpa-hide-foreign-keys.md new file mode 100644 index 00000000..84dffd1b --- /dev/null +++ b/content/kb/bpa-hide-foreign-keys.md @@ -0,0 +1,118 @@ +--- +uid: kb.bpa-hide-foreign-keys +title: Hide Foreign Key Columns +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule for hiding foreign key columns to simplify the model for end users. +--- + +# Hide Foreign Key Columns + +## Overview + +This best practice rule identifies foreign key columns (many-side of relationships) that are visible to end users. Foreign keys should be hidden because they serve only as relationship connectors and provide no analytical value when displayed. + +- Category: **Formatting** + +- Severity: Medium (2) + +## Applies To + +- Data Columns +- Calculated Columns +- Calculated Table Columns + +## Why This Matters + +Visible foreign key columns create unnecessary clutter: + +- **User confusion**: Foreign keys look like useful data but duplicate dimension attributes +- **Redundant fields**: Users see both the key and the related dimension attributes +- **Larger field lists**: More objects to scroll through finding relevant fields +- **Incorrect usage**: Users may group by keys instead of proper dimension attributes +- **Poor visualizations**: Charts showing key values instead of descriptive names + +Foreign keys exist only to create relationships between tables. Once relationships are established, users should work with dimension attributes, not the foreign keys themselves. + +## When This Rule Triggers + +The rule triggers when a column is: + +1. Used as the "from" column in a relationship (many-side) +2. The relationship has many cardinality on the from-side +3. The column is visible (`IsHidden = false`) + +```csharp +UsedInRelationships.Any(FromColumn.Name == current.Name and FromCardinality == "Many") +and +IsHidden == false +``` + +## How to Fix + +### Automatic Fix + +This rule includes an automatic fix: + +```csharp +IsHidden = true +``` + +To apply: +1. In the **Best Practice Analyzer** select flagged foreign key columns +2. Click **Apply Fix** + +### Manual Fix + +1. In **TOM Explorer**, locate the foreign key column +2. In **Properties** pane, set **IsHidden** to **true** +3. Save changes + +## Common Causes + +### Cause 1: Incomplete Model Setup + +Foreign keys remain visible after creating relationships. + +### Cause 2: Bulk Import + +Tables imported without post-processing to hide foreign keys. + +### Cause 3: Legacy Models + +Older models where foreign key hiding wasn't enforced. + +## Example + +### Before Fix + +``` +Sales Table Fields (visible): + - OrderDate + - CustomerKey ← Foreign key (should be hidden) + - ProductKey ← Foreign key (should be hidden) + - SalesAmount + - Quantity +``` + +**User experience**: Field list is cluttered. Users might mistakenly use `Sales[CustomerKey]` instead of `Customer[CustomerName]`. + +### After Fix + +``` +Sales Table Fields (visible): + - OrderDate + - SalesAmount + - Quantity +``` + +**User experience**: Clean field list. Users naturally use dimension attributes, relationship filtering works automatically. + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Set SummarizeBy to None for Numeric Columns](xref:kb.bpa-do-not-summarize-numeric) - Related column configuration +- [Format String for Columns](xref:kb.bpa-format-string-columns) - Column display settings diff --git a/content/kb/bpa-many-to-many-single-direction.md b/content/kb/bpa-many-to-many-single-direction.md new file mode 100644 index 00000000..42bde8a1 --- /dev/null +++ b/content/kb/bpa-many-to-many-single-direction.md @@ -0,0 +1,115 @@ +--- +uid: kb.bpa-many-to-many-single-direction +title: Many-to-Many Relationships Should Use Single Direction +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule to avoid performance issues by using single-direction filtering on many-to-many relationships. +--- + +# Many-to-Many Relationships Should Use Single Direction + +## Overview + +This best practice rule identifies many-to-many relationships that use bidirectional cross-filtering. Many-to-many relationships with both-directions filtering cause significant performance degradation. + +- Category: **Performance** +- Severity: Medium (2) + +## Applies To + +- Relationships + +## Why This Matters + +- **Severe performance impact**: Engine must evaluate filters in both directions +- **Memory consumption**: Additional filter contexts maintained +- **Ambiguous filter paths**: Multiple routes produce unexpected results +- **Complex DAX logic**: Debugging filter context becomes difficult +- **Risk circular dependencies**: Can lead to infinite evaluation loops + +## When This Rule Triggers + +The rule triggers when a relationship meets all conditions: + +1. `FromCardinality = "Many"` +2. `ToCardinality = "Many"` +3. `CrossFilteringBehavior = "BothDirections"` + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, locate the flagged relationship +2. In **Properties** pane, find `Cross Filter Direction` +3. Change from **Both** to **Single** + +Choose direction based on typical filter flow: +- From dimension to fact +- From lookup to data table + +When opposite-direction filtering is needed, handle explicitly in measures: + +```dax +SalesWithCrossFilter = +CALCULATE( + SUM('Sales'[Amount]), + CROSSFILTER('BridgeTable'[Key], 'DimensionTable'[Key], Both) +) +``` + +## Common Causes + +### Cause 1: Default Both-Direction Setting + +Model designer applied bidirectional filtering by default. + +### Cause 2: Misunderstood Requirements + +Believed both-direction filtering was necessary for all scenarios. + +### Cause 3: Quick Fix Approach + +Used both-direction filtering to solve a specific problem without considering performance. + +## Example + +### Before Fix + +``` +'Sales' (Many) <--> (Many) 'ProductBridge' +Cross Filter Direction: Both ← Problem +``` + +### After Fix + +``` +'Sales' (Many) --> (Many) 'ProductBridge' +Cross Filter Direction: Single +``` + +When Products need to filter Sales, use DAX: + +```dax +SalesForSelectedProducts = +VAR SelectedProducts = VALUES('Products'[ProductKey]) +RETURN +CALCULATE( + SUM('Sales'[Amount]), + TREATAS(SelectedProducts, 'ProductBridge'[ProductKey]) +) +``` + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Relationship Data Types Must Match](xref:kb.bpa-relationship-same-datatype) - Ensuring relationship integrity + +## Learn More + +- [Many-to-Many Relationships in Power BI](https://learn.microsoft.com/power-bi/transform-model/desktop-many-to-many-relationships) +- [Relationship Cross-Filtering](https://learn.microsoft.com/power-bi/transform-model/desktop-relationships-understand) +- [DAX CROSSFILTER Function](https://dax.guide/crossfilter/) +- [DAX TREATAS Function](https://dax.guide/treatas) diff --git a/content/kb/bpa-perspectives-no-objects.md b/content/kb/bpa-perspectives-no-objects.md new file mode 100644 index 00000000..7491c4e7 --- /dev/null +++ b/content/kb/bpa-perspectives-no-objects.md @@ -0,0 +1,89 @@ +--- +uid: kb.bpa-perspectives-no-objects +title: Perspectives Should Contain Objects +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule for removing empty perspectives that contain no visible objects. +--- + +# Perspectives Should Contain Objects + +## Overview + +This best practice rule identifies perspectives that don't contain any visible tables. Empty perspectives serve no purpose and should be removed. + +- Category: **Maintenance** +- Severity: Low (1) + +## Applies To + +- Perspectives + +## Why This Matters + +- **User confusion**: Empty perspectives appear in client tools but show no data + +## When This Rule Triggers + +The rule triggers when a perspective has no visible tables: + +```csharp +Model.Tables.Any(InPerspective[current.Name]) == false +``` + +## How to Fix + +### Automatic Fix + +This rule includes an automatic fix that deletes the empty perspective: + +```csharp +Delete() +``` + +To apply: +1. Run the **Best Practice Analyzer** +2. Select the empty perspectives +3. Click **Apply Fix** + +### Manual Fix + +1. In **TOM Explorer**, expand the **Perspectives** node +2. Right-click the empty perspective +3. Select **Delete** + +## Common Causes + +### Cause 1: Removed All Tables + +All tables removed from perspective without deleting it. + +### Cause 2: Incomplete Configuration + +Perspective created during design but never populated. + +## Example + +### Before Fix + +``` +Perspectives: + - Sales (contains: Sales, Customer, Product tables) ✓ + - Marketing (contains: NO TABLES) ✗ +``` + +### After Fix + +``` +Perspectives: + - Sales (contains: Sales, Customer, Product tables) ✓ +``` + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Learn More + +- [Perspectives in Tabular Models](https://learn.microsoft.com/analysis-services/tabular-models/perspectives-ssas-tabular) + diff --git a/content/kb/bpa-powerbi-latest-compatibility.md b/content/kb/bpa-powerbi-latest-compatibility.md new file mode 100644 index 00000000..c531b366 --- /dev/null +++ b/content/kb/bpa-powerbi-latest-compatibility.md @@ -0,0 +1,86 @@ +--- +uid: kb.bpa-powerbi-latest-compatibility +title: Use Latest Compatibility Level for Power BI Models +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring Power BI models use the latest compatibility level for optimal features and performance. +--- + +# Use Latest Compatibility Level for Power BI Models + +## Overview + +This rule identifies Power BI models not using the latest available compatibility level. Using the latest level ensures access to newest features, performance optimizations, and bug fixes. + +- Category: **Governance** +- Severity: High (3) + +## Applies To + +- Model (Power BI semantic models only) + +## Why This Matters + +- **Missing features**: New DAX functions and model capabilities unavailable +- **Future compatibility**: Easier upgrades when using recent levels + +## When This Rule Triggers + +For Power BI models, triggers when compatibility level is below current maximum: + +```csharp +Model.Database.CompatibilityMode=="PowerBI" +and Model.Database.CompatibilityLevel<>[CurrentMaxLevel] +``` + +## How to Fix + +### Automatic Fix + +The best practice rule includes an automatic fix that sets the Compatability Level to the highest avaliable that exist on the current installation of Tabular Editor 3. If you have an older version of Tabular Editor 3 installed you should update your installation. + +```csharp +Model.Database.CompatibilityLevel = [PowerBIMaxCompatibilityLevel] +``` + +### Manual Fix + +1. In Tabular Editor, go to **Model** properties +2. Set **Compatibility Level** to the latest version +3. Test all DAX expressions and features +4. Deploy to Power BI Service + +## Common Causes + +### Cause 1: Model Created in Power BI Desktop + +Model created with in Power BI Desktop does not necesarily have the latest Compatability Level. + +### Cause 2: Model Created at Lower Level + +Model created with older version of Power BI Desktop. + +### Cause 3: Conservative Approach + +Team policy to delay upgrades. + +## Example + +### Before Fix + +``` +Model Compatibility Level: 1500 +Current Maximum Level: 1700 +``` + +### After Fix + +``` +Model Compatibility Level: 1700 (Latest) +``` + +Access to new features like enhanced calculation groups and field parameters. + +## Compatibility Level + +This rule applies to Power BI models at all compatibility levels. \ No newline at end of file diff --git a/content/kb/bpa-relationship-same-datatype.md b/content/kb/bpa-relationship-same-datatype.md new file mode 100644 index 00000000..a428edbc --- /dev/null +++ b/content/kb/bpa-relationship-same-datatype.md @@ -0,0 +1,92 @@ +--- +uid: kb.bpa-relationship-same-datatype +title: Relationship Columns Must Have Same Data Type +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring relationships connect columns with matching data types to prevent errors and performance issues. +--- + +# Relationship Columns Must Have Same Data Type + +## Overview + +This best practice rule identifies relationships where the connected columns have mismatched data types. Both columns in a relationship must share the same data type to ensure proper filtering, prevent errors, and maintain optimal query performance. + +- Category: **Error Prevention** + +- Severity: High (3) + +## Applies To + +- Relationships + +## Why This Matters + +Relationships with mismatched data types cause serious problems: + +- **Model validation errors**: The model may fail to save or deploy +- **Relationship creation failures**: Power BI and Analysis Services may reject the relationship +- **Implicit conversions**: Expensive data type conversions on every query +- **Incorrect results**: Type coercion leads to unexpected filtering behavior +- **Performance degradation**: Converting data types during queries slows execution +- **Memory overhead**: Additional memory required for conversion buffers + +## When This Rule Triggers + +The rule triggers when: + +```csharp +FromColumn.DataType != ToColumn.DataType +``` + +This detects relationships connecting columns with different data types. + +## How to Fix + +### Manual Fix + +1. Identify which column should change data type +2. Change the data type in **Power Query**, in the underlying data source or in the model +3. Delete the existing relationship +4. Create a new relationship between the corrected columns +5. Verify filtering works correctly + +## Common Causes + +### Cause 1: Inconsistent Data Type Choices + +Different data types chosen for the same logical key during import or table creation. + +### Cause 2: Source System Differences + +Foreign keys imported from different source systems with different type conventions. + +### Cause 3: DateTime vs Date Mismatch + +Fact tables using DateTime columns while date dimensions use Date type. + +## Example + +### Before Fix + +``` +Relationship: Sales[CustomerID] (Int64) → Customers[CustomerID] (String) +``` + +**Error**: Relationship fails validation or creates performance issues with implicit conversion + +### After Fix + +``` +Relationship: Sales[CustomerID] (Int64) → Customers[CustomerID] (Int64) +``` + +**Result**: Relationship works efficiently with no type conversion overhead + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Many-to-Many Relationships Should Use Single Direction](xref:kb.bpa-many-to-many-single-direction) - Relationship performance optimization diff --git a/content/kb/bpa-remove-auto-date-table.md b/content/kb/bpa-remove-auto-date-table.md new file mode 100644 index 00000000..240ed4e9 --- /dev/null +++ b/content/kb/bpa-remove-auto-date-table.md @@ -0,0 +1,106 @@ +--- +uid: kb.bpa-remove-auto-date-table +title: Remove Auto Date Tables +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule to identify and remove automatically generated date tables that increase model size and reduce performance. +--- + +# Remove Auto Date Tables + +## Overview + +This best practice rule identifies automatically generated date tables created by Power BI Desktop. These auto-generated tables (`DateTableTemplate_` and `LocalDateTable_`) should be removed in favor of a single, explicit date table to optimize model size and performance. + +- Category: **Performance** + +- Severity: Medium (2) + +## Applies To + +- Tables +- Calculated Tables + +## Why This Matters + +Power BI automatically creates hidden date tables for every date/datetime column when "Auto Date/Time" is enabled. This causes issues: + +- **Increased model size**: Each auto-generated table adds unnecessary data +- **Memory overhead**: Multiple date tables consume more memory than one shared table +- **Slower refresh**: Additional tables increase refresh duration + +A single, well-designed date table is far more efficient and maintainable. + +## When This Rule Triggers + +The rule triggers when it finds calculated tables with names that: + +- Start with `"DateTableTemplate_"`, or +- Start with `"LocalDateTable_"` + +These prefixes indicate Power BI's automatically generated date tables. + +## How to Fix + +### Manual Fix + +1. Disable **Auto Date/Time** in Power BI Desktop (**File** > **Options** > **Data Load**) +2. Create a dedicated date table. +3. Mark it as a date table and create relationships to fact tables +4. In **TOM Explorer**, delete tables starting with `DateTableTemplate_` or `LocalDateTable_` +5. Verify custom date table relationships work correctly + +## Common Causes + +### Cause 1: Auto Date/Time Feature Enabled + +Power BI Desktop's "Auto Date/Time" feature automatically creates these tables. + +### Cause 2: Migrated Models + +Models created with auto tables enabled and never cleaned up. + +### Cause 3: Default Settings + +New models use default settings which enable auto date tables. + +## Example + +### Before Fix + +``` +Tables: + - Sales + - LocalDateTable_OrderDate (hidden, auto-generated) + - LocalDateTable_ShipDate (hidden, auto-generated) + - Products + - LocalDateTable_ReleaseDate (hidden, auto-generated) +``` + +**Result**: Multiple hidden tables inflate model size + +### After Fix + +``` +Tables: + - Sales + - Products + - DateTable (explicit, marked as date table) + -> Relationships to Sales[OrderDate], Sales[ShipDate], Products[ReleaseDate] +``` + +**Result**: Single efficient date table serves all date relationships + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Date Table Should Exist](xref:kb.bpa-date-table-exists) - Ensuring a proper date table is present + +## Learn More + +- [Disable Auto Date/Time in Power BI](https://learn.microsoft.com/power-bi/guidance/auto-date-time) +- [Create Date Tables](https://learn.microsoft.com/power-bi/guidance/model-date-tables) +- [Date Table Best Practices](https://www.sqlbi.com/articles/creating-a-simple-date-table-in-dax/) diff --git a/content/kb/bpa-remove-unused-data-sources.md b/content/kb/bpa-remove-unused-data-sources.md new file mode 100644 index 00000000..cced3cbe --- /dev/null +++ b/content/kb/bpa-remove-unused-data-sources.md @@ -0,0 +1,120 @@ +--- +uid: kb.bpa-remove-unused-data-sources +title: Remove Unused Data Sources +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule for removing orphaned data sources to reduce model complexity and improve maintainability. +--- + +# Remove Unused Data Sources + +## Overview + +This best practice rule identifies data sources that are not referenced by any partitions or table expressions. Removing unused data sources reduces model complexity, improves maintainability, and prevents confusion. + +Category: **Maintenance** + +Severity: Low (1) + +## Applies To + +- Provider Data Sources +- Structured Data Sources + +## Why This Matters + +Unused data sources create unnecessary overhead: + +- **Maintenance burden**: Credentials and connection strings must be maintained for unused connections +- **Security concerns**: Unnecessary connection strings may expose sensitive information +- **Model complexity**: Extra objects clutter the data source list +- **Confusion**: Developers may mistakenly use obsolete data sources +- **Deployment issues**: Unused data sources may reference systems that no longer exist +- **Documentation overhead**: Extra objects require explanation in model documentation + +Unused data sources typically result from: +- Refactoring partitions to use different sources +- Consolidating multiple sources into one +- Removing tables without cleaning up their data sources +- Testing alternative connection methods + +## When This Rule Triggers + +The rule triggers when a data source meets all these conditions: + +```csharp +UsedByPartitions.Count() == 0 +and not Model.Tables.Any(SourceExpression.Contains(OuterIt.Name)) +and not Model.AllPartitions.Any(Query.Contains(OuterIt.Name)) +``` + +In other words: +1. No partitions directly reference the data source +2. No table source expressions (M queries) reference the data source by name +3. No partition queries contain the data source name + +## How to Fix + +### Automatic Fix + +This rule includes an automatic fix that deletes the unused data source: + +```csharp +Delete() +``` + +To apply: +1. In the **Best Practice Analyzer** select flagged objects +3. Click **Apply Fix** + +### Manual Fix + +1. In **TOM Explorer**, expand the **Data Sources** node +2. Right-click the unused data source +3. Select **Delete** +4. Confirm the deletion + +### Before Deleting + +Verify the data source is truly unused: +- Check all partitions in all tables +- Search M expressions for references to the data source name +- Review custom expressions and calculated tables +- Ensure no documentation references the connection + +## Example + +### Before Fix + +``` +Data Sources: + - SQLServer_Production (Provider, used by Sales partition) + - SQLServer_Staging (Provider, NOT USED) ← Remove + - AzureSQL_Archive (Structured, NOT USED) ← Remove + - PowerQuery_Web (Structured, used by Product partition) +``` + +### After Fix + +``` +Data Sources: + - SQLServer_Production (Provider, used by Sales partition) + - PowerQuery_Web (Structured, used by Product partition) +``` + +**Result**: Simpler model with only necessary data sources + +## False Positives + +### Dynamic References + +The rule may flag data sources that are: +- Referenced through dynamic M expressions using variables +- Used in commented-out partition queries +- Referenced by name in annotations or descriptions + +**Solution**: Manually verify before deleting; add comments or annotations if the data source should be kept for documentation purposes. + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. \ No newline at end of file diff --git a/content/kb/bpa-set-isavailableinmdx-false.md b/content/kb/bpa-set-isavailableinmdx-false.md new file mode 100644 index 00000000..4c4bace9 --- /dev/null +++ b/content/kb/bpa-set-isavailableinmdx-false.md @@ -0,0 +1,91 @@ +--- +uid: kb.bpa-set-isavailableinmdx-false +title: Set IsAvailableInMDX to False +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule to optimize performance by disabling MDX access for hidden columns that are not used in relationships or hierarchies. +--- + +# Set IsAvailableInMDX to False + +## Overview + +This best practice rule identifies hidden columns that have the `IsAvailableInMDX` property set to `true` but don't need to be accessible through MDX queries. Setting this property to `false` for unused hidden columns can improve query performance and reduce memory overhead. + +- Category: **Performance** +- Severity: Medium (2) + +## Applies To + +- Data Columns +- Calculated Columns +- Calculated Table Columns + +## Why This Matters + +When a column has `IsAvailableInMDX` set to `true`, the Analysis Services engine maintains additional metadata and structures to support MDX queries against that column. For hidden columns that aren't used in relationships, hierarchies, variations, calendars, or as sort-by columns, this overhead is unnecessary and can: + +- Increase memory consumption +- Slow down query processing +- Add complexity to the model metadata + +By explicitly setting `IsAvailableInMDX` to `false` for these columns, you optimize the model for DAX-only scenarios, which is the primary query language for Power BI and modern Analysis Services models. + +## When This Rule Triggers + +The rule triggers when all of the following conditions are met: + +1. The column has `IsAvailableInMDX = true` +2. The column is hidden (or its table is hidden) +3. The column is NOT used in any `SortBy` relationships +4. The column is NOT used in any hierarchies +5. The column is NOT used in any variations +6. The column is NOT used in any calendars +7. The column is NOT serving as a `SortByColumn` for another column + +## How to Fix + +### Automatic Fix + +This rule includes an automatic fix expression. When you apply the fix in the Best Practice Analyzer: + +```csharp +IsAvailableInMDX = false +``` +To apply: +1. In the **Best Practice Analyzer** select flagged objects +3. Click **Apply Fix** + +### Manual Fix + +1. In the **TOM Explorer**, locate the flagged column +2. In the **Properties** pane, find the `IsAvailableInMDX` property +3. Set the value to `false` +4. Save your changes + +## Example + +Consider a hidden calculated column used only for intermediate calculations: + +```dax +_TempCalculation = +CALCULATE( + SUM('Sales'[Amount]), + ALLEXCEPT('Sales', 'Sales'[ProductKey]) +) +``` + +If this column is: +- Hidden from client tools +- Not used in any hierarchies or relationships +- Not referenced by sort operations + +Then setting `IsAvailableInMDX = false` is recommended for optimal performance. + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Set IsAvailableInMDX to True When Necessary](xref:kb.bpa-set-isavailableinmdx-true-necessary) - The complementary rule ensuring columns that need MDX access have it enabled diff --git a/content/kb/bpa-set-isavailableinmdx-true-necessary.md b/content/kb/bpa-set-isavailableinmdx-true-necessary.md new file mode 100644 index 00000000..eff2ac93 --- /dev/null +++ b/content/kb/bpa-set-isavailableinmdx-true-necessary.md @@ -0,0 +1,144 @@ +--- +uid: kb.bpa-set-isavailableinmdx-true-necessary +title: Set IsAvailableInMDX to True When Necessary +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule preventing query errors by ensuring columns used in hierarchies and relationships have MDX availability enabled. +--- + +# Set IsAvailableInMDX to True When Necessary + +## Overview + +This best practice rule identifies columns that have `IsAvailableInMDX` set to `false` but are actually used in scenarios requiring MDX access. These columns must have MDX availability enabled to function correctly in hierarchies, relationships, and sort operations. + +- Category: **Error Prevention** +- Severity: High (3) + +## Applies To + +- Data Columns +- Calculated Columns +- Calculated Table Columns + +## Why This Matters + +When a column is used in certain model structures, the Analysis Services engine requires MDX access to that column. Disabling MDX access for columns that need it causes: + +- **Query failures**: Hierarchies and sort operations fail with errors +- **Broken visualizations**: Charts and tables using affected hierarchies display errors +- **Relationship problems**: MDX queries against relationships may fail +- **Calendar/variation errors**: Time intelligence features break +- **Unpredictable behavior**: Some queries work while others fail depending on client tool + +Columns need `IsAvailableInMDX = true` when they are: +- Used in hierarchies as levels +- Referenced as sort-by columns +- Used in variations (alternate hierarchies) +- Part of calendar definitions +- Serving as sort-by targets for other columns + +## When This Rule Triggers + +The rule triggers when a column has `IsAvailableInMDX = false` AND any of these conditions are true: + +```csharp +IsAvailableInMDX = false +and +( + UsedInSortBy.Any() + or + UsedInHierarchies.Any() + or + UsedInVariations.Any() + or + UsedInCalendars.Any() + or + SortByColumn != null +) +``` + +The rule checks these dependency collections: + +| Property | Description | Example Usage | +|----------|-------------|---------------| +| `UsedInHierarchies` | Hierarchies where column is a level | Product hierarchy levels | +| `UsedInSortBy` | Columns using this as sort key | Month names sorted by month number | +| `UsedInVariations` | Alternate hierarchies using column | Product variations | +| `UsedInCalendars` | Calendar metadata references | Date table calendar definitions | +| `SortByColumn` | Column sorts by another column | This column has a sort-by reference | + +## How to Fix + +### Automatic Fix + +This rule includes an automatic fix: + +```csharp +IsAvailableInMDX = true +``` + +To apply: +1. In the **Best Practice Analyzer** select flagged objects +3. Click **Apply Fix** + +### Manual Fix + +1. In **TOM Explorer**, locate the flagged column +2. In **Properties** pane, find `IsAvailableInMDX` +3. Set the value to `true` +4. Save and test affected hierarchies/sorts + +## Common Scenarios + +### Scenario 1: Hierarchy Level Column + +**Problem**: A column used as a hierarchy level has MDX disabled + +```dax +Hierarchy: Geography + Levels: + - Country + - State (IsAvailableInMDX = false) ← Problem + - City +``` + +**Error**: "The hierarchy 'Geography' cannot be used because one of its levels is not available in MDX." + +**Solution**: Set `State[IsAvailableInMDX] = true` + +### Scenario 2: Sort-By Column + +**Problem**: A column serving as a sort-by target has MDX disabled + +``` +Month Name column: + - SortByColumn = MonthNumber + - MonthNumber.IsAvailableInMDX = false ← Problem +``` + +**Error**: Months display in alphabetical order instead of calendar order + +**Solution**: Set `MonthNumber[IsAvailableInMDX] = true` + +### Scenario 3: Calendar Definition + +**Problem**: A date column used in calendar metadata has MDX disabled + +``` +DateTable: + - Calendar uses DateKey column + - DateKey.IsAvailableInMDX = false ← Problem +``` + +**Error**: Time intelligence functions fail + +**Solution**: Set `DateKey[IsAvailableInMDX] = true` + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Set IsAvailableInMDX to False](xref:kb.bpa-set-isavailableinmdx-false) - The complementary optimization rule diff --git a/content/kb/bpa-specify-application-name.md b/content/kb/bpa-specify-application-name.md new file mode 100644 index 00000000..05db057c --- /dev/null +++ b/content/kb/bpa-specify-application-name.md @@ -0,0 +1,70 @@ +--- +uid: kb.bpa-specify-application-name +title: Specify Application Name in Connection Strings +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule for including application name in SQL Server connection strings to enable monitoring and troubleshooting. +--- + +# Specify Application Name in Connection Strings + +## Overview + +This rule identifies SQL Server provider data sources that lack an Application Name parameter in their connection strings. Including the application name enables better monitoring and troubleshooting. + +- Category: **Performance** +- Severity: Low (1) + +## Applies To + +- Provider Data Sources + +## Why This Matters + +- **Query tracking**: DBAs can identify which application generated queries +- **Performance monitoring**: Isolate tabular model queries for analysis +- **Troubleshooting**: Quickly identify source of problem queries +- **Auditing**: Track data access by application + +## When This Rule Triggers + +This rule triggers when a data source meets both of these conditions: + +1. The connection string uses a SQL Server provider (contains `SQLNCLI`, `SQLOLEDB`, or `MSOLEDBSQL`) +2. The connection string does NOT include an `Application Name` parameter + +In other words, the rule identifies SQL Server connections that are missing the application name identifier. + +## How to Fix + +### Manual Fix + +Add Application Name to your connection string: + +``` +Provider=MSOLEDBSQL;Data Source=ServerName;Initial Catalog=DatabaseName;Application Name=Tabular Editor;Integrated Security=SSPI; +``` + +## Example + +### Before Fix + +``` +Provider=MSOLEDBSQL;Data Source=localhost;Initial Catalog=AdventureWorks; +``` + +### After Fix + +``` +Provider=MSOLEDBSQL;Data Source=localhost;Initial Catalog=AdventureWorks;Application Name=Sales Model; +``` + +Result: Queries now identifiable in SQL Server monitoring tools. + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Remove Unused Data Sources](xref:kb.bpa-remove-unused-data-sources) - Data source maintenance diff --git a/content/kb/bpa-translate-descriptions.md b/content/kb/bpa-translate-descriptions.md new file mode 100644 index 00000000..35d897f7 --- /dev/null +++ b/content/kb/bpa-translate-descriptions.md @@ -0,0 +1,99 @@ +--- +uid: kb.bpa-translate-descriptions +title: Translate Descriptions for All Cultures +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring object descriptions are translated for all defined cultures. +--- + +# Translate Descriptions for All Cultures + +## Overview + +This rule identifies objects with descriptions that lack translations for one or more cultures. + +- Category: **Model Layout** +- Severity: Low (1) + +## Applies To + +- Model +- Tables +- Measures +- Hierarchies +- Levels +- Perspectives +- Data Columns +- Calculated Columns +- Calculated Tables +- Calculated Table Columns + +## Why This Matters + +- **Incomplete localization**: Descriptions display in default language only +- **Inconsistent help text**: Users see mix of languages +- **User confusion**: Documentation appears incomplete +- **Professional appearance**: Missing translations reduce model quality + +## When This Rule Triggers + +```csharp +not string.IsNullOrEmpty(Description) +and Model.Cultures.Any(string.IsNullOrEmpty(outerIt.TranslatedDescriptions[it])) +``` +This rule triggers when an object meets both of these conditions: + +1. The object has a description (not empty) +2. At least one culture in the model is missing a translation for that description + +In other words, if you have descriptions and multiple cultures defined, all descriptions should be translated for all cultures. + + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, select the object +2. In **Properties** pane, expand **Translated Descriptions** +3. Enter translation for each culture + +## Common Causes + +### Cause 1: New Descriptions Added + +Descriptions created without translations. + +### Cause 2: Culture Added Later + +Culture added after descriptions were written. + +### Cause 3: Incomplete Translation + +Translation process didn't cover descriptions. + +## Example + +### Before Fix + +``` +Measure: [Total Revenue] +Description (English): "Sum of all revenue" +Description (Spanish): (missing) +``` + +### After Fix + +``` +Measure: [Total Revenue] +Description (English): "Sum of all revenue" +Description (Spanish): "Suma de todos los ingresos" +``` + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Translate Visible Names](xref:kb.bpa-translate-visible-names) - Translating object names +- [Translate Display Folders](xref:kb.bpa-translate-display-folders) - Translating display folders diff --git a/content/kb/bpa-translate-display-folders.md b/content/kb/bpa-translate-display-folders.md new file mode 100644 index 00000000..64c7ba21 --- /dev/null +++ b/content/kb/bpa-translate-display-folders.md @@ -0,0 +1,104 @@ +--- +uid: kb.bpa-translate-display-folders +title: Translate Display Folders for All Cultures +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring display folders are translated for all defined cultures. +--- + +# Translate Display Folders for All Cultures + +## Overview + +This rule identifies visible objects with display folders that lack translations for one or more cultures. + +- Category: **Model Layout** +- Severity: Low (1) + +## Applies To + +- Measures +- Hierarchies +- Data Columns +- Calculated Columns +- Calculated Table Columns + +## Why This Matters + +- **Incomplete localization**: Display folders show in default language only +- **Inconsistent navigation**: Partially translated folder structure +- **User confusion**: Organization appears incomplete +- **Professional appearance**: Missing translations reduce model quality + +## When This Rule Triggers + +This rule triggers when an object meets all three of these conditions: + +1. The object is **visible** to end users (not hidden) +2. The object has a **display folder** assigned (organizing it into a folder structure) +3. At least one culture in the model is **missing a translation** for that display folder + +In plain language: visible objects that are organized in display folders should have those folder names translated for all cultures in your model. + +```csharp +IsVisible +and not string.IsNullOrEmpty(DisplayFolder) +and Model.Cultures.Any(string.IsNullOrEmpty(outerIt.TranslatedDisplayFolders[it])) +``` + +## How to Fix + +### Automatic Fix + +```csharp +TranslatedDisplayFolders.Reset() +``` + +Resets translations to use the default display folder. + +### Manual Fix + +1. Select object in **TOM Explorer** +2. Expand **Translated Display Folders** in properties +3. Enter translation for each culture + +## Common Causes + +### Cause 1: New Display Folders Added + +Display folders created without translations. + +### Cause 2: Culture Added Later + +Culture added after display folders were defined. + +### Cause 3: Incomplete Translation + +Translation workflow didn't cover display folders. + +## Example + +### Before Fix + +``` +Measure: [Total Sales] +Display Folder (English): "Sales Metrics" +Display Folder (French): (missing) +``` + +### After Fix + +``` +Measure: [Total Sales] +Display Folder (English): "Sales Metrics" +Display Folder (French): "Métriques de Vente" +``` + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Translate Visible Names](xref:kb.bpa-translate-visible-names) - Translating object names +- [Translate Descriptions](xref:kb.bpa-translate-descriptions) - Translating descriptions diff --git a/content/kb/bpa-translate-hierarchy-levels.md b/content/kb/bpa-translate-hierarchy-levels.md new file mode 100644 index 00000000..386bba89 --- /dev/null +++ b/content/kb/bpa-translate-hierarchy-levels.md @@ -0,0 +1,92 @@ +--- +uid: kb.bpa-translate-hierarchy-levels +title: Translate Hierarchy Level Names for All Cultures +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring hierarchy level names are translated for all defined cultures. +--- + +# Translate Hierarchy Level Names for All Cultures + +## Overview + +This rule identifies hierarchy levels in visible hierarchies that lack name translations for one or more cultures. + +- Category: **Model Layout** +- Severity: Low (1) + +## Applies To + +- Levels (within hierarchies) + +## Why This Matters + +- **Incomplete localization**: Level names display in default language only +- **Inconsistent experience**: Partially translated hierarchies +- **User confusion**: Navigation appears incomplete +- **Professional appearance**: Missing translations reduce quality + +## When This Rule Triggers + +This rule triggers when a hierarchy level meets both of these conditions: + +1. The hierarchy containing the level is **visible** to end users +2. At least one culture in the model is **missing a translation** for the level name + +That is if you have visible hierarchies with multiple cultures, all the level names within those hierarchies should be translated for each culture. + +```csharp +Hierarchy.IsVisible +and Model.Cultures.Any(string.IsNullOrEmpty(outerIt.TranslatedNames[it])) +``` + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, select the level +2. In **Properties** pane, expand **Translated Names** +3. Enter translation for each culture + +## Common Causes + +### Cause 1: New Levels Added + +Levels created without translations. + +### Cause 2: Culture Added Later + +Culture added after hierarchy was created. + +### Cause 3: Incomplete Translation + +Translation process didn't cover all hierarchy levels. + +## Example + +### Before Fix + +``` +Hierarchy: Geography + Level: Country + English: "Country" + Spanish: (missing) +``` + +### After Fix + +``` +Hierarchy: Geography + Level: Country + English: "Country" + Spanish: "País" +``` + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Translate Visible Names](xref:kb.bpa-translate-visible-names) - Translating object names +- [Translate Perspectives](xref:kb.bpa-translate-perspectives) - Translating perspective names diff --git a/content/kb/bpa-translate-perspectives.md b/content/kb/bpa-translate-perspectives.md new file mode 100644 index 00000000..05556dc3 --- /dev/null +++ b/content/kb/bpa-translate-perspectives.md @@ -0,0 +1,87 @@ +--- +uid: kb.bpa-translate-perspectives +title: Translate Perspective Names for All Cultures +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring perspective names are translated for all defined cultures. +--- + +# Translate Perspective Names for All Cultures + +## Overview + +This rule identifies model perspectives that lack name translations for one or more cultures. + +- Category: **Model Layout** +- Severity: Low (1) + +## Applies To + +- Model +- Perspectives + +## Why This Matters + +- **Incomplete localization**: Perspectives display in default language only +- **Inconsistent experience**: Mix of translated and untranslated perspective names +- **User confusion**: Expected language support not available +- **Professional appearance**: Incomplete translations reduce model quality + +## When This Rule Triggers + +This rule triggers when a perspective has: + +- At least one culture in the model that is **missing a translation** for the perspective name + +```csharp +Model.Cultures.Any(string.IsNullOrEmpty(outerIt.TranslatedNames[it])) +``` + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, select the perspective +2. In **Properties** pane, expand **Translated Names** +3. Enter translation for each culture + +## Common Causes + +### Cause 1: New Perspectives Added + +Perspectives created without translations. + +### Cause 2: Culture Added Later + +Culture added after perspectives were defined. + +### Cause 3: Incomplete Translation + +Translation workflow didn't cover perspectives. + +## Example + +### Before Fix + +``` +Perspective: "Sales Analysis" +English: "Sales Analysis" +German: (missing) +``` + +### After Fix + +``` +Perspective: "Sales Analysis" +English: "Sales Analysis" +German: "Vertriebsanalyse" +``` + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Translate Visible Names](xref:kb.bpa-translate-visible-names) - Translating object names +- [Translate Descriptions](xref:kb.bpa-translate-descriptions) - Translating descriptions diff --git a/content/kb/bpa-translate-visible-names.md b/content/kb/bpa-translate-visible-names.md new file mode 100644 index 00000000..64a85cbc --- /dev/null +++ b/content/kb/bpa-translate-visible-names.md @@ -0,0 +1,99 @@ +--- +uid: kb.bpa-translate-visible-names +title: Translate Visible Object Names for All Cultures +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring visible object names are translated for all defined cultures. +--- + +# Translate Visible Object Names for All Cultures + +## Overview + +This rule identifies visible objects whose names lack translations for one or more cultures defined in the model. + +- Category: **Model Layout** +- Severity: Low (1) + +## Applies To + +- Tables +- Measures +- Hierarchies +- Data Columns +- Calculated Columns +- Calculated Tables +- Calculated Table Columns + +## Why This Matters + +- **Incomplete localization**: Users in different cultures see untranslated names +- **Inconsistent experience**: Mix of translated and untranslated content +- **User confusion**: Expected language support not provided +- **Professional appearance**: Incomplete translations appear unpolished + +## When This Rule Triggers + +This rule triggers when an object meets both of these conditions: + +1. The object is **visible** to end users (not hidden) +2. At least one culture in the model is **missing a translation** for the object name + +In other words visible objects with multiple cultures defined should have their names translated for each culture. + +```csharp +IsVisible +and Model.Cultures.Any(string.IsNullOrEmpty(outerIt.TranslatedNames[it])) +``` + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, select the object +2. In **Properties** pane, expand **Translated Names** +3. Enter translation for each culture +4. Save changes + +## Common Causes + +### Cause 1: New Objects Added + +New objects created without translations. + +### Cause 2: Culture Added Later + +Culture added to model after objects were created. + +### Cause 3: Incomplete Translation Process + +Translation workflow didn't cover all objects. + +## Example + +### Before Fix + +``` +Measure: [Total Sales] +English: "Total Sales" +Spanish: (missing) +French: (missing) +``` + +### After Fix + +``` +Measure: [Total Sales] +English: "Total Sales" +Spanish: "Total de Ventas" +French: "Total des Ventes" +``` + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Translate Perspectives](xref:kb.bpa-translate-perspectives) - Translating perspective names +- [Translate Descriptions](xref:kb.bpa-translate-descriptions) - Translating descriptions diff --git a/content/kb/bpa-trim-object-names.md b/content/kb/bpa-trim-object-names.md new file mode 100644 index 00000000..9318b2e1 --- /dev/null +++ b/content/kb/bpa-trim-object-names.md @@ -0,0 +1,103 @@ +--- +uid: kb.bpa-trim-object-names +title: Trim Leading and Trailing Spaces from Object Names +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule for removing leading and trailing spaces from object names to prevent confusion and referencing issues. +--- + +# Trim Leading and Trailing Spaces from Object Names + +## Overview + +This best practice rule identifies objects whose names contain leading or trailing spaces. These unnecessary spaces cause DAX referencing issues, display problems, and general confusion. + +- Category: **Naming Conventions** +- Severity: Low (1) + +## Applies To + +- Model +- Tables +- Measures +- Hierarchies +- Levels +- Perspectives +- Partitions +- Provider Data Sources +- Data Columns +- Calculated Columns +- Calculated Tables +- Calculated Table Columns +- Structured Data Sources +- Named Expressions +- Model Roles +- Calculation Groups +- Calculation Items + +## Why This Matters + +- **DAX syntax problems**: Extra spaces require careful bracket notation +- **Display inconsistency**: Objects appear misaligned in field lists +- **Search difficulties**: Users may not find objects when searching +- **Maintenance confusion**: Developers may create duplicates not noticing spaces + +## When This Rule Triggers + +The rule triggers when an object name starts or ends with a space: + +```csharp +Name.StartsWith(" ") or Name.EndsWith(" ") +``` + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, locate the object +2. Right-click and select **Rename** (or press F2) +3. Remove leading/trailing spaces +4. Press Enter to confirm + +## Common Causes + +### Cause 1: Accidental Spacebar Presses + +Accidental spacebar presses during naming. + +### Cause 2: Copy/Paste from External Sources + +Copy/paste from documents with formatting. + +### Cause 3: Dublicating objects + +When dublicating objects the name with have an added " copy" post-fixed. It is easy to miss deleting the space before "copy" + +## Example + +### Before Fix + +``` +Measures: + - Total Sales + - Total Sales (with spaces - appears different!) +``` + +DAX: `[ Total Sales]` - Which one? + +### After Fix + +``` +Measures: + - Total Sales (single consistent measure) +``` + +DAX: `[Total Sales]` - Unambiguous + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +## Related Rules + +- [Avoid Invalid Characters in Names](xref:kb.bpa-avoid-invalid-characters-names) - Related naming hygiene rule diff --git a/content/kb/bpa-visible-objects-no-description.md b/content/kb/bpa-visible-objects-no-description.md new file mode 100644 index 00000000..7685d2b2 --- /dev/null +++ b/content/kb/bpa-visible-objects-no-description.md @@ -0,0 +1,106 @@ +--- +uid: kb.bpa-visible-objects-no-description +title: Visible Objects Should Have Descriptions +author: Morten Lønskov +updated: 2026-01-09 +description: Best practice rule ensuring visible model objects have descriptions to improve discoverability and user experience. +--- + +# Visible Objects Should Have Descriptions + +## Overview + +This best practice rule identifies visible tables, columns, measures, calculation groups, and user-defined functions that lack descriptions. Adding descriptions improves model usability, documentation quality, and user experience. + +- Category: **Maintenance** + +- Severity: Low (1) + +## Applies To + +- Tables +- Calculated Tables +- Data Columns +- Calculated Columns +- Calculated Table Columns +- Measures +- Calculation Groups +- User-Defined Functions (Compatibility Level 1702+) + +## Why This Matters + +Descriptions provide critical context for model users: + +- **Improved discoverability**: Users understand field purpose before using them +- **Better self-service BI**: Business users can work independently with clear guidance +- **Reduced support burden**: Fewer questions about field definitions +- **Enhanced tooltips**: Power BI and Excel show descriptions in hover tooltips +- **Documentation foundation**: Descriptions form the basis for automated documentation +- **Governance and compliance**: Descriptions can include data lineage and business definitions +- **Useage by AI**: AI Agents can better infer the purpose of an object if it has a description. +Without descriptions, users guess at field meanings, leading to incorrect analysis and increased support requests. + +## When This Rule Triggers + +The rule triggers when an object is **visible** AND has an empty or whitespace-only description: + +```csharp +string.IsNullOrWhitespace(Description) +and +IsHidden == false +``` + +**Note**: Hidden objects are excluded because they are not meant for end-user consumption. + +## How to Fix + +### Manual Fix + +1. In **TOM Explorer**, select the object +2. In **Properties** pane, locate the **Description** field +3. Enter a clear, concise description +4. Save changes + +## Common Causes + +### Cause 1: Missing Documentation During Development + +Objects created without adding descriptions. + +### Cause 2: Rapid Prototyping + +Models built quickly without proper documentation. + +### Cause 3: Legacy Models + +Older models created before description standards were established. + +## Example + +### Before Fix + +``` +Measure: [Total Revenue] +Description: (empty) +``` + +**User experience**: Tooltip shows no information, users must guess measure purpose. + +### After Fix + +``` +Measure: [Total Revenue] +Description: "Total revenue excluding taxes and discounts. Calculated as SUM(Sales[UnitPrice] * Sales[Quantity]). Use for financial reporting." +``` + +**User experience**: Clear tooltip helps users understand and correctly use the measure. + +## Compatibility Level + +This rule applies to models with compatibility level **1200** and higher. + +User-Defined Function descriptions are validated at compatibility level **1702** and higher. + +## Related Rules + +- [Avoid Invalid Characters in Descriptions](xref:kb.bpa-avoid-invalid-characters-descriptions) - Ensuring description quality From f1f83c7f0976482fad5dfe77c8829ceeb6a44c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20L=C3=B8nskov?= Date: Fri, 9 Jan 2026 20:38:42 +0100 Subject: [PATCH 2/6] Fixed bold formatting issue --- content/kb/bpa-avoid-invalid-characters-descriptions.md | 3 +-- content/kb/bpa-avoid-invalid-characters-names.md | 2 +- content/kb/bpa-avoid-provider-partitions-structured.md | 2 +- content/kb/bpa-calculation-groups-no-items.md | 2 +- content/kb/bpa-data-column-source.md | 2 +- content/kb/bpa-date-table-exists.md | 2 +- content/kb/bpa-do-not-summarize-numeric.md | 2 +- content/kb/bpa-expression-required.md | 2 +- content/kb/bpa-format-string-columns.md | 2 +- content/kb/bpa-format-string-measures.md | 2 +- content/kb/bpa-hide-foreign-keys.md | 2 +- content/kb/bpa-many-to-many-single-direction.md | 2 +- content/kb/bpa-perspectives-no-objects.md | 2 +- content/kb/bpa-powerbi-latest-compatibility.md | 2 +- content/kb/bpa-relationship-same-datatype.md | 2 +- content/kb/bpa-remove-auto-date-table.md | 2 +- content/kb/bpa-remove-unused-data-sources.md | 7 ++----- content/kb/bpa-set-isavailableinmdx-false.md | 2 +- content/kb/bpa-set-isavailableinmdx-true-necessary.md | 2 +- content/kb/bpa-specify-application-name.md | 2 +- content/kb/bpa-translate-descriptions.md | 2 +- content/kb/bpa-translate-display-folders.md | 2 +- content/kb/bpa-translate-hierarchy-levels.md | 2 +- content/kb/bpa-translate-perspectives.md | 2 +- content/kb/bpa-translate-visible-names.md | 2 +- 25 files changed, 26 insertions(+), 30 deletions(-) diff --git a/content/kb/bpa-avoid-invalid-characters-descriptions.md b/content/kb/bpa-avoid-invalid-characters-descriptions.md index 0c322b1c..abd0bd25 100644 --- a/content/kb/bpa-avoid-invalid-characters-descriptions.md +++ b/content/kb/bpa-avoid-invalid-characters-descriptions.md @@ -12,8 +12,7 @@ description: Best practice rule preventing display and deployment issues by iden This best practice rule identifies objects whose descriptions contain invalid control characters (non-printable characters excluding standard whitespace). These characters can cause display problems, metadata corruption, and deployment failures. -- Category: **Error Prevention** - +- Category: Error Prevention - Severity: High (3) ## Applies To diff --git a/content/kb/bpa-avoid-invalid-characters-names.md b/content/kb/bpa-avoid-invalid-characters-names.md index 6dcda095..be43497c 100644 --- a/content/kb/bpa-avoid-invalid-characters-names.md +++ b/content/kb/bpa-avoid-invalid-characters-names.md @@ -12,7 +12,7 @@ description: Best practice rule preventing deployment errors by identifying cont This best practice rule identifies objects whose names contain invalid control characters (non-printable characters excluding standard whitespace). These characters can cause deployment failures, rendering issues, and data corruption. -- Category: **Error Prevention** +- Category: Error Prevention - Severity: High (3) ## Applies To diff --git a/content/kb/bpa-avoid-provider-partitions-structured.md b/content/kb/bpa-avoid-provider-partitions-structured.md index e6654042..c0f3a440 100644 --- a/content/kb/bpa-avoid-provider-partitions-structured.md +++ b/content/kb/bpa-avoid-provider-partitions-structured.md @@ -12,7 +12,7 @@ description: Best practice rule preventing deployment errors by identifying lega This best practice rule identifies partitions that use legacy provider-based queries (SourceType = Query) with structured data sources in Power BI models. This combination is not supported in Power BI Service and will cause deployment failures. -- Category: **Error Prevention** +- Category: Error Prevention - Severity: Medium (2) diff --git a/content/kb/bpa-calculation-groups-no-items.md b/content/kb/bpa-calculation-groups-no-items.md index 58d66019..486293ab 100644 --- a/content/kb/bpa-calculation-groups-no-items.md +++ b/content/kb/bpa-calculation-groups-no-items.md @@ -12,7 +12,7 @@ description: Best practice rule identifying calculation groups without calculati This best practice rule identifies calculation groups that contain no calculation items. Empty calculation groups serve no purpose and should be populated or removed. -- Category: **Maintenance** +- Category: Maintenance - Severity: Medium (2) ## Applies To diff --git a/content/kb/bpa-data-column-source.md b/content/kb/bpa-data-column-source.md index f9a29af0..9bc9e55b 100644 --- a/content/kb/bpa-data-column-source.md +++ b/content/kb/bpa-data-column-source.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring data columns have a valid source column This best practice rule identifies data columns that lack a valid `SourceColumn` property. Every data column must reference a source column from the underlying data source to function correctly during refresh. -- Category: **Error Prevention** +- Category: Error Prevention - Severity: High (3) ## Applies To diff --git a/content/kb/bpa-date-table-exists.md b/content/kb/bpa-date-table-exists.md index 682572a9..97931246 100644 --- a/content/kb/bpa-date-table-exists.md +++ b/content/kb/bpa-date-table-exists.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring your model includes a dedicated date ta This best practice rule verifies that your tabular model contains at least one properly configured date table. Date tables are essential for time intelligence calculations and ensuring consistent date-based filtering across your model. -- Category: **Performance** +- Category: Performance - Severity: Medium (2) diff --git a/content/kb/bpa-do-not-summarize-numeric.md b/content/kb/bpa-do-not-summarize-numeric.md index de97647f..f29ab822 100644 --- a/content/kb/bpa-do-not-summarize-numeric.md +++ b/content/kb/bpa-do-not-summarize-numeric.md @@ -12,7 +12,7 @@ description: Best practice rule preventing incorrect default aggregations on num This best practice rule identifies visible numeric columns (Int64, Decimal, Double) that have a default aggregation behavior (`SummarizeBy`) other than `None`. Most numeric columns should not be automatically aggregated, as summing values like IDs, quantities in non-additive contexts, or codes produces meaningless results. -- Category: **Formatting** +- Category: Formatting - Severity: High (3) diff --git a/content/kb/bpa-expression-required.md b/content/kb/bpa-expression-required.md index 0e76abf9..5dd370ef 100644 --- a/content/kb/bpa-expression-required.md +++ b/content/kb/bpa-expression-required.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring measures, calculated columns, and calcu This best practice rule identifies measures, calculated columns, and calculation items that lack a DAX expression. All calculated objects must have a valid, non-empty expression to function correctly and prevent errors during model deployment and query execution. -- Category: **Error Prevention** +- Category: Error Prevention - Severity: High (3) diff --git a/content/kb/bpa-format-string-columns.md b/content/kb/bpa-format-string-columns.md index e36aa703..69428333 100644 --- a/content/kb/bpa-format-string-columns.md +++ b/content/kb/bpa-format-string-columns.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring visible numeric and date columns have a This best practice rule identifies visible columns with numeric or date data types that lack format strings. Format strings ensure consistent, professional data display across all client tools. -- Category: **Formatting** +- Category: Formatting - Severity: Medium (2) diff --git a/content/kb/bpa-format-string-measures.md b/content/kb/bpa-format-string-measures.md index 3f150e64..7b4cf80f 100644 --- a/content/kb/bpa-format-string-measures.md +++ b/content/kb/bpa-format-string-measures.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring visible measures have appropriate forma This best practice rule identifies visible measures with numeric or date data types that lack format strings. All measures should have explicit format strings for professional, consistent display. -- Category: **Formatting** +- Category: Formatting - Severity: Medium (2) diff --git a/content/kb/bpa-hide-foreign-keys.md b/content/kb/bpa-hide-foreign-keys.md index 84dffd1b..62717d39 100644 --- a/content/kb/bpa-hide-foreign-keys.md +++ b/content/kb/bpa-hide-foreign-keys.md @@ -12,7 +12,7 @@ description: Best practice rule for hiding foreign key columns to simplify the m This best practice rule identifies foreign key columns (many-side of relationships) that are visible to end users. Foreign keys should be hidden because they serve only as relationship connectors and provide no analytical value when displayed. -- Category: **Formatting** +- Category: Formatting - Severity: Medium (2) diff --git a/content/kb/bpa-many-to-many-single-direction.md b/content/kb/bpa-many-to-many-single-direction.md index 42bde8a1..fdcadb21 100644 --- a/content/kb/bpa-many-to-many-single-direction.md +++ b/content/kb/bpa-many-to-many-single-direction.md @@ -12,7 +12,7 @@ description: Best practice rule to avoid performance issues by using single-dire This best practice rule identifies many-to-many relationships that use bidirectional cross-filtering. Many-to-many relationships with both-directions filtering cause significant performance degradation. -- Category: **Performance** +- Category: Performance - Severity: Medium (2) ## Applies To diff --git a/content/kb/bpa-perspectives-no-objects.md b/content/kb/bpa-perspectives-no-objects.md index 7491c4e7..13772524 100644 --- a/content/kb/bpa-perspectives-no-objects.md +++ b/content/kb/bpa-perspectives-no-objects.md @@ -12,7 +12,7 @@ description: Best practice rule for removing empty perspectives that contain no This best practice rule identifies perspectives that don't contain any visible tables. Empty perspectives serve no purpose and should be removed. -- Category: **Maintenance** +- Category: Maintenance - Severity: Low (1) ## Applies To diff --git a/content/kb/bpa-powerbi-latest-compatibility.md b/content/kb/bpa-powerbi-latest-compatibility.md index c531b366..bb97ccb7 100644 --- a/content/kb/bpa-powerbi-latest-compatibility.md +++ b/content/kb/bpa-powerbi-latest-compatibility.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring Power BI models use the latest compatib This rule identifies Power BI models not using the latest available compatibility level. Using the latest level ensures access to newest features, performance optimizations, and bug fixes. -- Category: **Governance** +- Category: Governance - Severity: High (3) ## Applies To diff --git a/content/kb/bpa-relationship-same-datatype.md b/content/kb/bpa-relationship-same-datatype.md index a428edbc..fb3263fd 100644 --- a/content/kb/bpa-relationship-same-datatype.md +++ b/content/kb/bpa-relationship-same-datatype.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring relationships connect columns with matc This best practice rule identifies relationships where the connected columns have mismatched data types. Both columns in a relationship must share the same data type to ensure proper filtering, prevent errors, and maintain optimal query performance. -- Category: **Error Prevention** +- Category: Error Prevention - Severity: High (3) diff --git a/content/kb/bpa-remove-auto-date-table.md b/content/kb/bpa-remove-auto-date-table.md index 240ed4e9..91451c32 100644 --- a/content/kb/bpa-remove-auto-date-table.md +++ b/content/kb/bpa-remove-auto-date-table.md @@ -12,7 +12,7 @@ description: Best practice rule to identify and remove automatically generated d This best practice rule identifies automatically generated date tables created by Power BI Desktop. These auto-generated tables (`DateTableTemplate_` and `LocalDateTable_`) should be removed in favor of a single, explicit date table to optimize model size and performance. -- Category: **Performance** +- Category: Performance - Severity: Medium (2) diff --git a/content/kb/bpa-remove-unused-data-sources.md b/content/kb/bpa-remove-unused-data-sources.md index cced3cbe..d5b82ed4 100644 --- a/content/kb/bpa-remove-unused-data-sources.md +++ b/content/kb/bpa-remove-unused-data-sources.md @@ -12,9 +12,8 @@ description: Best practice rule for removing orphaned data sources to reduce mod This best practice rule identifies data sources that are not referenced by any partitions or table expressions. Removing unused data sources reduces model complexity, improves maintainability, and prevents confusion. -Category: **Maintenance** - -Severity: Low (1) +- Category: Maintenance +- Severity: Low (1) ## Applies To @@ -106,8 +105,6 @@ Data Sources: ## False Positives -### Dynamic References - The rule may flag data sources that are: - Referenced through dynamic M expressions using variables - Used in commented-out partition queries diff --git a/content/kb/bpa-set-isavailableinmdx-false.md b/content/kb/bpa-set-isavailableinmdx-false.md index 4c4bace9..80f4c327 100644 --- a/content/kb/bpa-set-isavailableinmdx-false.md +++ b/content/kb/bpa-set-isavailableinmdx-false.md @@ -12,7 +12,7 @@ description: Best practice rule to optimize performance by disabling MDX access This best practice rule identifies hidden columns that have the `IsAvailableInMDX` property set to `true` but don't need to be accessible through MDX queries. Setting this property to `false` for unused hidden columns can improve query performance and reduce memory overhead. -- Category: **Performance** +- Category: Performance - Severity: Medium (2) ## Applies To diff --git a/content/kb/bpa-set-isavailableinmdx-true-necessary.md b/content/kb/bpa-set-isavailableinmdx-true-necessary.md index eff2ac93..5c3062cc 100644 --- a/content/kb/bpa-set-isavailableinmdx-true-necessary.md +++ b/content/kb/bpa-set-isavailableinmdx-true-necessary.md @@ -12,7 +12,7 @@ description: Best practice rule preventing query errors by ensuring columns used This best practice rule identifies columns that have `IsAvailableInMDX` set to `false` but are actually used in scenarios requiring MDX access. These columns must have MDX availability enabled to function correctly in hierarchies, relationships, and sort operations. -- Category: **Error Prevention** +- Category: Error Prevention - Severity: High (3) ## Applies To diff --git a/content/kb/bpa-specify-application-name.md b/content/kb/bpa-specify-application-name.md index 05db057c..50dbf82b 100644 --- a/content/kb/bpa-specify-application-name.md +++ b/content/kb/bpa-specify-application-name.md @@ -12,7 +12,7 @@ description: Best practice rule for including application name in SQL Server con This rule identifies SQL Server provider data sources that lack an Application Name parameter in their connection strings. Including the application name enables better monitoring and troubleshooting. -- Category: **Performance** +- Category: Performance - Severity: Low (1) ## Applies To diff --git a/content/kb/bpa-translate-descriptions.md b/content/kb/bpa-translate-descriptions.md index 35d897f7..24a01fb4 100644 --- a/content/kb/bpa-translate-descriptions.md +++ b/content/kb/bpa-translate-descriptions.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring object descriptions are translated for This rule identifies objects with descriptions that lack translations for one or more cultures. -- Category: **Model Layout** +- Category: Model Layout - Severity: Low (1) ## Applies To diff --git a/content/kb/bpa-translate-display-folders.md b/content/kb/bpa-translate-display-folders.md index 64c7ba21..a8b7bb38 100644 --- a/content/kb/bpa-translate-display-folders.md +++ b/content/kb/bpa-translate-display-folders.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring display folders are translated for all This rule identifies visible objects with display folders that lack translations for one or more cultures. -- Category: **Model Layout** +- Category: Model Layout - Severity: Low (1) ## Applies To diff --git a/content/kb/bpa-translate-hierarchy-levels.md b/content/kb/bpa-translate-hierarchy-levels.md index 386bba89..63265dc2 100644 --- a/content/kb/bpa-translate-hierarchy-levels.md +++ b/content/kb/bpa-translate-hierarchy-levels.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring hierarchy level names are translated fo This rule identifies hierarchy levels in visible hierarchies that lack name translations for one or more cultures. -- Category: **Model Layout** +- Category: Model Layout - Severity: Low (1) ## Applies To diff --git a/content/kb/bpa-translate-perspectives.md b/content/kb/bpa-translate-perspectives.md index 05556dc3..8a14a954 100644 --- a/content/kb/bpa-translate-perspectives.md +++ b/content/kb/bpa-translate-perspectives.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring perspective names are translated for al This rule identifies model perspectives that lack name translations for one or more cultures. -- Category: **Model Layout** +- Category: Model Layout - Severity: Low (1) ## Applies To diff --git a/content/kb/bpa-translate-visible-names.md b/content/kb/bpa-translate-visible-names.md index 64a85cbc..db2d51f6 100644 --- a/content/kb/bpa-translate-visible-names.md +++ b/content/kb/bpa-translate-visible-names.md @@ -12,7 +12,7 @@ description: Best practice rule ensuring visible object names are translated for This rule identifies visible objects whose names lack translations for one or more cultures defined in the model. -- Category: **Model Layout** +- Category: Model Layout - Severity: Low (1) ## Applies To From e0d36039c41a744e8dd50cf3391d32bbefe122f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20L=C3=B8nskov?= Date: Fri, 9 Jan 2026 20:39:22 +0100 Subject: [PATCH 3/6] Initial Documentation for built in BPA rules --- content/features/built-in-bpa-rules.md | 190 +++++++++++++++++++++++++ content/features/toc.md | 1 + 2 files changed, 191 insertions(+) create mode 100644 content/features/built-in-bpa-rules.md diff --git a/content/features/built-in-bpa-rules.md b/content/features/built-in-bpa-rules.md new file mode 100644 index 00000000..311d7811 --- /dev/null +++ b/content/features/built-in-bpa-rules.md @@ -0,0 +1,190 @@ +--- +uid: built-in-bpa-rules +title: Built-in BPA Rules +author: Morten Lønskov +updated: 2026-01-09 +applies_to: + products: + - product: Tabular Editor 2 + none: true + - product: Tabular Editor 3 + since: 3.24.0 + editions: + - edition: Desktop + none: true + - edition: Business + none: true + - edition: Enterprise + full: true +description: Enterprise Edition feature providing 27 curated best practice rules hardcoded into Tabular Editor 3 with knowledge base integration. +--- + +# Built-in BPA Rules + +## Overview + +Tabular Editor 3 Enterprise Edition includes 27 built-in best practice rules. These rules cover common issues in semantic model development and are updated automatically with each release. + +Unlike custom rules stored in JSON files, built-in rules: +- Are integrated directly into the application +- Update automatically with new releases +- Link to knowledge base documentation +- Are read-only to ensure consistency across teams +- Work immediately without configuration + +## Key Features + +### Rule Categories + +The 27 built-in rules cover four areas: +- **Error Prevention**: Invalid characters, missing expressions, data type mismatches +- **Performance**: Relationships, partitions, aggregations +- **Formatting**: Format strings, visibility, naming conventions +- **Maintenance**: Descriptions, calculation groups, unused objects + +### Global and Per-Rule Control + +![Placeholder: Screenshot showing BPA preferences with global enable/disable toggle and per-rule checkboxes](~/content/assets/images/features/bpa-built-in-rules-preferences.png) + +You can enable or disable built-in rules globally or individually. Settings persist across sessions and work independently from your custom rules. + +To manage built-in rules: +1. Go to **Tools** > **Preferences** > **Best Practice Analyzer** +2. Find the **Built-in Rules** section +3. Toggle **Enable Built-in Rules** to turn the entire collection on or off +4. Use the BPA Manager to enable or disable individual rules + +### Enterprise-Only Access + +Built-in BPA Rules require Enterprise Edition. If you're using Desktop or Business Edition, you can still use custom BPA rules but won't see the built-in rules. + +### First-Run Notification + +![Placeholder: Screenshot of first-run notification dialog introducing built-in BPA rules](~/content/assets/images/features/bpa-built-in-rules-notification.png) + +The first time you open a model after upgrading to a version with built-in rules, you'll see a notification explaining the feature with a link to preferences. This notification only appears once. + +### Knowledge Base Integration + +![Placeholder: Screenshot showing BPA window with rule selected and "View Documentation" button highlighted](~/content/assets/images/features/bpa-built-in-rules-kb-link.png) + +Every built-in rule links to a knowledge base article through the `KnowledgeBaseArticle` property. Each article explains what the rule checks, why it matters, and how to fix violations. + +To view documentation, select a rule in the Best Practice Analyzer window. + + +### Read-Only Protection + +Built-in rules can't be edited, cloned, or deleted. This ensures all users have the same rule definitions. You can disable individual rules, but the rule definitions themselves remain unchanged. + +![Placeholder: Screenshot showing built-in rule with read-only badge/icon in BPA window](~/content/assets/images/features/bpa-built-in-rules-readonly.png) + +### ID Collision Prevention + +Built-in rules use reserved ID prefixes. When you create a custom rule, Tabular Editor validates that your ID doesn't conflict with built-in rules and shows an error if it does. + +## Built-in Rules Catalog + +The initial release includes the following rules: + +### Error Prevention Rules +- [Avoid Invalid Characters in Object Names](xref:kb.bpa-avoid-invalid-characters-names) +- [Avoid Invalid Characters in Descriptions](xref:kb.bpa-avoid-invalid-characters-descriptions) +- [Expression Required for Calculated Objects](xref:kb.bpa-expression-required) +- [Data Column Must Have Source](xref:kb.bpa-data-column-source) +- [Relationship Columns Must Have Same Data Type](xref:kb.bpa-relationship-same-datatype) +- [Avoid Provider Partitions with Structured Data Sources](xref:kb.bpa-avoid-provider-partitions-structured) + +### Performance Rules +- [Many-to-Many Relationships Should Use Single Direction](xref:kb.bpa-many-to-many-single-direction) +- [Hide Foreign Key Columns](xref:kb.bpa-hide-foreign-keys) +- [Set SummarizeBy to None for Numeric Columns](xref:kb.bpa-do-not-summarize-numeric) +- [Remove Auto Date Tables](xref:kb.bpa-remove-auto-date-table) +- [Remove Unused Data Sources](xref:kb.bpa-remove-unused-data-sources) + +### Formatting Rules +- [Provide Format String for Measures](xref:kb.bpa-format-string-measures) +- [Provide Format String for Numeric and Date Columns](xref:kb.bpa-format-string-columns) +- [Visible Objects Should Have Descriptions](xref:kb.bpa-visible-objects-no-description) +- [Trim Object Names](xref:kb.bpa-trim-object-names) +- [Date Table Should Exist](xref:kb.bpa-date-table-exists) + +### Maintenance Rules +- [Calculation Groups Should Contain Items](xref:kb.bpa-calculation-groups-no-items) +- [Perspectives Should Contain Objects](xref:kb.bpa-perspectives-no-objects) +- [Use Latest Power BI Compatibility Level](xref:kb.bpa-powerbi-latest-compatibility) + +## Working with Built-in and Custom Rules + +Built-in and custom rules work side by side: + +| Feature | Built-in Rules | Custom Rules | +|---------|---------------|--------------| +| **Storage** | Hardcoded in application | JSON files or model annotations | +| **Updates** | Automatic with releases | Manual editing required | +| **Modification** | Read-only | Fully editable | +| **Documentation** | Integrated KB articles | User-provided descriptions | +| **Availability** | Enterprise Edition only | All editions | +| **Sharing** | Consistent across teams | Requires manual distribution | + +### Recommended Workflow + +1. Enable built-in rules for immediate coverage +2. Review violations and apply fixes +3. Disable rules that don't apply to your conventions +4. Add custom rules for organization-specific requirements +5. Use the "Ignore" feature for intentional violations + +## Best Practices + +### Onboarding Teams + +When rolling out built-in rules to your team: +- Start with all rules enabled to establish a baseline +- Review violations together and agree on which rules apply +- Document why specific rules are disabled +- Add custom rules for organization-specific requirements + +### Model Maintenance + +- Run BPA before committing changes to version control +- Fix high-severity violations immediately +- Review medium and low-severity issues regularly +- Use automatic fixes where available + +### Custom Rules + +- Don't duplicate built-in rule functionality +- Use different ID prefixes to avoid conflicts +- Document your custom rules +- Share rule collections within your team + +## Troubleshooting + +### Built-in Rules Not Appearing + +If built-in rules don't show in the BPA window: +1. Check that you're using Tabular Editor 3 Enterprise Edition +2. Verify that built-in rules are enabled in **Tools** > **Preferences** > **Best Practice Analyzer** +3. Restart Tabular Editor if you just changed preferences +4. Confirm your license is active + +### Cannot Modify Built-in Rule + +This is expected. Built-in rules are read-only. If you need different logic, create a custom rule with your expression and disable the corresponding built-in rule. + +### ID Collision Error + +Built-in rules reserve certain ID prefixes. Choose a different ID that doesn't start with `TE3_BUILT_IN`. + +## Compatibility + +- Requires Tabular Editor 3.24.0 or later +- Enterprise Edition only +- Works with all compatibility levels (1200+) + +## Next Steps + +- [Using the Best Practice Analyzer](xref:using-bpa) +- [BPA sample rules and expressions](xref:using-bpa-sample-rules-expressions) +- [Custom BPA rules](xref:best-practice-analyzer) \ No newline at end of file diff --git a/content/features/toc.md b/content/features/toc.md index b84b5325..0f9f4d80 100644 --- a/content/features/toc.md +++ b/content/features/toc.md @@ -28,6 +28,7 @@ # Model Analysis and Quality ## @best-practice-analyzer +### @built-in-bpa-rules ### @using-bpa ### @using-bpa-sample-rules-expressions ## @dax-optimizer-integration From b5f9d43ce2b064c172437fd025ad64aeb153ab89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20L=C3=B8nskov?= Date: Fri, 9 Jan 2026 20:42:04 +0100 Subject: [PATCH 4/6] remove kb articles from branch --- ...a-avoid-invalid-characters-descriptions.md | 123 --------------- .../kb/bpa-avoid-invalid-characters-names.md | 125 --------------- ...pa-avoid-provider-partitions-structured.md | 96 ------------ content/kb/bpa-calculation-groups-no-items.md | 102 ------------- content/kb/bpa-data-column-source.md | 93 ----------- content/kb/bpa-date-table-exists.md | 113 -------------- content/kb/bpa-do-not-summarize-numeric.md | 119 --------------- content/kb/bpa-expression-required.md | 98 ------------ content/kb/bpa-format-string-columns.md | 84 ---------- content/kb/bpa-format-string-measures.md | 105 ------------- content/kb/bpa-hide-foreign-keys.md | 118 -------------- .../kb/bpa-many-to-many-single-direction.md | 115 -------------- content/kb/bpa-perspectives-no-objects.md | 89 ----------- .../kb/bpa-powerbi-latest-compatibility.md | 86 ----------- content/kb/bpa-relationship-same-datatype.md | 92 ----------- content/kb/bpa-remove-auto-date-table.md | 106 ------------- content/kb/bpa-remove-unused-data-sources.md | 117 -------------- content/kb/bpa-set-isavailableinmdx-false.md | 91 ----------- ...bpa-set-isavailableinmdx-true-necessary.md | 144 ------------------ content/kb/bpa-specify-application-name.md | 70 --------- content/kb/bpa-translate-descriptions.md | 99 ------------ content/kb/bpa-translate-display-folders.md | 104 ------------- content/kb/bpa-translate-hierarchy-levels.md | 92 ----------- content/kb/bpa-translate-perspectives.md | 87 ----------- content/kb/bpa-translate-visible-names.md | 99 ------------ content/kb/bpa-trim-object-names.md | 103 ------------- .../kb/bpa-visible-objects-no-description.md | 106 ------------- 27 files changed, 2776 deletions(-) delete mode 100644 content/kb/bpa-avoid-invalid-characters-descriptions.md delete mode 100644 content/kb/bpa-avoid-invalid-characters-names.md delete mode 100644 content/kb/bpa-avoid-provider-partitions-structured.md delete mode 100644 content/kb/bpa-calculation-groups-no-items.md delete mode 100644 content/kb/bpa-data-column-source.md delete mode 100644 content/kb/bpa-date-table-exists.md delete mode 100644 content/kb/bpa-do-not-summarize-numeric.md delete mode 100644 content/kb/bpa-expression-required.md delete mode 100644 content/kb/bpa-format-string-columns.md delete mode 100644 content/kb/bpa-format-string-measures.md delete mode 100644 content/kb/bpa-hide-foreign-keys.md delete mode 100644 content/kb/bpa-many-to-many-single-direction.md delete mode 100644 content/kb/bpa-perspectives-no-objects.md delete mode 100644 content/kb/bpa-powerbi-latest-compatibility.md delete mode 100644 content/kb/bpa-relationship-same-datatype.md delete mode 100644 content/kb/bpa-remove-auto-date-table.md delete mode 100644 content/kb/bpa-remove-unused-data-sources.md delete mode 100644 content/kb/bpa-set-isavailableinmdx-false.md delete mode 100644 content/kb/bpa-set-isavailableinmdx-true-necessary.md delete mode 100644 content/kb/bpa-specify-application-name.md delete mode 100644 content/kb/bpa-translate-descriptions.md delete mode 100644 content/kb/bpa-translate-display-folders.md delete mode 100644 content/kb/bpa-translate-hierarchy-levels.md delete mode 100644 content/kb/bpa-translate-perspectives.md delete mode 100644 content/kb/bpa-translate-visible-names.md delete mode 100644 content/kb/bpa-trim-object-names.md delete mode 100644 content/kb/bpa-visible-objects-no-description.md diff --git a/content/kb/bpa-avoid-invalid-characters-descriptions.md b/content/kb/bpa-avoid-invalid-characters-descriptions.md deleted file mode 100644 index abd0bd25..00000000 --- a/content/kb/bpa-avoid-invalid-characters-descriptions.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -uid: kb.bpa-avoid-invalid-characters-descriptions -title: Avoid Invalid Characters in Descriptions -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule preventing display and deployment issues by identifying control characters in object descriptions. ---- - -# Avoid Invalid Characters in Descriptions - -## Overview - -This best practice rule identifies objects whose descriptions contain invalid control characters (non-printable characters excluding standard whitespace). These characters can cause display problems, metadata corruption, and deployment failures. - -- Category: Error Prevention -- Severity: High (3) - -## Applies To - -- Tables -- Measures -- Hierarchies -- Levels -- Perspectives -- Partitions -- Data Columns -- Calculated Columns -- Calculated Table Columns -- KPIs -- Model Roles -- Calculation Groups -- Calculation Items - -## Why This Matters - -Control characters in descriptions cause various issues: - -- **Display corruption**: Tooltips and documentation panels may show garbled text -- **Metadata problems**: TMSL/XMLA export may produce invalid XML -- **Deployment failures**: Power BI Service or Analysis Services may reject the model -- **Documentation issues**: Generated documentation may break formatting -- **Encoding errors**: Cross-platform synchronization problems -- **User confusion**: Invisible characters create confusing or corrupted descriptions - -Standard whitespace (spaces, newlines, tabs) is acceptable, but non-printable control characters should be removed. - -## When This Rule Triggers - -The rule triggers when an object's description contains control characters that are not standard whitespace: - -```csharp -Description.ToCharArray().Any(char.IsControl(it) and !char.IsWhiteSpace(it)) -``` - -This detects problematic characters while allowing legitimate whitespace formatting. - -## How to Fix - -### Automatic Fix - -This rule includes an automatic fix that replaces invalid characters with spaces: - -```csharp -Description = string.Concat( - it.Description.ToCharArray().Select( - c => (char.IsControl(c) && !char.IsWhiteSpace(c)) ? ' ' : c - ) -) -``` - -To apply: -1. In the **Best Practice Analyzer** select flagged objects -3. Click **Apply Fix** - -### Manual Fix - -1. In **TOM Explorer**, select the object -2. In **Properties** pane, locate the **Description** field -3. Edit the description to remove invalid characters -4. Save changes - -## Common Causes - -### Cause 1: Copy/Paste from Rich Text - -Copying descriptions from Word documents, web pages, or emails can introduce hidden formatting characters. - -### Cause 2: Automated Documentation Generation - -Scripts generating descriptions may include control characters from source systems. - -### Cause 3: Data Import from External Sources - -Importing metadata that contains encoding artifacts or control codes. - -## Example - -### Before Fix - -``` -Measure: [Total Revenue] -Description: "Calculates\x00total\x0Brevenue" (contains NULL and vertical tab) -``` - -Tooltip displays: "Calculates□total□revenue" (with visible corruption) - -### After Fix - -``` -Measure: [Total Revenue] -Description: "Calculates total revenue" (control characters replaced with spaces) -``` - -Tooltip displays correctly: "Calculates total revenue" - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Avoid Invalid Characters in Names](xref:kb.bpa-avoid-invalid-characters-names) - Similar validation for object names -- [Visible Objects Should Have Descriptions](xref:kb.bpa-visible-objects-no-description) - Ensuring descriptions exist diff --git a/content/kb/bpa-avoid-invalid-characters-names.md b/content/kb/bpa-avoid-invalid-characters-names.md deleted file mode 100644 index be43497c..00000000 --- a/content/kb/bpa-avoid-invalid-characters-names.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -uid: kb.bpa-avoid-invalid-characters-names -title: Avoid Invalid Characters in Object Names -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule preventing deployment errors by identifying control characters in object names. ---- - -# Avoid Invalid Characters in Object Names - -## Overview - -This best practice rule identifies objects whose names contain invalid control characters (non-printable characters excluding standard whitespace). These characters can cause deployment failures, rendering issues, and data corruption. - -- Category: Error Prevention -- Severity: High (3) - -## Applies To - -- Tables -- Measures -- Hierarchies -- Levels -- Perspectives -- Partitions -- Data Columns -- Calculated Columns -- Calculated Table Columns -- KPIs -- Model Roles -- Calculation Groups -- Calculation Items - -## Why This Matters - -Control characters in object names cause serious issues: - -- **Deployment failures**: Power BI Service and Analysis Services may reject models with invalid characters -- **Rendering problems**: Client tools may display garbled or invisible names -- **DAX parsing errors**: Invalid characters can break DAX expressions referencing the object -- **XML corruption**: Model metadata (TMSL/XMLA) may become malformed -- **Copy/paste issues**: Names may not transfer correctly between applications -- **Encoding problems**: Cross-platform compatibility issues - -Standard whitespace (spaces, newlines, carriage returns) is allowed, but control characters should be removed. - -## When This Rule Triggers - -The rule triggers when an object's name contains control characters that are not standard whitespace: - -```csharp -Name.ToCharArray().Any(char.IsControl(it) and !char.IsWhiteSpace(it)) -``` - -This detects problematic characters while allowing legitimate whitespace formatting. - -## How to Fix - -### Automatic Fix - -This rule includes an automatic fix that replaces invalid characters with spaces: - -```csharp -Name = string.Concat( - it.Name.ToCharArray().Select( - c => (char.IsControl(c) && !char.IsWhiteSpace(c)) ? ' ' : c - ) -) -``` - -To apply: -1. In the **Best Practice Analyzer** select flagged objects -2. Click **Apply Fix** - -### Manual Fix - -1. In **TOM Explorer**, select the object -2. In **Properties** pane, locate the **Name** field -3. Edit the name to remove invalid characters -4. Save changes - -## Common Causes - -### Cause 1: Copy/Paste from Rich Text - -Copying names from Word documents, web pages, or emails can introduce hidden formatting characters. - -### Cause 2: Automated Name Generation - -Scripts generating names may include control characters from source systems. - -### Cause 3: Data Import from External Sources - -Importing metadata that contains encoding artifacts or control codes. - -## Example - -### Before Fix - -``` -Measure Name: "Total\x00Sales" (contains NULL character) -``` - -Deployment fails with "Invalid character in object name" - -### After Fix - -``` -Measure Name: "Total Sales" (NULL replaced with space) -``` - -Deploys successfully and displays correctly in all tools. - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Avoid Invalid Characters in Descriptions](xref:kb.bpa-avoid-invalid-characters-descriptions) - Similar validation for description properties -- [Trim Object Names](xref:kb.bpa-trim-object-names) - Removing leading/trailing spaces - -## Learn More - -- [DAX Naming Rules](https://learn.microsoft.com/dax/dax-syntax-reference) diff --git a/content/kb/bpa-avoid-provider-partitions-structured.md b/content/kb/bpa-avoid-provider-partitions-structured.md deleted file mode 100644 index c0f3a440..00000000 --- a/content/kb/bpa-avoid-provider-partitions-structured.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -uid: kb.bpa-avoid-provider-partitions-structured -title: Avoid Provider Partitions with Structured Data Sources -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule preventing deployment errors by identifying legacy provider partitions used with structured data sources in Power BI. ---- - -# Avoid Provider Partitions with Structured Data Sources - -## Overview - -This best practice rule identifies partitions that use legacy provider-based queries (SourceType = Query) with structured data sources in Power BI models. This combination is not supported in Power BI Service and will cause deployment failures. - -- Category: Error Prevention - -- Severity: Medium (2) - -## Applies To - -- Partitions - -## Why This Matters - -Power BI Service requires structured data sources to use Power Query (M) partitions rather than legacy provider partitions. Using provider partitions with structured data sources causes: - -- **Deployment failures**: Models fail to publish to Power BI Service -- **Refresh errors**: Scheduled refresh operations fail in the service -- **Compatibility issues**: The model cannot be shared or deployed properly -- **Migration blockers**: Prevents moving from Analysis Services to Power BI - -## When This Rule Triggers - -The rule triggers when a partition meets all these conditions: - -1. `SourceType = "Query"` (legacy provider partition) -2. `DataSource.Type = "Structured"` (Power Query/M data source) -3. `Model.Database.CompatibilityMode != "AnalysisServices"` (Power BI or Azure AS) - -This combination indicates a structural mismatch that Power BI cannot process. - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, select the affected partition -2. In **Properties** pane, note the existing query -3. Create a new **Power Query** partition with M expression -4. Delete the old provider partition after verifying the new one works - -## Common Causes - -### Cause 1: Migration from Analysis Services - -Models migrated from SQL Server Analysis Services retain legacy provider partitions. - -### Cause 2: Mixed Partition Types - -Mixing partition types during model development creates incompatible configurations. - -## Example - -### Before Fix - -``` -Partition: Sales_Partition - SourceType: Query - Query: SELECT * FROM Sales - DataSource: PowerQuerySource (Type: Structured) -``` - -**Error**: Deployment fails to Power BI Service - -### After Fix - -``` -Partition: Sales_Partition - SourceType: M - Expression: - let - Source = Sql.Database("server", "database"), - Sales = Source{[Schema="dbo",Item="Sales"]}[Data] - in - Sales - DataSource: PowerQuerySource (Type: Structured) -``` - -**Result**: Deploys successfully to Power BI Service - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher when deployed to Power BI or Azure Analysis Services. - -## Related Rules - -- [Data Column Must Have Source](xref:kb.bpa-data-column-source) - Ensuring column source mappings diff --git a/content/kb/bpa-calculation-groups-no-items.md b/content/kb/bpa-calculation-groups-no-items.md deleted file mode 100644 index 486293ab..00000000 --- a/content/kb/bpa-calculation-groups-no-items.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -uid: kb.bpa-calculation-groups-no-items -title: Calculation Groups Should Contain Items -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule identifying calculation groups without calculation items that should be populated or removed. ---- - -# Calculation Groups Should Contain Items - -## Overview - -This best practice rule identifies calculation groups that contain no calculation items. Empty calculation groups serve no purpose and should be populated or removed. - -- Category: Maintenance -- Severity: Medium (2) - -## Applies To - -- Calculation Groups - -## Why This Matters - -- **Deployment errors**: Empty groups may fail validation in Power BI Service -- **Model errors**: Can cause unexpected behavior in DAX calculations -- **Developer confusion**: Team members waste time investigating incomplete structures -- **Performance overhead**: Engine processes unnecessary metadata - -## When This Rule Triggers - -The rule triggers when a calculation group has zero calculation items: - -```csharp -CalculationItems.Count == 0 -``` - -## How to Fix - -### Option 1: Add Calculation Items - -If the calculation group has a valid business purpose: - -1. In **TOM Explorer**, expand the calculation group table -2. Expand the **Calculation Group** column -3. Right-click and select **Add Calculation Item** -4. Define the calculation item expression - -### Option 2: Delete the Calculation Group - -If no longer needed: - -1. In **TOM Explorer**, locate the calculation group table -2. Right-click the table -3. Select **Delete** - -## Common Causes - -### Cause 1: Incomplete Development - -Calculation group created during planning but not yet implemented. - -### Cause 2: Migration from Other Models - -Calculation group structure copied without items. - -### Cause 3: Refactoring - -All calculation items moved to a different calculation group. - -## Example - -### Before Fix - -``` -Calculation Group: Time Intelligence - Items: (none) ← Problem -``` - -### After Fix - -``` -Calculation Group: Time Intelligence - Items: - - Current Period: SELECTEDMEASURE() - - Year-to-Date: CALCULATE(SELECTEDMEASURE(), DATESYTD('Date'[Date])) - - Prior Year: CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Date'[Date])) -``` - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Perspectives Should Contain Objects](xref:kb.bpa-perspectives-no-objects) - Similar rule for empty perspectives -- [Expression Required](xref:kb.bpa-expression-required) - Ensuring calculation items have expressions - -## Learn More - -- [Calculation Groups in Tabular Models](https://learn.microsoft.com/analysis-services/tabular-models/calculation-groups) -- [Creating Calculation Groups](https://www.sqlbi.com/articles/introducing-calculation-groups/) -- [Calculation Group Patterns](https://www.sqlbi.com/calculation-groups/) diff --git a/content/kb/bpa-data-column-source.md b/content/kb/bpa-data-column-source.md deleted file mode 100644 index 9bc9e55b..00000000 --- a/content/kb/bpa-data-column-source.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -uid: kb.bpa-data-column-source -title: Data Column Must Have Source -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring data columns have a valid source column mapping to prevent refresh errors. ---- - -# Data Column Must Have Source - -## Overview - -This best practice rule identifies data columns that lack a valid `SourceColumn` property. Every data column must reference a source column from the underlying data source to function correctly during refresh. - -- Category: Error Prevention -- Severity: High (3) - -## Applies To - -- Data Columns - -## Why This Matters - -- **Refresh failures**: Data refresh operations fail with column not found errors -- **Deployment issues**: Model validation fails in Power BI Service or Analysis Services -- **Data integrity**: Column remains empty or contains stale data -- **Broken dependencies**: Measures and relationships produce incorrect results - -## When This Rule Triggers - -The rule triggers when a data column has: - -```csharp -string.IsNullOrWhitespace(SourceColumn) -``` - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, locate the flagged data column -2. In **Properties** pane, find the `Source Column` property -3. Enter the correct source column name from your data source query -4. Verify the mapping matches the partition query - -The source column name must exactly match: -- For Power Query: Column name in M expression output -- For SQL: Column name or alias in SELECT statement -- For Direct Lake: Column name in Delta Lake table - -## Common Causes - -### Cause 1: Renamed Source Column - -Source query was modified and column renamed. - -### Cause 2: Manual Column Creation - -Column created manually without specifying source. - -### Cause 3: Copy/Paste Corruption - -Columns copied from another table without preserving metadata. - -## Example - -### Before Fix - -``` -Table: Sales -Column: ProductName (DataColumn) - SourceColumn: [empty] -``` - -Result: Refresh fails with "Column 'ProductName' not found in source query" - -### After Fix - -``` -Table: Sales -Column: ProductName (DataColumn) - SourceColumn: ProductName -``` - -Result: Column populates correctly during refresh - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Expression Required for Calculated Objects](xref:kb.bpa-expression-required) - Ensuring calculated columns have expressions diff --git a/content/kb/bpa-date-table-exists.md b/content/kb/bpa-date-table-exists.md deleted file mode 100644 index 97931246..00000000 --- a/content/kb/bpa-date-table-exists.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -uid: kb.bpa-date-table-exists -title: Date Table Should Exist -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring your model includes a dedicated date table for proper time intelligence functionality. ---- - -# Date Table Should Exist - -## Overview - -This best practice rule verifies that your tabular model contains at least one properly configured date table. Date tables are essential for time intelligence calculations and ensuring consistent date-based filtering across your model. - -- Category: Performance - -- Severity: Medium (2) - -## Applies To - -- Model - -## Why This Matters - -A dedicated date table is essential because it: - -- **Enables time intelligence**: Functions like `DATESYTD`, `SAMEPERIODLASTYEAR`, and `TOTALYTD` require a date table -- **Ensures consistent filtering**: Provides single source of truth for date attributes -- **Improves performance**: Establishes proper calendar relationships -- **Supports custom calendars**: Enables fiscal year calculations and custom hierarchies - -Without a properly marked date table, many DAX time intelligence functions will fail or produce incorrect results. - -## When This Rule Triggers - -The rule triggers when **all** tables in your model meet the following conditions: - -1. No table has any calendars defined (`Calendars.Count = 0`) -2. No table contains a column marked as a key with `DataType = DateTime` -3. No table has `DataCategory = "Time"` - -This indicates that the model lacks a proper date dimension. - -## How to Fix - -### Option 1: Create a Date Table Using DAX - -Add a calculated table with a complete date range: - -```dax -DateTable = -ADDCOLUMNS ( - CALENDAR (DATE(2020, 1, 1), DATE(2030, 12, 31)), - "Year", YEAR([Date]), - "Quarter", "Q" & FORMAT([Date], "Q"), - "Month", FORMAT([Date], "MMMM"), - "MonthNumber", MONTH([Date]), - "Day", DAY([Date]), - "WeekDay", FORMAT([Date], "dddd") -) -``` - -### Option 2: Import from Data Source - -Create a date dimension table in your data warehouse or data source and import it into the model. - -### Mark as Date Table - -After creating the table: - -1. Select the date table in the **TOM Explorer** -2. Right-click and choose **Mark as Date Table** -3. Select the date column as the key column -4. Create relationships between the date table and your fact tables - -### Set Calendar Metadata - -Alternatively, configure the calendar metadata: - -1. Select the date table -2. In the **Properties** pane, expand **Calendars** -3. Add a new calendar and configure the date column reference - -## Example - -A typical date table structure: - -| Date | Year | Quarter | Month | MonthNumber | Day | -|------|------|---------|-------|-------------|-----| -| 2025-01-01 | 2025 | Q1 | January | 1 | 1 | -| 2025-01-02 | 2025 | Q1 | January | 1 | 2 | -| ... | ... | ... | ... | ... | ... | - -Once created, establish relationships: - -``` -'DateTable'[Date] (1) -> (*) 'Sales'[OrderDate] -'DateTable'[Date] (1) -> (*) 'Orders'[ShipDate] -``` - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Remove Auto Date Table](xref:kb.bpa-remove-auto-date-table) - Removing automatic date tables that duplicate functionality - -## Learn More - -- [Create Date Tables in Power BI](https://learn.microsoft.com/power-bi/guidance/model-date-tables) -- [Time Intelligence Functions in DAX](https://learn.microsoft.com/dax/time-intelligence-functions-dax) -- [Mark as Date Table](https://learn.microsoft.com/power-bi/transform-model/desktop-date-tables) diff --git a/content/kb/bpa-do-not-summarize-numeric.md b/content/kb/bpa-do-not-summarize-numeric.md deleted file mode 100644 index f29ab822..00000000 --- a/content/kb/bpa-do-not-summarize-numeric.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -uid: kb.bpa-do-not-summarize-numeric -title: Set SummarizeBy to None for Numeric Columns -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule preventing incorrect default aggregations on numeric columns that should not be summed. ---- - -# Set SummarizeBy to None for Numeric Columns - -## Overview - -This best practice rule identifies visible numeric columns (Int64, Decimal, Double) that have a default aggregation behavior (`SummarizeBy`) other than `None`. Most numeric columns should not be automatically aggregated, as summing values like IDs, quantities in non-additive contexts, or codes produces meaningless results. - -- Category: Formatting - -- Severity: High (3) - -## Applies To - -- Data Columns -- Calculated Columns -- Calculated Table Columns - -## Why This Matters - -Default aggregation on inappropriate columns causes serious issues: - -- **Incorrect analysis**: Users get meaningless totals (sum of CustomerIDs, etc.) -- **Misleading dashboards**: Visualizations show wrong numbers by default -- **User confusion**: Users must manually change aggregation for every visual -- **Wrong decisions**: Business decisions based on incorrect automatic aggregations -- **Data credibility**: Users lose trust in the model and data - -Common columns that should NOT be aggregated include IDs, keys, codes, ratios, percentages, and non-additive quantities. - -## When This Rule Triggers - -The rule triggers when a column meets ALL these conditions: - -```csharp -(DataType = "Int64" or DataType="Decimal" or DataType="Double") -and -SummarizeBy <> "None" -and not (IsHidden or Table.IsHidden) -``` - -In other words: visible numeric columns that have a summarization behavior other than "None". - -## How to Fix - -### Automatic Fix - -This rule includes an automatic fix: - -```csharp -SummarizeBy = AggregateFunction.None -``` - -To apply: -1. In the **Best Practice Analyzer** select flagged objects -3. Click **Apply Fix** - -### Manual Fix - -1. In **TOM Explorer**, locate the column -2. In **Properties** pane, find **Summarize By** -3. Change from **Sum**, **Average**, **Min**, **Max**, **Count**, or **DistinctCount** to **None** -4. Save changes - -## Common Causes - -### Cause 1: Default Import Behavior - -Numeric columns default to Sum aggregation during import. - -### Cause 2: Lack of Column Review - -Models deployed without reviewing column aggregation settings. - -### Cause 3: ID Columns Not Hidden - -Numeric ID columns remain visible with default Sum aggregation. - -## Example - -### Before Fix - -``` -Column: CustomerID - DataType: Int64 - SummarizeBy: Sum -``` - -**Result**: Visual shows "Sum of CustomerID: 12,456,789" (meaningless number) - -### After Fix - -``` -Column: CustomerID - DataType: Int64 - SummarizeBy: None -``` - -**Result**: Visual requires explicit aggregation or shows individual Customer IDs - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Hide Foreign Keys](xref:kb.bpa-hide-foreign-keys) - Related column hygiene rule -- [Format String for Columns](xref:kb.bpa-format-string-columns) - Column formatting - -## Learn More - -- [Column Properties](https://learn.microsoft.com/analysis-services/tabular-models/column-properties-ssas-tabular) -- [When to Use Measures vs. Calculated Columns](https://learn.microsoft.com/power-bi/transform-model/desktop-tutorial-create-measures) diff --git a/content/kb/bpa-expression-required.md b/content/kb/bpa-expression-required.md deleted file mode 100644 index 5dd370ef..00000000 --- a/content/kb/bpa-expression-required.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -uid: kb.bpa-expression-required -title: Expression Required for Calculated Objects -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring measures, calculated columns, and calculation items have valid DAX expressions. ---- - -# Expression Required for Calculated Objects - -## Overview - -This best practice rule identifies measures, calculated columns, and calculation items that lack a DAX expression. All calculated objects must have a valid, non-empty expression to function correctly and prevent errors during model deployment and query execution. - -- Category: Error Prevention - -- Severity: High (3) - -## Applies To - -- Measures -- Calculated Columns -- Calculation Items - -## Why This Matters - -Calculated objects without expressions will cause critical failures: - -- **Model validation errors**: The model will fail validation when saved or deployed -- **Query failures**: Attempts to use the object in queries will generate errors -- **Broken dependencies**: Other measures or calculations referencing the object will fail -- **Deployment blockers**: Power BI Service and Analysis Services will reject models with empty expressions -- **Unexpected behavior**: The object may appear in field lists but produce no results - -Empty expressions typically result from incomplete object creation, copy/paste operations, or programmatic model generation errors. - -## When This Rule Triggers - -The rule triggers when any of the following objects have an empty or whitespace-only expression: - -```csharp -string.IsNullOrWhiteSpace(Expression) -``` - -This applies to: -- **Measures**: Should contain a DAX aggregation or calculation -- **Calculated Columns**: Should contain a row-context DAX expression -- **Calculation Items**: Should contain a DAX expression modifying the base measure - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, locate the measure, calculated column, or calculation item -2. Double-click to open the **DAX Editor** -3. Enter a valid DAX expression -4. Validate the syntax and save - -## Common Causes - -### Cause 1: Incomplete Creation - -Object was created intending to define it later but was forgotten. - -### Cause 2: Template-Based Creation - -Scripts or templates created objects without expressions. - -### Cause 3: Failed Copy Operation - -Copied an object but the expression didn't transfer. - -## Example - -### Before Fix - -``` -Measure: [Total Revenue] - Expression: [empty] - FormatString: $#,0.00 -``` - -**Error when queried**: "The expression for measure '[Total Revenue]' is not valid." - -### After Fix - -``` -Measure: [Total Revenue] - Expression: SUM('Sales'[Revenue]) - FormatString: $#,0.00 -``` - -**Result**: Measure functions correctly and returns aggregated revenue. - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - diff --git a/content/kb/bpa-format-string-columns.md b/content/kb/bpa-format-string-columns.md deleted file mode 100644 index 69428333..00000000 --- a/content/kb/bpa-format-string-columns.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -uid: kb.bpa-format-string-columns -title: Provide Format String for Numeric and Date Columns -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring visible numeric and date columns have appropriate format strings for consistent display. ---- - -# Provide Format String for Numeric and Date Columns - -## Overview - -This best practice rule identifies visible columns with numeric or date data types that lack format strings. Format strings ensure consistent, professional data display across all client tools. - -- Category: Formatting - -- Severity: Medium (2) - -## Applies To - -- Data Columns -- Calculated Columns -- Calculated Table Columns - -## Why This Matters - -Columns without format strings display inconsistently: - -- **Unprofessional appearance**: Raw numbers like 1234567.89 instead of $1,234,567.89 -- **User confusion**: Users can't tell if values are currency, percentages, or plain numbers -- **Inconsistent formatting**: Different visuals may show different formats -- **Manual formatting burden**: Users must format every visual individually -- **Date ambiguity**: Dates show timestamps when only dates are needed - -## When This Rule Triggers - -```csharp -IsVisible -and string.IsNullOrWhitespace(FormatString) -and (DataType = "Int64" or DataType = "DateTime" or DataType = "Double" or DataType = "Decimal") -``` - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, select the column -2. In **Properties** pane, locate the **Format String** field -3. Choose from standard formats or enter custom format -4. Save changes - -## Common Causes - -### Cause 1: Missing Format Definition - -Columns do not have a format string when imported. - -## Example - -### Before Fix - -``` -Column: SalesAmount -Format String: (empty) -``` - -**Display**: 1234567.89 (hard to read, no currency symbol) - -### After Fix - -``` -Column: SalesAmount -Format String: "$#,0.00" -``` - -**Display**: $1,234,567.89 (clear, professional formatting) - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Provide Format String for Measures](xref:kb.bpa-format-string-measures) - Similar validation for measures diff --git a/content/kb/bpa-format-string-measures.md b/content/kb/bpa-format-string-measures.md deleted file mode 100644 index 7b4cf80f..00000000 --- a/content/kb/bpa-format-string-measures.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -uid: kb.bpa-format-string-measures -title: Provide Format String for Measures -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring visible measures have appropriate format strings for consistent display. ---- - -# Provide Format String for Measures - -## Overview - -This best practice rule identifies visible measures with numeric or date data types that lack format strings. All measures should have explicit format strings for professional, consistent display. - -- Category: Formatting - -- Severity: Medium (2) - -## Applies To - -- Measures - -## Why This Matters - -Measures without format strings display raw values, causing user confusion and inconsistent reporting. Format strings ensure: - -- **Professional appearance**: Values display with appropriate currency, percentage, or number formatting -- **Consistency**: All reports show values in the same format -- **User confidence**: Properly formatted numbers are easier to read and interpret -- **Business alignment**: Formatting matches corporate standards - -## When This Rule Triggers - -```csharp -IsVisible -and string.IsNullOrWhitespace(FormatString) -and (DataType = "Int64" or DataType = "DateTime" or DataType = "Double" or DataType = "Decimal") -``` - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, select the measure -2. In **Properties** pane, locate the **Format String** field -3. Enter an appropriate format string based on what the measure calculates -4. Save changes - -### Common Format Patterns - -```dax -Total Revenue = -SUM('Sales'[Amount]) -// Format String: "$#,0" - -Average Price = -AVERAGE('Sales'[UnitPrice]) -// Format String: "$#,0.00" - -YoY Growth = -DIVIDE([This Year] - [Last Year], [Last Year], 0) -// Format String: "0.0%" - -Order Count = -COUNTROWS('Orders') -// Format String: "#,0" -``` - -## Common Causes - -### Cause 1: Missing Format Definition - -When creating a new measure the defualt state is to not have any format string set. - -### Cause 2: Copy/Paste from Calculated Columns - -Copying measures from columns that don't require format strings. - -## Example - -### Before Fix - -```dax -Total Revenue = SUM('Sales'[Amount]) -// No Format String -``` - -**Display**: 1234567.89 (hard to read, no currency symbol) - -### After Fix - -```dax -Total Revenue = SUM('Sales'[Amount]) -// Format String: "$#,0" -``` - -**Display**: $1,234,568 (clear, professional formatting) - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Format String for Columns](xref:kb.bpa-format-string-columns) - Similar validation for columns diff --git a/content/kb/bpa-hide-foreign-keys.md b/content/kb/bpa-hide-foreign-keys.md deleted file mode 100644 index 62717d39..00000000 --- a/content/kb/bpa-hide-foreign-keys.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -uid: kb.bpa-hide-foreign-keys -title: Hide Foreign Key Columns -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule for hiding foreign key columns to simplify the model for end users. ---- - -# Hide Foreign Key Columns - -## Overview - -This best practice rule identifies foreign key columns (many-side of relationships) that are visible to end users. Foreign keys should be hidden because they serve only as relationship connectors and provide no analytical value when displayed. - -- Category: Formatting - -- Severity: Medium (2) - -## Applies To - -- Data Columns -- Calculated Columns -- Calculated Table Columns - -## Why This Matters - -Visible foreign key columns create unnecessary clutter: - -- **User confusion**: Foreign keys look like useful data but duplicate dimension attributes -- **Redundant fields**: Users see both the key and the related dimension attributes -- **Larger field lists**: More objects to scroll through finding relevant fields -- **Incorrect usage**: Users may group by keys instead of proper dimension attributes -- **Poor visualizations**: Charts showing key values instead of descriptive names - -Foreign keys exist only to create relationships between tables. Once relationships are established, users should work with dimension attributes, not the foreign keys themselves. - -## When This Rule Triggers - -The rule triggers when a column is: - -1. Used as the "from" column in a relationship (many-side) -2. The relationship has many cardinality on the from-side -3. The column is visible (`IsHidden = false`) - -```csharp -UsedInRelationships.Any(FromColumn.Name == current.Name and FromCardinality == "Many") -and -IsHidden == false -``` - -## How to Fix - -### Automatic Fix - -This rule includes an automatic fix: - -```csharp -IsHidden = true -``` - -To apply: -1. In the **Best Practice Analyzer** select flagged foreign key columns -2. Click **Apply Fix** - -### Manual Fix - -1. In **TOM Explorer**, locate the foreign key column -2. In **Properties** pane, set **IsHidden** to **true** -3. Save changes - -## Common Causes - -### Cause 1: Incomplete Model Setup - -Foreign keys remain visible after creating relationships. - -### Cause 2: Bulk Import - -Tables imported without post-processing to hide foreign keys. - -### Cause 3: Legacy Models - -Older models where foreign key hiding wasn't enforced. - -## Example - -### Before Fix - -``` -Sales Table Fields (visible): - - OrderDate - - CustomerKey ← Foreign key (should be hidden) - - ProductKey ← Foreign key (should be hidden) - - SalesAmount - - Quantity -``` - -**User experience**: Field list is cluttered. Users might mistakenly use `Sales[CustomerKey]` instead of `Customer[CustomerName]`. - -### After Fix - -``` -Sales Table Fields (visible): - - OrderDate - - SalesAmount - - Quantity -``` - -**User experience**: Clean field list. Users naturally use dimension attributes, relationship filtering works automatically. - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Set SummarizeBy to None for Numeric Columns](xref:kb.bpa-do-not-summarize-numeric) - Related column configuration -- [Format String for Columns](xref:kb.bpa-format-string-columns) - Column display settings diff --git a/content/kb/bpa-many-to-many-single-direction.md b/content/kb/bpa-many-to-many-single-direction.md deleted file mode 100644 index fdcadb21..00000000 --- a/content/kb/bpa-many-to-many-single-direction.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -uid: kb.bpa-many-to-many-single-direction -title: Many-to-Many Relationships Should Use Single Direction -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule to avoid performance issues by using single-direction filtering on many-to-many relationships. ---- - -# Many-to-Many Relationships Should Use Single Direction - -## Overview - -This best practice rule identifies many-to-many relationships that use bidirectional cross-filtering. Many-to-many relationships with both-directions filtering cause significant performance degradation. - -- Category: Performance -- Severity: Medium (2) - -## Applies To - -- Relationships - -## Why This Matters - -- **Severe performance impact**: Engine must evaluate filters in both directions -- **Memory consumption**: Additional filter contexts maintained -- **Ambiguous filter paths**: Multiple routes produce unexpected results -- **Complex DAX logic**: Debugging filter context becomes difficult -- **Risk circular dependencies**: Can lead to infinite evaluation loops - -## When This Rule Triggers - -The rule triggers when a relationship meets all conditions: - -1. `FromCardinality = "Many"` -2. `ToCardinality = "Many"` -3. `CrossFilteringBehavior = "BothDirections"` - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, locate the flagged relationship -2. In **Properties** pane, find `Cross Filter Direction` -3. Change from **Both** to **Single** - -Choose direction based on typical filter flow: -- From dimension to fact -- From lookup to data table - -When opposite-direction filtering is needed, handle explicitly in measures: - -```dax -SalesWithCrossFilter = -CALCULATE( - SUM('Sales'[Amount]), - CROSSFILTER('BridgeTable'[Key], 'DimensionTable'[Key], Both) -) -``` - -## Common Causes - -### Cause 1: Default Both-Direction Setting - -Model designer applied bidirectional filtering by default. - -### Cause 2: Misunderstood Requirements - -Believed both-direction filtering was necessary for all scenarios. - -### Cause 3: Quick Fix Approach - -Used both-direction filtering to solve a specific problem without considering performance. - -## Example - -### Before Fix - -``` -'Sales' (Many) <--> (Many) 'ProductBridge' -Cross Filter Direction: Both ← Problem -``` - -### After Fix - -``` -'Sales' (Many) --> (Many) 'ProductBridge' -Cross Filter Direction: Single -``` - -When Products need to filter Sales, use DAX: - -```dax -SalesForSelectedProducts = -VAR SelectedProducts = VALUES('Products'[ProductKey]) -RETURN -CALCULATE( - SUM('Sales'[Amount]), - TREATAS(SelectedProducts, 'ProductBridge'[ProductKey]) -) -``` - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Relationship Data Types Must Match](xref:kb.bpa-relationship-same-datatype) - Ensuring relationship integrity - -## Learn More - -- [Many-to-Many Relationships in Power BI](https://learn.microsoft.com/power-bi/transform-model/desktop-many-to-many-relationships) -- [Relationship Cross-Filtering](https://learn.microsoft.com/power-bi/transform-model/desktop-relationships-understand) -- [DAX CROSSFILTER Function](https://dax.guide/crossfilter/) -- [DAX TREATAS Function](https://dax.guide/treatas) diff --git a/content/kb/bpa-perspectives-no-objects.md b/content/kb/bpa-perspectives-no-objects.md deleted file mode 100644 index 13772524..00000000 --- a/content/kb/bpa-perspectives-no-objects.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -uid: kb.bpa-perspectives-no-objects -title: Perspectives Should Contain Objects -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule for removing empty perspectives that contain no visible objects. ---- - -# Perspectives Should Contain Objects - -## Overview - -This best practice rule identifies perspectives that don't contain any visible tables. Empty perspectives serve no purpose and should be removed. - -- Category: Maintenance -- Severity: Low (1) - -## Applies To - -- Perspectives - -## Why This Matters - -- **User confusion**: Empty perspectives appear in client tools but show no data - -## When This Rule Triggers - -The rule triggers when a perspective has no visible tables: - -```csharp -Model.Tables.Any(InPerspective[current.Name]) == false -``` - -## How to Fix - -### Automatic Fix - -This rule includes an automatic fix that deletes the empty perspective: - -```csharp -Delete() -``` - -To apply: -1. Run the **Best Practice Analyzer** -2. Select the empty perspectives -3. Click **Apply Fix** - -### Manual Fix - -1. In **TOM Explorer**, expand the **Perspectives** node -2. Right-click the empty perspective -3. Select **Delete** - -## Common Causes - -### Cause 1: Removed All Tables - -All tables removed from perspective without deleting it. - -### Cause 2: Incomplete Configuration - -Perspective created during design but never populated. - -## Example - -### Before Fix - -``` -Perspectives: - - Sales (contains: Sales, Customer, Product tables) ✓ - - Marketing (contains: NO TABLES) ✗ -``` - -### After Fix - -``` -Perspectives: - - Sales (contains: Sales, Customer, Product tables) ✓ -``` - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Learn More - -- [Perspectives in Tabular Models](https://learn.microsoft.com/analysis-services/tabular-models/perspectives-ssas-tabular) - diff --git a/content/kb/bpa-powerbi-latest-compatibility.md b/content/kb/bpa-powerbi-latest-compatibility.md deleted file mode 100644 index bb97ccb7..00000000 --- a/content/kb/bpa-powerbi-latest-compatibility.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -uid: kb.bpa-powerbi-latest-compatibility -title: Use Latest Compatibility Level for Power BI Models -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring Power BI models use the latest compatibility level for optimal features and performance. ---- - -# Use Latest Compatibility Level for Power BI Models - -## Overview - -This rule identifies Power BI models not using the latest available compatibility level. Using the latest level ensures access to newest features, performance optimizations, and bug fixes. - -- Category: Governance -- Severity: High (3) - -## Applies To - -- Model (Power BI semantic models only) - -## Why This Matters - -- **Missing features**: New DAX functions and model capabilities unavailable -- **Future compatibility**: Easier upgrades when using recent levels - -## When This Rule Triggers - -For Power BI models, triggers when compatibility level is below current maximum: - -```csharp -Model.Database.CompatibilityMode=="PowerBI" -and Model.Database.CompatibilityLevel<>[CurrentMaxLevel] -``` - -## How to Fix - -### Automatic Fix - -The best practice rule includes an automatic fix that sets the Compatability Level to the highest avaliable that exist on the current installation of Tabular Editor 3. If you have an older version of Tabular Editor 3 installed you should update your installation. - -```csharp -Model.Database.CompatibilityLevel = [PowerBIMaxCompatibilityLevel] -``` - -### Manual Fix - -1. In Tabular Editor, go to **Model** properties -2. Set **Compatibility Level** to the latest version -3. Test all DAX expressions and features -4. Deploy to Power BI Service - -## Common Causes - -### Cause 1: Model Created in Power BI Desktop - -Model created with in Power BI Desktop does not necesarily have the latest Compatability Level. - -### Cause 2: Model Created at Lower Level - -Model created with older version of Power BI Desktop. - -### Cause 3: Conservative Approach - -Team policy to delay upgrades. - -## Example - -### Before Fix - -``` -Model Compatibility Level: 1500 -Current Maximum Level: 1700 -``` - -### After Fix - -``` -Model Compatibility Level: 1700 (Latest) -``` - -Access to new features like enhanced calculation groups and field parameters. - -## Compatibility Level - -This rule applies to Power BI models at all compatibility levels. \ No newline at end of file diff --git a/content/kb/bpa-relationship-same-datatype.md b/content/kb/bpa-relationship-same-datatype.md deleted file mode 100644 index fb3263fd..00000000 --- a/content/kb/bpa-relationship-same-datatype.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -uid: kb.bpa-relationship-same-datatype -title: Relationship Columns Must Have Same Data Type -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring relationships connect columns with matching data types to prevent errors and performance issues. ---- - -# Relationship Columns Must Have Same Data Type - -## Overview - -This best practice rule identifies relationships where the connected columns have mismatched data types. Both columns in a relationship must share the same data type to ensure proper filtering, prevent errors, and maintain optimal query performance. - -- Category: Error Prevention - -- Severity: High (3) - -## Applies To - -- Relationships - -## Why This Matters - -Relationships with mismatched data types cause serious problems: - -- **Model validation errors**: The model may fail to save or deploy -- **Relationship creation failures**: Power BI and Analysis Services may reject the relationship -- **Implicit conversions**: Expensive data type conversions on every query -- **Incorrect results**: Type coercion leads to unexpected filtering behavior -- **Performance degradation**: Converting data types during queries slows execution -- **Memory overhead**: Additional memory required for conversion buffers - -## When This Rule Triggers - -The rule triggers when: - -```csharp -FromColumn.DataType != ToColumn.DataType -``` - -This detects relationships connecting columns with different data types. - -## How to Fix - -### Manual Fix - -1. Identify which column should change data type -2. Change the data type in **Power Query**, in the underlying data source or in the model -3. Delete the existing relationship -4. Create a new relationship between the corrected columns -5. Verify filtering works correctly - -## Common Causes - -### Cause 1: Inconsistent Data Type Choices - -Different data types chosen for the same logical key during import or table creation. - -### Cause 2: Source System Differences - -Foreign keys imported from different source systems with different type conventions. - -### Cause 3: DateTime vs Date Mismatch - -Fact tables using DateTime columns while date dimensions use Date type. - -## Example - -### Before Fix - -``` -Relationship: Sales[CustomerID] (Int64) → Customers[CustomerID] (String) -``` - -**Error**: Relationship fails validation or creates performance issues with implicit conversion - -### After Fix - -``` -Relationship: Sales[CustomerID] (Int64) → Customers[CustomerID] (Int64) -``` - -**Result**: Relationship works efficiently with no type conversion overhead - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Many-to-Many Relationships Should Use Single Direction](xref:kb.bpa-many-to-many-single-direction) - Relationship performance optimization diff --git a/content/kb/bpa-remove-auto-date-table.md b/content/kb/bpa-remove-auto-date-table.md deleted file mode 100644 index 91451c32..00000000 --- a/content/kb/bpa-remove-auto-date-table.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -uid: kb.bpa-remove-auto-date-table -title: Remove Auto Date Tables -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule to identify and remove automatically generated date tables that increase model size and reduce performance. ---- - -# Remove Auto Date Tables - -## Overview - -This best practice rule identifies automatically generated date tables created by Power BI Desktop. These auto-generated tables (`DateTableTemplate_` and `LocalDateTable_`) should be removed in favor of a single, explicit date table to optimize model size and performance. - -- Category: Performance - -- Severity: Medium (2) - -## Applies To - -- Tables -- Calculated Tables - -## Why This Matters - -Power BI automatically creates hidden date tables for every date/datetime column when "Auto Date/Time" is enabled. This causes issues: - -- **Increased model size**: Each auto-generated table adds unnecessary data -- **Memory overhead**: Multiple date tables consume more memory than one shared table -- **Slower refresh**: Additional tables increase refresh duration - -A single, well-designed date table is far more efficient and maintainable. - -## When This Rule Triggers - -The rule triggers when it finds calculated tables with names that: - -- Start with `"DateTableTemplate_"`, or -- Start with `"LocalDateTable_"` - -These prefixes indicate Power BI's automatically generated date tables. - -## How to Fix - -### Manual Fix - -1. Disable **Auto Date/Time** in Power BI Desktop (**File** > **Options** > **Data Load**) -2. Create a dedicated date table. -3. Mark it as a date table and create relationships to fact tables -4. In **TOM Explorer**, delete tables starting with `DateTableTemplate_` or `LocalDateTable_` -5. Verify custom date table relationships work correctly - -## Common Causes - -### Cause 1: Auto Date/Time Feature Enabled - -Power BI Desktop's "Auto Date/Time" feature automatically creates these tables. - -### Cause 2: Migrated Models - -Models created with auto tables enabled and never cleaned up. - -### Cause 3: Default Settings - -New models use default settings which enable auto date tables. - -## Example - -### Before Fix - -``` -Tables: - - Sales - - LocalDateTable_OrderDate (hidden, auto-generated) - - LocalDateTable_ShipDate (hidden, auto-generated) - - Products - - LocalDateTable_ReleaseDate (hidden, auto-generated) -``` - -**Result**: Multiple hidden tables inflate model size - -### After Fix - -``` -Tables: - - Sales - - Products - - DateTable (explicit, marked as date table) - -> Relationships to Sales[OrderDate], Sales[ShipDate], Products[ReleaseDate] -``` - -**Result**: Single efficient date table serves all date relationships - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Date Table Should Exist](xref:kb.bpa-date-table-exists) - Ensuring a proper date table is present - -## Learn More - -- [Disable Auto Date/Time in Power BI](https://learn.microsoft.com/power-bi/guidance/auto-date-time) -- [Create Date Tables](https://learn.microsoft.com/power-bi/guidance/model-date-tables) -- [Date Table Best Practices](https://www.sqlbi.com/articles/creating-a-simple-date-table-in-dax/) diff --git a/content/kb/bpa-remove-unused-data-sources.md b/content/kb/bpa-remove-unused-data-sources.md deleted file mode 100644 index d5b82ed4..00000000 --- a/content/kb/bpa-remove-unused-data-sources.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -uid: kb.bpa-remove-unused-data-sources -title: Remove Unused Data Sources -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule for removing orphaned data sources to reduce model complexity and improve maintainability. ---- - -# Remove Unused Data Sources - -## Overview - -This best practice rule identifies data sources that are not referenced by any partitions or table expressions. Removing unused data sources reduces model complexity, improves maintainability, and prevents confusion. - -- Category: Maintenance -- Severity: Low (1) - -## Applies To - -- Provider Data Sources -- Structured Data Sources - -## Why This Matters - -Unused data sources create unnecessary overhead: - -- **Maintenance burden**: Credentials and connection strings must be maintained for unused connections -- **Security concerns**: Unnecessary connection strings may expose sensitive information -- **Model complexity**: Extra objects clutter the data source list -- **Confusion**: Developers may mistakenly use obsolete data sources -- **Deployment issues**: Unused data sources may reference systems that no longer exist -- **Documentation overhead**: Extra objects require explanation in model documentation - -Unused data sources typically result from: -- Refactoring partitions to use different sources -- Consolidating multiple sources into one -- Removing tables without cleaning up their data sources -- Testing alternative connection methods - -## When This Rule Triggers - -The rule triggers when a data source meets all these conditions: - -```csharp -UsedByPartitions.Count() == 0 -and not Model.Tables.Any(SourceExpression.Contains(OuterIt.Name)) -and not Model.AllPartitions.Any(Query.Contains(OuterIt.Name)) -``` - -In other words: -1. No partitions directly reference the data source -2. No table source expressions (M queries) reference the data source by name -3. No partition queries contain the data source name - -## How to Fix - -### Automatic Fix - -This rule includes an automatic fix that deletes the unused data source: - -```csharp -Delete() -``` - -To apply: -1. In the **Best Practice Analyzer** select flagged objects -3. Click **Apply Fix** - -### Manual Fix - -1. In **TOM Explorer**, expand the **Data Sources** node -2. Right-click the unused data source -3. Select **Delete** -4. Confirm the deletion - -### Before Deleting - -Verify the data source is truly unused: -- Check all partitions in all tables -- Search M expressions for references to the data source name -- Review custom expressions and calculated tables -- Ensure no documentation references the connection - -## Example - -### Before Fix - -``` -Data Sources: - - SQLServer_Production (Provider, used by Sales partition) - - SQLServer_Staging (Provider, NOT USED) ← Remove - - AzureSQL_Archive (Structured, NOT USED) ← Remove - - PowerQuery_Web (Structured, used by Product partition) -``` - -### After Fix - -``` -Data Sources: - - SQLServer_Production (Provider, used by Sales partition) - - PowerQuery_Web (Structured, used by Product partition) -``` - -**Result**: Simpler model with only necessary data sources - -## False Positives - -The rule may flag data sources that are: -- Referenced through dynamic M expressions using variables -- Used in commented-out partition queries -- Referenced by name in annotations or descriptions - -**Solution**: Manually verify before deleting; add comments or annotations if the data source should be kept for documentation purposes. - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. \ No newline at end of file diff --git a/content/kb/bpa-set-isavailableinmdx-false.md b/content/kb/bpa-set-isavailableinmdx-false.md deleted file mode 100644 index 80f4c327..00000000 --- a/content/kb/bpa-set-isavailableinmdx-false.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -uid: kb.bpa-set-isavailableinmdx-false -title: Set IsAvailableInMDX to False -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule to optimize performance by disabling MDX access for hidden columns that are not used in relationships or hierarchies. ---- - -# Set IsAvailableInMDX to False - -## Overview - -This best practice rule identifies hidden columns that have the `IsAvailableInMDX` property set to `true` but don't need to be accessible through MDX queries. Setting this property to `false` for unused hidden columns can improve query performance and reduce memory overhead. - -- Category: Performance -- Severity: Medium (2) - -## Applies To - -- Data Columns -- Calculated Columns -- Calculated Table Columns - -## Why This Matters - -When a column has `IsAvailableInMDX` set to `true`, the Analysis Services engine maintains additional metadata and structures to support MDX queries against that column. For hidden columns that aren't used in relationships, hierarchies, variations, calendars, or as sort-by columns, this overhead is unnecessary and can: - -- Increase memory consumption -- Slow down query processing -- Add complexity to the model metadata - -By explicitly setting `IsAvailableInMDX` to `false` for these columns, you optimize the model for DAX-only scenarios, which is the primary query language for Power BI and modern Analysis Services models. - -## When This Rule Triggers - -The rule triggers when all of the following conditions are met: - -1. The column has `IsAvailableInMDX = true` -2. The column is hidden (or its table is hidden) -3. The column is NOT used in any `SortBy` relationships -4. The column is NOT used in any hierarchies -5. The column is NOT used in any variations -6. The column is NOT used in any calendars -7. The column is NOT serving as a `SortByColumn` for another column - -## How to Fix - -### Automatic Fix - -This rule includes an automatic fix expression. When you apply the fix in the Best Practice Analyzer: - -```csharp -IsAvailableInMDX = false -``` -To apply: -1. In the **Best Practice Analyzer** select flagged objects -3. Click **Apply Fix** - -### Manual Fix - -1. In the **TOM Explorer**, locate the flagged column -2. In the **Properties** pane, find the `IsAvailableInMDX` property -3. Set the value to `false` -4. Save your changes - -## Example - -Consider a hidden calculated column used only for intermediate calculations: - -```dax -_TempCalculation = -CALCULATE( - SUM('Sales'[Amount]), - ALLEXCEPT('Sales', 'Sales'[ProductKey]) -) -``` - -If this column is: -- Hidden from client tools -- Not used in any hierarchies or relationships -- Not referenced by sort operations - -Then setting `IsAvailableInMDX = false` is recommended for optimal performance. - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Set IsAvailableInMDX to True When Necessary](xref:kb.bpa-set-isavailableinmdx-true-necessary) - The complementary rule ensuring columns that need MDX access have it enabled diff --git a/content/kb/bpa-set-isavailableinmdx-true-necessary.md b/content/kb/bpa-set-isavailableinmdx-true-necessary.md deleted file mode 100644 index 5c3062cc..00000000 --- a/content/kb/bpa-set-isavailableinmdx-true-necessary.md +++ /dev/null @@ -1,144 +0,0 @@ ---- -uid: kb.bpa-set-isavailableinmdx-true-necessary -title: Set IsAvailableInMDX to True When Necessary -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule preventing query errors by ensuring columns used in hierarchies and relationships have MDX availability enabled. ---- - -# Set IsAvailableInMDX to True When Necessary - -## Overview - -This best practice rule identifies columns that have `IsAvailableInMDX` set to `false` but are actually used in scenarios requiring MDX access. These columns must have MDX availability enabled to function correctly in hierarchies, relationships, and sort operations. - -- Category: Error Prevention -- Severity: High (3) - -## Applies To - -- Data Columns -- Calculated Columns -- Calculated Table Columns - -## Why This Matters - -When a column is used in certain model structures, the Analysis Services engine requires MDX access to that column. Disabling MDX access for columns that need it causes: - -- **Query failures**: Hierarchies and sort operations fail with errors -- **Broken visualizations**: Charts and tables using affected hierarchies display errors -- **Relationship problems**: MDX queries against relationships may fail -- **Calendar/variation errors**: Time intelligence features break -- **Unpredictable behavior**: Some queries work while others fail depending on client tool - -Columns need `IsAvailableInMDX = true` when they are: -- Used in hierarchies as levels -- Referenced as sort-by columns -- Used in variations (alternate hierarchies) -- Part of calendar definitions -- Serving as sort-by targets for other columns - -## When This Rule Triggers - -The rule triggers when a column has `IsAvailableInMDX = false` AND any of these conditions are true: - -```csharp -IsAvailableInMDX = false -and -( - UsedInSortBy.Any() - or - UsedInHierarchies.Any() - or - UsedInVariations.Any() - or - UsedInCalendars.Any() - or - SortByColumn != null -) -``` - -The rule checks these dependency collections: - -| Property | Description | Example Usage | -|----------|-------------|---------------| -| `UsedInHierarchies` | Hierarchies where column is a level | Product hierarchy levels | -| `UsedInSortBy` | Columns using this as sort key | Month names sorted by month number | -| `UsedInVariations` | Alternate hierarchies using column | Product variations | -| `UsedInCalendars` | Calendar metadata references | Date table calendar definitions | -| `SortByColumn` | Column sorts by another column | This column has a sort-by reference | - -## How to Fix - -### Automatic Fix - -This rule includes an automatic fix: - -```csharp -IsAvailableInMDX = true -``` - -To apply: -1. In the **Best Practice Analyzer** select flagged objects -3. Click **Apply Fix** - -### Manual Fix - -1. In **TOM Explorer**, locate the flagged column -2. In **Properties** pane, find `IsAvailableInMDX` -3. Set the value to `true` -4. Save and test affected hierarchies/sorts - -## Common Scenarios - -### Scenario 1: Hierarchy Level Column - -**Problem**: A column used as a hierarchy level has MDX disabled - -```dax -Hierarchy: Geography - Levels: - - Country - - State (IsAvailableInMDX = false) ← Problem - - City -``` - -**Error**: "The hierarchy 'Geography' cannot be used because one of its levels is not available in MDX." - -**Solution**: Set `State[IsAvailableInMDX] = true` - -### Scenario 2: Sort-By Column - -**Problem**: A column serving as a sort-by target has MDX disabled - -``` -Month Name column: - - SortByColumn = MonthNumber - - MonthNumber.IsAvailableInMDX = false ← Problem -``` - -**Error**: Months display in alphabetical order instead of calendar order - -**Solution**: Set `MonthNumber[IsAvailableInMDX] = true` - -### Scenario 3: Calendar Definition - -**Problem**: A date column used in calendar metadata has MDX disabled - -``` -DateTable: - - Calendar uses DateKey column - - DateKey.IsAvailableInMDX = false ← Problem -``` - -**Error**: Time intelligence functions fail - -**Solution**: Set `DateKey[IsAvailableInMDX] = true` - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Set IsAvailableInMDX to False](xref:kb.bpa-set-isavailableinmdx-false) - The complementary optimization rule diff --git a/content/kb/bpa-specify-application-name.md b/content/kb/bpa-specify-application-name.md deleted file mode 100644 index 50dbf82b..00000000 --- a/content/kb/bpa-specify-application-name.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -uid: kb.bpa-specify-application-name -title: Specify Application Name in Connection Strings -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule for including application name in SQL Server connection strings to enable monitoring and troubleshooting. ---- - -# Specify Application Name in Connection Strings - -## Overview - -This rule identifies SQL Server provider data sources that lack an Application Name parameter in their connection strings. Including the application name enables better monitoring and troubleshooting. - -- Category: Performance -- Severity: Low (1) - -## Applies To - -- Provider Data Sources - -## Why This Matters - -- **Query tracking**: DBAs can identify which application generated queries -- **Performance monitoring**: Isolate tabular model queries for analysis -- **Troubleshooting**: Quickly identify source of problem queries -- **Auditing**: Track data access by application - -## When This Rule Triggers - -This rule triggers when a data source meets both of these conditions: - -1. The connection string uses a SQL Server provider (contains `SQLNCLI`, `SQLOLEDB`, or `MSOLEDBSQL`) -2. The connection string does NOT include an `Application Name` parameter - -In other words, the rule identifies SQL Server connections that are missing the application name identifier. - -## How to Fix - -### Manual Fix - -Add Application Name to your connection string: - -``` -Provider=MSOLEDBSQL;Data Source=ServerName;Initial Catalog=DatabaseName;Application Name=Tabular Editor;Integrated Security=SSPI; -``` - -## Example - -### Before Fix - -``` -Provider=MSOLEDBSQL;Data Source=localhost;Initial Catalog=AdventureWorks; -``` - -### After Fix - -``` -Provider=MSOLEDBSQL;Data Source=localhost;Initial Catalog=AdventureWorks;Application Name=Sales Model; -``` - -Result: Queries now identifiable in SQL Server monitoring tools. - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Remove Unused Data Sources](xref:kb.bpa-remove-unused-data-sources) - Data source maintenance diff --git a/content/kb/bpa-translate-descriptions.md b/content/kb/bpa-translate-descriptions.md deleted file mode 100644 index 24a01fb4..00000000 --- a/content/kb/bpa-translate-descriptions.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -uid: kb.bpa-translate-descriptions -title: Translate Descriptions for All Cultures -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring object descriptions are translated for all defined cultures. ---- - -# Translate Descriptions for All Cultures - -## Overview - -This rule identifies objects with descriptions that lack translations for one or more cultures. - -- Category: Model Layout -- Severity: Low (1) - -## Applies To - -- Model -- Tables -- Measures -- Hierarchies -- Levels -- Perspectives -- Data Columns -- Calculated Columns -- Calculated Tables -- Calculated Table Columns - -## Why This Matters - -- **Incomplete localization**: Descriptions display in default language only -- **Inconsistent help text**: Users see mix of languages -- **User confusion**: Documentation appears incomplete -- **Professional appearance**: Missing translations reduce model quality - -## When This Rule Triggers - -```csharp -not string.IsNullOrEmpty(Description) -and Model.Cultures.Any(string.IsNullOrEmpty(outerIt.TranslatedDescriptions[it])) -``` -This rule triggers when an object meets both of these conditions: - -1. The object has a description (not empty) -2. At least one culture in the model is missing a translation for that description - -In other words, if you have descriptions and multiple cultures defined, all descriptions should be translated for all cultures. - - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, select the object -2. In **Properties** pane, expand **Translated Descriptions** -3. Enter translation for each culture - -## Common Causes - -### Cause 1: New Descriptions Added - -Descriptions created without translations. - -### Cause 2: Culture Added Later - -Culture added after descriptions were written. - -### Cause 3: Incomplete Translation - -Translation process didn't cover descriptions. - -## Example - -### Before Fix - -``` -Measure: [Total Revenue] -Description (English): "Sum of all revenue" -Description (Spanish): (missing) -``` - -### After Fix - -``` -Measure: [Total Revenue] -Description (English): "Sum of all revenue" -Description (Spanish): "Suma de todos los ingresos" -``` - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Translate Visible Names](xref:kb.bpa-translate-visible-names) - Translating object names -- [Translate Display Folders](xref:kb.bpa-translate-display-folders) - Translating display folders diff --git a/content/kb/bpa-translate-display-folders.md b/content/kb/bpa-translate-display-folders.md deleted file mode 100644 index a8b7bb38..00000000 --- a/content/kb/bpa-translate-display-folders.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -uid: kb.bpa-translate-display-folders -title: Translate Display Folders for All Cultures -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring display folders are translated for all defined cultures. ---- - -# Translate Display Folders for All Cultures - -## Overview - -This rule identifies visible objects with display folders that lack translations for one or more cultures. - -- Category: Model Layout -- Severity: Low (1) - -## Applies To - -- Measures -- Hierarchies -- Data Columns -- Calculated Columns -- Calculated Table Columns - -## Why This Matters - -- **Incomplete localization**: Display folders show in default language only -- **Inconsistent navigation**: Partially translated folder structure -- **User confusion**: Organization appears incomplete -- **Professional appearance**: Missing translations reduce model quality - -## When This Rule Triggers - -This rule triggers when an object meets all three of these conditions: - -1. The object is **visible** to end users (not hidden) -2. The object has a **display folder** assigned (organizing it into a folder structure) -3. At least one culture in the model is **missing a translation** for that display folder - -In plain language: visible objects that are organized in display folders should have those folder names translated for all cultures in your model. - -```csharp -IsVisible -and not string.IsNullOrEmpty(DisplayFolder) -and Model.Cultures.Any(string.IsNullOrEmpty(outerIt.TranslatedDisplayFolders[it])) -``` - -## How to Fix - -### Automatic Fix - -```csharp -TranslatedDisplayFolders.Reset() -``` - -Resets translations to use the default display folder. - -### Manual Fix - -1. Select object in **TOM Explorer** -2. Expand **Translated Display Folders** in properties -3. Enter translation for each culture - -## Common Causes - -### Cause 1: New Display Folders Added - -Display folders created without translations. - -### Cause 2: Culture Added Later - -Culture added after display folders were defined. - -### Cause 3: Incomplete Translation - -Translation workflow didn't cover display folders. - -## Example - -### Before Fix - -``` -Measure: [Total Sales] -Display Folder (English): "Sales Metrics" -Display Folder (French): (missing) -``` - -### After Fix - -``` -Measure: [Total Sales] -Display Folder (English): "Sales Metrics" -Display Folder (French): "Métriques de Vente" -``` - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Translate Visible Names](xref:kb.bpa-translate-visible-names) - Translating object names -- [Translate Descriptions](xref:kb.bpa-translate-descriptions) - Translating descriptions diff --git a/content/kb/bpa-translate-hierarchy-levels.md b/content/kb/bpa-translate-hierarchy-levels.md deleted file mode 100644 index 63265dc2..00000000 --- a/content/kb/bpa-translate-hierarchy-levels.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -uid: kb.bpa-translate-hierarchy-levels -title: Translate Hierarchy Level Names for All Cultures -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring hierarchy level names are translated for all defined cultures. ---- - -# Translate Hierarchy Level Names for All Cultures - -## Overview - -This rule identifies hierarchy levels in visible hierarchies that lack name translations for one or more cultures. - -- Category: Model Layout -- Severity: Low (1) - -## Applies To - -- Levels (within hierarchies) - -## Why This Matters - -- **Incomplete localization**: Level names display in default language only -- **Inconsistent experience**: Partially translated hierarchies -- **User confusion**: Navigation appears incomplete -- **Professional appearance**: Missing translations reduce quality - -## When This Rule Triggers - -This rule triggers when a hierarchy level meets both of these conditions: - -1. The hierarchy containing the level is **visible** to end users -2. At least one culture in the model is **missing a translation** for the level name - -That is if you have visible hierarchies with multiple cultures, all the level names within those hierarchies should be translated for each culture. - -```csharp -Hierarchy.IsVisible -and Model.Cultures.Any(string.IsNullOrEmpty(outerIt.TranslatedNames[it])) -``` - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, select the level -2. In **Properties** pane, expand **Translated Names** -3. Enter translation for each culture - -## Common Causes - -### Cause 1: New Levels Added - -Levels created without translations. - -### Cause 2: Culture Added Later - -Culture added after hierarchy was created. - -### Cause 3: Incomplete Translation - -Translation process didn't cover all hierarchy levels. - -## Example - -### Before Fix - -``` -Hierarchy: Geography - Level: Country - English: "Country" - Spanish: (missing) -``` - -### After Fix - -``` -Hierarchy: Geography - Level: Country - English: "Country" - Spanish: "País" -``` - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Translate Visible Names](xref:kb.bpa-translate-visible-names) - Translating object names -- [Translate Perspectives](xref:kb.bpa-translate-perspectives) - Translating perspective names diff --git a/content/kb/bpa-translate-perspectives.md b/content/kb/bpa-translate-perspectives.md deleted file mode 100644 index 8a14a954..00000000 --- a/content/kb/bpa-translate-perspectives.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -uid: kb.bpa-translate-perspectives -title: Translate Perspective Names for All Cultures -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring perspective names are translated for all defined cultures. ---- - -# Translate Perspective Names for All Cultures - -## Overview - -This rule identifies model perspectives that lack name translations for one or more cultures. - -- Category: Model Layout -- Severity: Low (1) - -## Applies To - -- Model -- Perspectives - -## Why This Matters - -- **Incomplete localization**: Perspectives display in default language only -- **Inconsistent experience**: Mix of translated and untranslated perspective names -- **User confusion**: Expected language support not available -- **Professional appearance**: Incomplete translations reduce model quality - -## When This Rule Triggers - -This rule triggers when a perspective has: - -- At least one culture in the model that is **missing a translation** for the perspective name - -```csharp -Model.Cultures.Any(string.IsNullOrEmpty(outerIt.TranslatedNames[it])) -``` - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, select the perspective -2. In **Properties** pane, expand **Translated Names** -3. Enter translation for each culture - -## Common Causes - -### Cause 1: New Perspectives Added - -Perspectives created without translations. - -### Cause 2: Culture Added Later - -Culture added after perspectives were defined. - -### Cause 3: Incomplete Translation - -Translation workflow didn't cover perspectives. - -## Example - -### Before Fix - -``` -Perspective: "Sales Analysis" -English: "Sales Analysis" -German: (missing) -``` - -### After Fix - -``` -Perspective: "Sales Analysis" -English: "Sales Analysis" -German: "Vertriebsanalyse" -``` - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Translate Visible Names](xref:kb.bpa-translate-visible-names) - Translating object names -- [Translate Descriptions](xref:kb.bpa-translate-descriptions) - Translating descriptions diff --git a/content/kb/bpa-translate-visible-names.md b/content/kb/bpa-translate-visible-names.md deleted file mode 100644 index db2d51f6..00000000 --- a/content/kb/bpa-translate-visible-names.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -uid: kb.bpa-translate-visible-names -title: Translate Visible Object Names for All Cultures -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring visible object names are translated for all defined cultures. ---- - -# Translate Visible Object Names for All Cultures - -## Overview - -This rule identifies visible objects whose names lack translations for one or more cultures defined in the model. - -- Category: Model Layout -- Severity: Low (1) - -## Applies To - -- Tables -- Measures -- Hierarchies -- Data Columns -- Calculated Columns -- Calculated Tables -- Calculated Table Columns - -## Why This Matters - -- **Incomplete localization**: Users in different cultures see untranslated names -- **Inconsistent experience**: Mix of translated and untranslated content -- **User confusion**: Expected language support not provided -- **Professional appearance**: Incomplete translations appear unpolished - -## When This Rule Triggers - -This rule triggers when an object meets both of these conditions: - -1. The object is **visible** to end users (not hidden) -2. At least one culture in the model is **missing a translation** for the object name - -In other words visible objects with multiple cultures defined should have their names translated for each culture. - -```csharp -IsVisible -and Model.Cultures.Any(string.IsNullOrEmpty(outerIt.TranslatedNames[it])) -``` - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, select the object -2. In **Properties** pane, expand **Translated Names** -3. Enter translation for each culture -4. Save changes - -## Common Causes - -### Cause 1: New Objects Added - -New objects created without translations. - -### Cause 2: Culture Added Later - -Culture added to model after objects were created. - -### Cause 3: Incomplete Translation Process - -Translation workflow didn't cover all objects. - -## Example - -### Before Fix - -``` -Measure: [Total Sales] -English: "Total Sales" -Spanish: (missing) -French: (missing) -``` - -### After Fix - -``` -Measure: [Total Sales] -English: "Total Sales" -Spanish: "Total de Ventas" -French: "Total des Ventes" -``` - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Translate Perspectives](xref:kb.bpa-translate-perspectives) - Translating perspective names -- [Translate Descriptions](xref:kb.bpa-translate-descriptions) - Translating descriptions diff --git a/content/kb/bpa-trim-object-names.md b/content/kb/bpa-trim-object-names.md deleted file mode 100644 index 9318b2e1..00000000 --- a/content/kb/bpa-trim-object-names.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -uid: kb.bpa-trim-object-names -title: Trim Leading and Trailing Spaces from Object Names -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule for removing leading and trailing spaces from object names to prevent confusion and referencing issues. ---- - -# Trim Leading and Trailing Spaces from Object Names - -## Overview - -This best practice rule identifies objects whose names contain leading or trailing spaces. These unnecessary spaces cause DAX referencing issues, display problems, and general confusion. - -- Category: **Naming Conventions** -- Severity: Low (1) - -## Applies To - -- Model -- Tables -- Measures -- Hierarchies -- Levels -- Perspectives -- Partitions -- Provider Data Sources -- Data Columns -- Calculated Columns -- Calculated Tables -- Calculated Table Columns -- Structured Data Sources -- Named Expressions -- Model Roles -- Calculation Groups -- Calculation Items - -## Why This Matters - -- **DAX syntax problems**: Extra spaces require careful bracket notation -- **Display inconsistency**: Objects appear misaligned in field lists -- **Search difficulties**: Users may not find objects when searching -- **Maintenance confusion**: Developers may create duplicates not noticing spaces - -## When This Rule Triggers - -The rule triggers when an object name starts or ends with a space: - -```csharp -Name.StartsWith(" ") or Name.EndsWith(" ") -``` - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, locate the object -2. Right-click and select **Rename** (or press F2) -3. Remove leading/trailing spaces -4. Press Enter to confirm - -## Common Causes - -### Cause 1: Accidental Spacebar Presses - -Accidental spacebar presses during naming. - -### Cause 2: Copy/Paste from External Sources - -Copy/paste from documents with formatting. - -### Cause 3: Dublicating objects - -When dublicating objects the name with have an added " copy" post-fixed. It is easy to miss deleting the space before "copy" - -## Example - -### Before Fix - -``` -Measures: - - Total Sales - - Total Sales (with spaces - appears different!) -``` - -DAX: `[ Total Sales]` - Which one? - -### After Fix - -``` -Measures: - - Total Sales (single consistent measure) -``` - -DAX: `[Total Sales]` - Unambiguous - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -## Related Rules - -- [Avoid Invalid Characters in Names](xref:kb.bpa-avoid-invalid-characters-names) - Related naming hygiene rule diff --git a/content/kb/bpa-visible-objects-no-description.md b/content/kb/bpa-visible-objects-no-description.md deleted file mode 100644 index 7685d2b2..00000000 --- a/content/kb/bpa-visible-objects-no-description.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -uid: kb.bpa-visible-objects-no-description -title: Visible Objects Should Have Descriptions -author: Morten Lønskov -updated: 2026-01-09 -description: Best practice rule ensuring visible model objects have descriptions to improve discoverability and user experience. ---- - -# Visible Objects Should Have Descriptions - -## Overview - -This best practice rule identifies visible tables, columns, measures, calculation groups, and user-defined functions that lack descriptions. Adding descriptions improves model usability, documentation quality, and user experience. - -- Category: **Maintenance** - -- Severity: Low (1) - -## Applies To - -- Tables -- Calculated Tables -- Data Columns -- Calculated Columns -- Calculated Table Columns -- Measures -- Calculation Groups -- User-Defined Functions (Compatibility Level 1702+) - -## Why This Matters - -Descriptions provide critical context for model users: - -- **Improved discoverability**: Users understand field purpose before using them -- **Better self-service BI**: Business users can work independently with clear guidance -- **Reduced support burden**: Fewer questions about field definitions -- **Enhanced tooltips**: Power BI and Excel show descriptions in hover tooltips -- **Documentation foundation**: Descriptions form the basis for automated documentation -- **Governance and compliance**: Descriptions can include data lineage and business definitions -- **Useage by AI**: AI Agents can better infer the purpose of an object if it has a description. -Without descriptions, users guess at field meanings, leading to incorrect analysis and increased support requests. - -## When This Rule Triggers - -The rule triggers when an object is **visible** AND has an empty or whitespace-only description: - -```csharp -string.IsNullOrWhitespace(Description) -and -IsHidden == false -``` - -**Note**: Hidden objects are excluded because they are not meant for end-user consumption. - -## How to Fix - -### Manual Fix - -1. In **TOM Explorer**, select the object -2. In **Properties** pane, locate the **Description** field -3. Enter a clear, concise description -4. Save changes - -## Common Causes - -### Cause 1: Missing Documentation During Development - -Objects created without adding descriptions. - -### Cause 2: Rapid Prototyping - -Models built quickly without proper documentation. - -### Cause 3: Legacy Models - -Older models created before description standards were established. - -## Example - -### Before Fix - -``` -Measure: [Total Revenue] -Description: (empty) -``` - -**User experience**: Tooltip shows no information, users must guess measure purpose. - -### After Fix - -``` -Measure: [Total Revenue] -Description: "Total revenue excluding taxes and discounts. Calculated as SUM(Sales[UnitPrice] * Sales[Quantity]). Use for financial reporting." -``` - -**User experience**: Clear tooltip helps users understand and correctly use the measure. - -## Compatibility Level - -This rule applies to models with compatibility level **1200** and higher. - -User-Defined Function descriptions are validated at compatibility level **1702** and higher. - -## Related Rules - -- [Avoid Invalid Characters in Descriptions](xref:kb.bpa-avoid-invalid-characters-descriptions) - Ensuring description quality From 1c838fe320941d92efc5ce1d16dfdb75037177ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20L=C3=B8nskov?= Date: Fri, 9 Jan 2026 20:48:17 +0100 Subject: [PATCH 5/6] comment out placeholder links --- content/features/built-in-bpa-rules.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/content/features/built-in-bpa-rules.md b/content/features/built-in-bpa-rules.md index 311d7811..8e71913d 100644 --- a/content/features/built-in-bpa-rules.md +++ b/content/features/built-in-bpa-rules.md @@ -43,9 +43,9 @@ The 27 built-in rules cover four areas: - **Maintenance**: Descriptions, calculation groups, unused objects ### Global and Per-Rule Control - + You can enable or disable built-in rules globally or individually. Settings persist across sessions and work independently from your custom rules. To manage built-in rules: @@ -59,15 +59,16 @@ To manage built-in rules: Built-in BPA Rules require Enterprise Edition. If you're using Desktop or Business Edition, you can still use custom BPA rules but won't see the built-in rules. ### First-Run Notification - + The first time you open a model after upgrading to a version with built-in rules, you'll see a notification explaining the feature with a link to preferences. This notification only appears once. ### Knowledge Base Integration + Every built-in rule links to a knowledge base article through the `KnowledgeBaseArticle` property. Each article explains what the rule checks, why it matters, and how to fix violations. To view documentation, select a rule in the Best Practice Analyzer window. @@ -77,8 +78,9 @@ To view documentation, select a rule in the Best Practice Analyzer window. Built-in rules can't be edited, cloned, or deleted. This ensures all users have the same rule definitions. You can disable individual rules, but the rule definitions themselves remain unchanged. + ### ID Collision Prevention Built-in rules use reserved ID prefixes. When you create a custom rule, Tabular Editor validates that your ID doesn't conflict with built-in rules and shows an error if it does. @@ -87,6 +89,7 @@ Built-in rules use reserved ID prefixes. When you create a custom rule, Tabular The initial release includes the following rules: + ## Working with Built-in and Custom Rules From 66406323cd87202fab766fc1ef8498da4fdf4e6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20L=C3=B8nskov?= Date: Mon, 12 Jan 2026 15:34:34 +0100 Subject: [PATCH 6/6] Application Language Docs --- .../chaning-language-preferences.png | Bin 0 -> 141071 bytes .../chaning-language-restart-pop-up.png | Bin 0 -> 41494 bytes .../chaning-language-windows-ui.png | Bin 0 -> 106771 bytes content/references/Application Language.md | 101 ++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 content/assets/images/user-interface/chaning-language-preferences.png create mode 100644 content/assets/images/user-interface/chaning-language-restart-pop-up.png create mode 100644 content/assets/images/user-interface/chaning-language-windows-ui.png create mode 100644 content/references/Application Language.md diff --git a/content/assets/images/user-interface/chaning-language-preferences.png b/content/assets/images/user-interface/chaning-language-preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..272ecf0c352b47318d1e7dbdb090986e41c368a5 GIT binary patch literal 141071 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

Xx0A*?R@s}tOkRx8q7yO%a` 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 O!g+(s`p5R9lm7?nRR44U literal 0 HcmV?d00001 diff --git a/content/assets/images/user-interface/chaning-language-windows-ui.png b/content/assets/images/user-interface/chaning-language-windows-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..01db3ea36f2a5a58782b5a7f443598edd3628c88 GIT binary patch literal 106771 zcmZ5oWmr^Qy9PuBL_ktRx(5)Xq`QXhlu)`vx>FGe>6T{b?hXkNkQ#a@rMo-N9*o!T z_`_?iHG9@x>*=^30u|*YAEG@$LqI@y2$m94MnFL3KtQMl!FfD5k`&J2}K3*5u6LAd|~0G+Kf9WFt`N$y8#tO%G@;T_V- zzXzhD>mZUQ6Z+V79hSO4Lh@+)5ea74?#EOAEP=Kk(&Ab>i!;Q>6o=7!DYBViIr6f2s%)%XvG&c+xR5uenao!#8hSs`|Go@3hM0lad55Qo zWh|ZB_4Lt481)g^4|P(38PBty0s2t1&YT9^{YEEI!OLrB5{;=a@0AM_T-(Qzb~~YZ z!OmSITt8Y|UEYNlDw@IN0e(T>M(oEC0^OD;+2bX;;~sV;d)IqA{D~f((Ul+Q7aZvw zE{Apqx#zd87C9O&%SkUzkG}5CZU|mKzljHA=~fSZ%NmOt5+#&&e0I-Z%JQn(^Xrsn zO;Js<%WkM;AF7udmK3=nlIy(VBf74zsvewyiwT0}%OV@kjb44Bl*7k}^0xxgx`;B! z3T)egECEsAvvHo<2=ZCOv!->rPkTC(+*;iGz{|HQjG8fxeJK!GS|mM9_UFEC^K;IB z}RGH0+Q%=6N1ZsR?#c&OkgOHN74EHj?|x0t=!_};Yn`@cy5HwY(y zDsz)$6eD%cXqG#lbUA;%05@{^&i8yT}Hqf3fGwY_FixH;q1$#+eGovkOQ-Z&IIK_kJzs^P<(emOj8KcG9Ye1NK*ygb*J z@Z`AdyUGE{+6jYXQQqoBpO&;+g+EjIom-PlN$EoluqUC_=qOMm>oY`lakiOgoYZ4i z>BMdK%hA*u_OKfskGD(N{Wk9&7sfs@mkFD89OjpZi?7!04HI}$J)`cz8X)X2`^dMU z%WiUN76&=#!Q4gAP#FJd$_*FJOo>OYx93uD>Ol#~0m;pJ%eBM>MbH>0m64dq z&Qa<`M!{~8OL5eruWCNU?YhhGHB{WE{`0~am7bna! z-%ejQE;)(DyX`(3hfCc1oe1~WvlQLLXT=GJCSUJ6k;IT6=p8h^W6$0F-Ta_R28nJMjo(u++xrF0KwYP=vWnJh` zR~tIK!wTojf=Dk<@*F$Ayt{ugb8IjYN-KIIXz`G^`M&>apZ#BK25dbQs;puv-#&+a zGTqA{jXMoC&BOH3I|5KKcFiJ_EAy!b83(aTcZd>S*tmx=EEXeJ;!BSoYh;q2QOgOlpgFQM zq&Css<6OxkKc;KZ^-bGcEs5HYZ^8Jr?+rfp<<`zotrkP>4{+$*Q!gy6Ww-wD@qjE7 z<3Da1I4=sStb8hRFG1?Lk!-Dzd+kM3D$Mj4gYz!Hn2?CjREFczuYIOpQJw1?R1?G` zb~)%GP^SIozN`l}+L3#R38RA)1V|35KKVLw;L@y!?qiGpaMouQHg*tTyXl26Z)c75c_1U)aNlbRpbv>&0f=#D)!P+)M2+siqshn&3 z$S3c|Ir1Y$yLvL#U`Hvecsrz8%v()5qhfjPX}1Y>cW#?yz+MVmsaq`wd{e63cRtkg z)^oYko1wXmKyWKyP>C&Jr=dY65!PP(v{E3ZSA4AxYgX^)h<0vGL6O4wy7KJV;MV+e z=OL{TsUU4^x@}jZh#(B%MbI+_1rO(BH}hxPwd(sc3L~kZw`Ya!GRUd1N_}}RSR47) zcp}I<;fXz&94=51g`G| z!w9tQ72tK*)YReJC>@|@5}i!;Hc_b*b7RfgJk>DWbmc@iu|nQ%vmyBW!V?vZn2q8q z6S)Jf1wLt?o{@Ma=DRhEs%idtw-w|dW31!;lu8#9m6Xi}CXZ?LQ%GHG@~KYk`QxZk zvkP}7zAqSm-OA$!zJY5|s&P@Z1v-hn)bB>u<)Cr&Co(CY#STp1TyJYZ&SUP2=FMhLR@A?Sxn0&aT*guLzIJ4*_{!9^nQaC&@DScCX%C7LML?_2sOm4frF4n>sngRYQ|v2di$l(inY)U* zu}hfu(Lo|KPi2VMriCpOK7#-+4#Faj2s^_vjbA zo9e^eI^nKR{{2?n`106etix~*|9wpNThH9s!uGoUI8@l8GmXz1ldSQQaP`^=s#N-p~?(Jh|_S!SZQw;7Y?61;||~S)wsIMY5u7NEVht-mx$7{spbm!_71o}xFJ&QJw%l6&wRfhc5hN- zn*I~EW5sJBMQuMmH-b_MUHrT5BP4|2i5>pqgb_PU;h!&t#SuJNbr<|=;A{IL2!g*e zXe}TgH4?`A{P$6Vw@4%JTls(l^ZUW-u=C$w3$Q1P!9ru_RQgSwL@3{BeMttMr6|xH zKKYXwy#&(!MLW&6Xh?Y|iYR|o;QJHA!|uXQbXT`L@m0cVy?1K@WIrIB8?jECvaA#S=Gvh{N^$0elY)q+`tHYTFyE zTb?2KHUoQ}ON>?cUCYonU2He-%PhAbklZSekTcS`Wl77K^h~fV{_VAu0h&ROWAfv# z1t)QzofN?47T~oPvQPxqVR<3%pD~A~bJu<2p^rtuKhdBdIje1^ZORwBzexISW5qtHtg(ozm>}tpB=IX?I zFId0v`h0`A`E=fXfPZ|lW+l~IufOpaX1UXN5Q;Xi!I%aVdW3j=E6*WKBwfJAYt$d) zfK>USJ~}-c@P76)9rMMU$3dU-oTtXV=vvdaUJ~hqT%Vw(y{|;D)bI-SDN@9TxzRb* zS8Bo0W2=_60qodiUE76^RuxhkkH&P4^R!Bu&({kh(gc6q&G!&lLPNRtfkMa<^%oYN z5*#M*J1HwE$HuGUDKw$EWBo`5aQD|dPzj_w(1|+&6DgAVNnYyJrs)&oEgAE}jktWX z*WdgiP5eU+Eq(Xd6w(AeGtL~Qz0IY~-TL^5d47ix-x7V)F;hr;WnLMNc`6m=eN;&` zkv6BJw^BrNrV?+1czkvkqZw6Jra_b#YiE!5{1n`g^HmC*SqLHiRJ%V+r26V%87SW^ z-Uu>-)O8@2CZ1{rHCvu+Ax`9X>UtA1hbo;=9ZwUx?t~v-|J2cx3Os0Jx?UgF{!6y# zk!X`0poH(5<$1R%!F4lZ#n&fmhK_3wFT53bdz31%h^XjP_THh<$&af0<5h#GV{9yg zMP*uFz-PR*mc7v~E)ea2Gs^2v-yhx*Ca{f4aq>qVvhI$2YbhvZOqdT)=j|Bbd24 zw^ZegWkFK3#D}%Jjye85!?cMwiBA*XCca1n>O6_|J?K#wybTapJVjSI4mm|?Vkdk` zcxglkAGs72u#o{iB1r!6(oS9Xu-9f(nAFNf@xtj$)a1|C544m&BKLsm-%2J>=A@?& zrO|bl3wU{6pRJ^N9#5L4xJr;JGoYw8dnghn%SrF|xY0e&gbcK%dYzjSx^CC4P^lV; z;p56Wy@)hQx}2o^aTvJ#K0D4NgsNw6p(~7p|NL|zjFi_&_CoMjKaqc^-?C5aU_X#H zMX@X=#Z4M#L_MxC!MBcDxTM%0EIZ=-1=YTO6D7Idq5z@|7&*9y7t%*Q>~_c;I_*~Q zdTm)n4Eqk*s#{5M2be%WQ8Lrutnc#EAH3ACc;YTSloR_CLQHKBgZROf)$Po zt_-OR$}Tj?$xf!xuQbv$4stpa7&5){N;zk-kKjZ1EAU zxzvgxkW(=p;h{L1KoJ5|1pia%o*|)-pm#8+rkSFVN?#rxaZjz?NUi{Mbc{1!rAO5@ z`C$~sQa;)Q1VPzv@n~GX=I&y?TY6DYx0R`*j@5DXVJrudGMD(UDR z;`U2bChT81k%1Mm)o#vBTebMrfZAp*3Y5g8UQH(mKl)H#02V$Haqa5_24Tf&l%}sc zF}!;vz^jBbPsxSW9*t{BZ>7>vqBOR;p{SIw&v9RsQQPu|=ci<(bjpq<9<&;NweE{v2LP&nU6gGk*X(8CTq)OZ;MAi_llW-d9}Hku)nd~ zu<8S+GO&uu-H{~eWzM{X7JS!a=UG>~qr+i^utn--zgIrC`Zk=Sj9BSa>Ne7K`_ z6PoJ2&AkzIUBqCg)@X*wHj|I%k0rfNZYA~87wKLnHW=)iM=@e1mA}rKkv6vdK6?Tc z6(v;QkvcmyN5(+J(a&=Jk+%$Mh4S=kR+`4~#CeazKLq))E0dmmlYG{62xS}KV|&W_ zFjjyy!LzPII0%(Z9w3{sxQ9xSpy?}ct@b0OU#fg6D}HT=zG)~^;doJgqxA< zDlzQFYAzq5xW2#LSp`a|;rxi&@fb+17nUX7U1-R7tRQpAo5_l0IwWZeah=bVHc^Lx zkuza4AQ3gbeCxx)kX6MgmhYqFVB`+5pHXd0pUNY@YG|{MkfSvnYE?+Q~WMM)#2hYY~tbOL-Q)AsF3Q5wp`f@j?d>`RL&u$TZ?gdr^ArBbA!0{>BTBifbH z(F5j2#XSf|fs69FVgK|V)%R)M zSJq&q0HD+hBeY3u9(%8m{*l7#l`0msZN@0}Cr7RhG(+4rdaB{jHa4QBko?s0yi&!o z)bIH*2LpnFASL!_JK3o1jzFA!Ig)inQi)k<@{JEYHTrkWO| z`a#*M(yUpzuoPvp^c%=4w1akHoe*nAL?x&hsG|lk{+QH4wQ22Yr z!4hj1r&HpGWo>+&QsvAG=PVjXqB_Rf3yF@AvOsv1QN7P5yMK@srx&SO-B}r9XqxI- zjjvG16~QqXP0W#A0ZAZZv7!wTP`WJQCYLLOOqSsBbnDA`-knS|En~{{k9K%1t z7_u6UOl2wr(|ooDC$JWu>Zy$3e=aT>2|fjGm_whp=-~LaV|GlPVA|5QVrZtCp_HzG*pCH+$<6FO81K@y3?%d3jKVXq7v3? z%InfrDJOP{C#+yxOZ_M9v%wh%1F*PMWy&B-YNf@TNDRQQ-6e)0!Fu@f5`!<@<#Bnm zRnqU`kqHYShX@Q^4kiur@vbDCTOWK zN?|UI`q-0VFMl#SkH*&)hyyI!){@g&2-YLBYpavN#;W4R(TC1rD%NnzUQ!LYMp#o& z&{4*7kKLMnlv^^_1^YJriHG=u5Hk`bkDv^;v6vK%p~TG+o-K$<5j`Awr?cD|v7S+r zmonu@I8(76u{7LXm$d>du>+hcI(UOC;{-3?`WA7K zXpBBHe*)Yo!<8m5BQG0FLwqUIawv1YIY(1;2lsMZ>zaTMYD8*_5_qE6jp`^1w;t5h zFL>jDrxKkTZ_ih3aSHu(KnzMC1fgS!w65ax(aN#%>QaFY17ty+H0H0FLg>r|x*N0O zj$>4p=YyHm2^*NVit}h5MDD-Am1fKp&WX}n9+*QJzF5K<_^@wI=E{}XKPb|D zKmw8|AqnJc?F>N0S9)GS1r?Q`f-l!%BdG3%vc@|?Z`{rbi{=ft%%*ID(Olct%hRsB zm>`VaKoW7YY;$cg&<4tkka5OSbIhgH!V#&FXpF2^s?b>1 zt*UWVacycwO0h(4v{v?4xIXmsu{ff49bYAEI*kO~qqEW`RhIFh`w)F6`IB^eu8&Er zANVYfokWAf<4K3SH_T2|f_jRTJBbkp&=!4{qq2h`{>jf1!GM2Ofo23PNAasRW5hV* zda4bnd%t6stIAw=tNEs?1J&YquGyo& zvYBE-E&VKOq;EDA>Alp*K1Ux;YFQNp8i6}@KwDmJ_Oho1_1${>qKR3ZM~MID}|=v zaLT8q_uu)SGH#Q<)|GcWd?mrQijQm(;&Ux6s}Y8){{ehsYMAT|1XT6YoF%0k)nj6; zczks42U}$PA!wqGxx^dY?mJE6__V8v-6?9{(m#rTdGm7>#V(Fjopd~niYM5|n)e+! zk4Fp=B1vr;_dY;AI#J0)Qwc(N^xW2{^Dt~nv6q@oW-E>z)t8F6hUfzciD4?RpnP=@ zyFG5Yx&B^!JcG$_-X1M?3DpZ_&g5nz>396W=5!osWu4I_6=gZ!0O80{V6Qo>9@1F? zLIvy->^-+AvjW*B`$H#X#H;k7xd)#e)N>$fF*eSs5;o*&O8rI+VjE{bZ#%k~bjcVZ z>FU~~T@sL-KVGoWyX61z2i;5OcTMj%6`2_EHb*eju4c|fF>B187;}b_42?0&zSaG5 zxeVBocvPgb2s$?3iXC}6)j`^G?8j(v)~yC|4j=BLQAKZR#i)u?cTNUXtBo(4HmO;i zepfHsSL?4iqx_hX>O+ioP+vwQ^P zdd2>X=@f2I$FXIuntgrSw3lkgxm0=6PNI#D5}hMoQZE;2f!auZefFFDpyhY`yeUQZ zRNG-=v3AjOvE8raQMf!aPJCwZ67{4bkIpNXPxltwWXxF2_vwd&T;y2Kik`;Q=zzWP z#vrPM#ujMn1D}|(BP${f&BJGJUO^>!*W=DF#HKe^hcbHv)>~9V7E#bM6shEUHYDP4 z8HlE)c#o@^%9Nj5K$`V1#$_V!N|Pz@m58RXlX!ir`NU@{+QE$S9o?5OiVjVpVVc@| zOv`l1;>Y1yZJRL|H}D}f{X=Tk+*YBoybR^7RYmgm7@uEmbWJWa-p(2>18WmBg@eOs*JQ{W9wlrEUt}{4^j!Gr_ZWhRo(l{fF z(>Idd7N0$VnD%*HI>dGarTHf_THb^G10cDN8%Qs(1B0n!M&umVCrwk;!c--ihSOP% z#Z2$ZT#Z3XE#9_k!!+bwzRAy`0G^3Hqb}=(Pj>JaR@MtDc`K+9V0h%|&871o*V$&0 z;3(x_CJ=LAMo`Z?>51sB4~FB}WyT&Iu|S&b-I;REnDQqu$XP zFplW2%UjJ{5uB6S40ve$is_Y=)m2K*B}aGd%7oIMa>MF@UN5+8^+94+XrlDbfuXK& zT5@zJG8Pr&!&hG!k0j9`y}J8o9`+Mjcl&};@Ln)XdMBcx>oH@o2;=pW(zRyPn>bf;zis zE3LXGnqJ2MUFTu(2hE4(1)f{sb~1q9YI=xkZTSIwEpWCN1*LKmTvb$&<4y!SA(Et^jhrU+g<|P);zu01KJ=EtCcgr^jhPpZeUDF1Di*_ev3F@VjptaUC6Jque6C5zs+Mqmn+o++m#m#cjulFJ8%zl|LX~wG01tTq zJuYiD3-OteoTS$j;^d!ffvS*<;l~hb`RDboLE>jmjEQ*H6obSAs(q@1svs7d{Ip2M za{l zAt$0`jT3P4oGDJ~TRg{lihKOh+G*owqEz^!roIlnFVr~lO=5SYF)zMy2@WgxkbEch zoy4Ji(gqa5vU{)gfTESlJgQofm9lDnsqmL~BKFpJOb+LnvdL;_51eBOb^2$U+}W&U zJfp>wcFCRu!K!GoMIV)Z0->vHLc&FLJbA1Zp1Vuy;Hh-jbOs))=?cf8uaBHYiF|o6 z>mphfp1~{bmY8bCX$DDWOoVw_`#!g-AX$Cx z@QNf6sA{;0Mv1nGg4wQn7)qjPB6gdmz1J`USgEyDWrvj%D|0E%EFZ`KQJIqWyXca< zY}UkDYw#J5jGqq*GFn#Gc=|*P=0L$S=8l%wE$f}~Rb}%Q?>-HcG8gp}+!EM=t9%nX z^NrncmhMYOFQ65nqF_MN2@aLasXD-E`j}H!y256DcuNJt;Scl|zzR<516S%-g&T46dOzUWW+amCDJ_ zs9%kmD$x%QWdgy0=X(`U^tQz7ejZ=!XOUd4uWh_*Xg9vB2l20vE4=24ybITz_Ia@~ z^SFxzLxnZbuYBm4e&*EvXfRNcBI8gjuK8;8%VgEoqU^4u5&iUVF{L=XhAHuT8vAg$k*Cvq8SUvw~_RL+a>NDrk!q6Mlkbk)N8!#qSAW96bpv`|4y4Amh{Do(hB zDO|Q9_#^rZO1PRZy^5noS5t$-z{h6L2}pPPSxymal^Qg3mPMHv1~O+gS6@@iamaP# zDH5>=J(i7p&YI<%h#cmWO=o^qZn~3k7r7&wetkhx*U>r5%$CXnNkinKGv-H`ZV>-G zRC{rsxj>kYRZ6@mn!AtBcf6&$WDhFPuQ4|}Vq_~-bnOudA%?Zk*f0WgUb0p;jqpGQ*94HbSQtzJvp^@Re zTszRWF4D4&$@^f1SZyy47*bwcc3<{S>^GH<_hFVL;9iSmb4g{f3&7VvxBcy-zZMMBf* zqhu-GcyTdg>3n;9?$9TdVcV~ds4ys8vEq4<&K}YJ6zm#e^|;uoIVv+yhTg0WalWv# z#1D2$udQa99DKdVv^CDwj?~g&nF+!w9SYRdXUhz`LZ5PHw45HfUG4sCPkf#jCml)QR-E-Ni}s{@z|ChWKm>M5vLFNt_l)e(FgbrWH;q@IS*nq^b*jJ z&Q}leLgQYmfTQzvy%*&{AEA;7k<>wjxCG{&vH@sctwdo;QrRD6fE*vh0{BR8T*T%* zi5;SOYIz>rhYfjyO8n*6;+;n7-O|zUW?Je8OMS!~s-O(HWQsm+AlErO9z=$^3&Bo+ z%UEN3mNNItLivrTiJb9AL#4+J$IV828E(17a+B@paW zCNsKu=}2c*17UuNDTmZmdH^Y>{u^v9ex)zF5p(P|1*TkS03}{-!e5An@Kmao zI`8ON-@3M7T(rAQ&)HWhr_*b~Bhh4n%$St@kIDiB>V}@AF2@QWC=xcsMVElUKnWVm zrp9UCuS-I6l;Pe?oo3z7%VmBd;;;NdKYHS)+}k*5&!$E?dZ-yP^^-`N;NYdDbwgqK z(<$@t^K-Y+0~p>%Uf0F+fDye5uwh1ZeQjxJ>4ck#?76I=A1S=sl1Vdob$x1nrk@$E z>T9K=%$5G*)ktf0cM8QraWPKk`Iq#6Y5}#%4ped!iqbG8A-ojjkEHhw7j{yTRDE(F z#GQh63ZdN(@4gSZ$04{>_gZQySW`nyNo^ApZc>>4?c-L2h53_je(3oj*5VfsLfXLs zcZt;8kmdKwvC9Ee4Y87KR0#lF;YDC1+C&lBMsns_mR8m%UeN$x73a5V=3ZaSq;{UW^2%akDZfDaLIL(jXoHR&2YJV6G}Sl1d?v$tn#XAVno4f^uD1NU z$M2HSI#LQR9JdUcWb1z9l)2idwRILq+5~}93FCjhfOl($um`<=K8VymALoNDvzBL1 zsHR)%K)p4^iwUc^@J#SH=qZ%HL2OkWjM`bmUvqYuphX19mGasNHFpyNVf?N_kjSud zdKz+$U33YA6-2m^&)WVbACfOKVa95vE|r_x0#kB4(tZv>Qz)%qPsTx#Pn~ehOdwyf z$O$zGp-IgSwmT#c<4t5wbbUpLH`u896W%p86}(6|42)f@49_Ul>s009%p=G9241l> zoJaNxcu31d5m;UUq#*R?tetoue1_YkL`UXs9L||B$46EkI8?AS8fb(ZaQH@iyV zG>mT~Z(;h3y&R(;7%Gp&pr(d?euc+Hb z_%Ym74XUclOp|#O&95pHbDw5kaVX6r$`FdDOmKdwEu4lVzLevjCSmjiKUS=6F;d1z z%tBHE_i6q(YZj~PDzkuW5|Fp=i`t7ENU%xxX^NMBl(@U*u*MrHDShCdVvWOx1d%`Gjh^Hk|Nv=6A* ztR^*&u-Wn5p$tU{`8q{jkOA4ZAFTkOgbHm6hoosb4y)>|2NTy^?EL$PI%A0k6~CaI0MR|L6|K^IggtAO zNPs?Wt^F!RA}vEV8|5B!@BUjgyrM^Hal&__#(p4ND;j@5t=zzIR2vot<4EaHFI55| zPBM->{gzp_MFC;92c9~jHTVx0;!x&?--Bnhte@iqjNqmPsw#54=If!A=wE*~OxVPQY%l#M8xIHEzC)}k)12^_ z=pK)DZJAy$Z%xQrUSq5kp1KRWK46mho0OJPXK@QzDdH8TS|R5L$lzO#rhUFC z=DV3_rZKoIbd$uLnCm57mM|14r6iC2?si$KJ~T_QDf12f>(FBmYfW1}*r#I!8M>bD&Boe5w;(&LRq@>DygnE} zef-9!ARw{H`)td-0FW^bVWhLaCueTAG>8R2JNx{JF8BYz4f(oKuymdqrQRgwe90&Q zghL9|0R1=I#rN`2{AYOyr1*F zxhj-3`~}9b6ZL61t|LTy3Lu_L-UARNiFCXx%{?LNbDKi;-I@MN7?;Gy41U4~4klDD^6|0^6V1fY1n?T0Z`lfzHgDw@iI3Rrky zR7K3+qy;cqi2yA|#L9j%<8cZCKKwf0fia}+#!$Yi|6Xwb_R(AU42&DiExdF7htXK^ zwD8#^66?nQnWJzV^ ziM(vL=x&sMc>YIfg=SGM-+Aw1_AJ>clmOLtcYLC9Ku)B5xJyFa|KruSh0|k2><1VUMNamJf*v|n z4KHmb%#fc`@m6d8C!~N{&Y~Rd0%?&S6(huR>3x9Vgm7vIBCFiL%rvk-kqVcJ{ibVO zRg!E=bJ)#gK0HQ-{N$J<;#*WJK7qyy%WLPXjw#E^@zq=`KHb8`ZT%@Vedd5=4a+@= z?*FFh4n&2@7gMh)ytB7X8$tvK1?{zE71GM;>NTG+*UV5VmuQT~^*#tLsFII>0?cw4 zDaEUOAi(b;Ez)|xM|OLpRu7zs8k;#Wgfs;jzhsGFtU(G%tsXJ);AMIP-tDR;cvJ(b z(bIkATNRKNmW2qyrr5ZPd z*ONlTS*`XePb*VV+dgXplYbLAsOw+wVHomi2O zy$>5aogcW@q4Tes$db)$QACL2AH4nfBSIgD zF^Pzlq2AEN&X1AjiF_diJUEZ2lRN<+E~j&Yhzj?Ys$E z7p53#YI|EP9S)4&b`Y*q`!WDs=E@Q*2c$0;vTtTcP^Mi@$!~h+KKIf}k{+;uE_hRa zEXfmozFZ7INck(!zD|IhaH4p+@=l0Mam=vUZ^-4b2fwuKQfwr5=%vH6dgKQT5h6?t zYsHk7d2NWm<$%_9D=+-K!*D}UMET;tD{hPvbnP6g8b^SyVfjg7a6uxox~|@g^qbnt zK!IGB0W~lG^YbmxPEbK5{U+X($}_f0yqA*dP0kg|F9s*33;j(e|KPh3kdl$Vb;kns zQm0vy)KAFVx)&Vn=2-Vq?`?^l>txH_X3fcoS?wSJZ?4OJ36*B8`gJwV?Pl`X2q@FB z4#~zwuh*TWqptY}kq`c}!7LcSC2bY^ZHQb?3V}NLZL}{DCm3|A565HL^dR}mV%*s3 z%lT{H$=pKK@7mp)UDxqX%1M(L)Rp<6Ty*_5|FCEXu-hTAIc3LQyR7%^FEVSryBh1I z-i6DV_eD>e>!PC$;KLO{N5|`tcSTiIwJHd=4XKFN%eEzHGS{j*dUIJ`_*hQsfO0t7 zr2rgC#_|}^qVK-%4~6TCgCSivxKkms2af#x(eU4ph?2&K8y;E!(qZCkwMO_y%;3B~ zr)F8(UyTBXA#DA%^tZQ11mX!Hzqtx2pMQOwEZo;Qd?J{I+s1DX5HEiRUPi)z2;Eh) zx;2^b7yEueRm1@t2*BroOoh3Bq>U_`8A)p+%Hs&%=C6|7{sIm&UvzcYeTX!J`t}zj z8veldC%#b_2T$mIN$;0XN``)i8KvI>ahE>|!HU;QJa+?bx+t%_{hq_AtO6$6(jQo~ zD@>)T_;>oZbrsd%5t1Advs0rytjiLD?8WV(3&2g~b~k^ayhE@D^)G&4-Y|z9-k{#b z&$5KRN>>S{S4LcsBmWwD1mt_vWRH$V3TP#9&W#jfM*w(!IgQU>4E1st;IXd1CXxJ0 zPcl>F<7=p&+-g+PC-m*VDg=~3I1rOa;m~z1umATJ3BX#h^2An{1^&wbR{G-ie`*0j z21$T{U4Y2xz&V+SJOLjRxOMDNz+`n4Dt8kqU*GR=Z1svZ5}TXM=K&C$9l`_4or#~^ z{|draIkJu8Tjwly5w{1ASy)PtO%4Wlnt;!dsEr5xyf#3VN(8h~D*!Na)wd0Je|Z@g zJ2?Qr@;g^2a|)a+32b)YlwN*r!lRdOHWU*8tjaOapnXBOQePb;uoe^$#Rf#@e?uo< z7o?yWye}=2d&)*75UW6Z>loZ^%Nv50Q~&&qsV6qu0Jec)U@6k00;nh|>U@qSB(cy> zk@+4n-u0#^U7>#H=hNF8piBF>!6}d(u%W7TX|Su&`f zFNCM&sm!l2Y$x>Q8)2PM)U*n;xth~lAAA7=0euZEh=r=Ba*E`X_@7w(SKza+fPl$H zmG)S7?2>%#?e%jLcb0D_w^4BOh=yfnQzS|GhS1#(;$pjQoVtb)olpd#;& z@eVEZC0HGvf2n*jD*e$Td<9!$|7E^t3INPy9J4=CGG4S^tsC<;qWW@qT0TU(U??X8 zzsGO2aHUBz&<#d~K1Q3yD`XgpW8}75{07Hh0_}#?Xk?%L7%JULmwli}2k&rUGj)ZL zj;H4{=-alu_w5O($gz-TZFhUNvh>cVd+xGt?pv9LzGv0&0npt6-(9S`)OevLE>Hle zX629{;GIgW6j(d_`1C(Z1%#x@J|q6I#LFgQ8mj6ku9pPo9p}cKQRiRf+_?oKX8`$M(kRWW(3`6K* zp|*w&r}@<)9E1#X#Hzd~NFDM`aX|3qGoJ=?bTk{uK$M4QDpdqI>F+Q^)`ty{cl1Y! zPfI?&ByU!i$4#?*E+&HpQ}R03vv{-sK*28ncyk6G>ZDS%&BN>(79p@J-M~`*OpiTx zT6Rq8Y$BQ^suUgo46B<~kNk3oFQH?Xeb`OuOkBI1Xo)d>^v#U$)x*D8jgWx{^4HnO z7<~9_LWX@_Fo2;`=f2~TE~FoE1(cAfR0}!i0}wYMCHsJITl9(PR51)xp;M4TH85rJ zV^#a$QZ<}`K@Y1xA=HnqRyWheIoGCRudSY!tZJYftT348e~=%ju3w z-G7NK9vfrylG_{2R{II@&kGe&_PN(5zF8vkJ z+{!2mAL88;brHH}_+_7L#IQmB{2@(mbtW zxc8}0$p?&IYD@Kjjj1{IBEmexFzz=KJZso2uNV;EtuC!+R@r~~bHd=2)^KE8Zw9P! z5#NkUjZ0b-hMd0T`+}!m?EAST&lg2*9KYNpNOIq<>#<_M=a1$96H{+VapnffR}Agn z+3ZdG-cy_C0*oMJ`9%+R_6GpqYQX3X>;P_^*EHEt-PDyZVoG|fw&OE^!ZA){bKIcq zYChT7;dYsL*%d<{r}wp_$#6!4?k1(6(Jg)c*KngOIpWI?tw~slm)228o<&4vQ)9Mk z;Q)kKzTiR9UTNvEnQm+L{$tCeKoOc%^)GQ3>n z{dP)VfY)PSyu4}BnDgh*e}9H0{5}#Va-56eCJ9lnWyH_@Ugn$K070t-ml&mPz>taL zr#0N5ZKz53HV1+ERuy?UKN&G7EH*}74tXhDKw02W@Jl7rC7&2N4L#SaF*S$Ba;((0 z`+#qdP1t`aXJ(p&>dDHoHIsT7jT{trG;@0ALQ?!c^WwXWj9bV+kE{`0Vy*KN(0%=2 z^qgd;#6FFYYp4t}v7py9$?-I(7BkbM3R>Zzf7eJ6!;)yjwUGYoW-&^^Vo%ad;x42X zXhvs|o3jv0L`iE8SmO+-7)}UwPk(?vQRIX6RDs2I=kw=@?+{9>TA`d++D} z_P)5h!Ou9Hv(G*|o@cG~tUYgn@(T7%Z#{@cd7iZGO_wysd>DPru$&57$TO7j?|4pP z{w{N5Bq-0H?{S+_7%ir{03(LOsg#YqsZXn=M_o%iAKp_OEtgMLOZYv^+Z*VperP;9 z)r!Yu{!po^V4D*^50foyH*8{a0%G-k(rmR80<);u*WWSC7a?)!hL&uy*$XEeIB6(p zqKV=h(Xuou4?~yh>(uw2#KiGCp0t>2)2lpQJ&n|GgLPV*ydBLY{Ba5HygSEVh^{vr zuo>mOz z-cx(EN@x4-fsOIOi4RSuQb^=HJO@((DBibKSMm3z__|xUK1k;Xa_raPojPbTQ>ipq zG!MLZcyKTG(`}Mk%hR*ig8S;IYHKiiH#F|;@lWZVE~Vqt^!i=!LN#rh?hV@g?7C?S zHwJX1S4DHRr+xA89Ump2n;|0m8!uhIbC3VsoIv@Lv+H9^8uK?u4*3s|mb(IfSMPQ- zM*3IsxgK=bkG%5ztXhjxHA$30xOO9tyMRK)ZO%k0Ug+m(9gb2;n&5l$$&9mi2T93Z@1Gf5QvyTf`stNoMZmNRx~IdNFCyxR=eB;QRl*{}lQQ6;(rM8#eg&%qdo z)sivi5#=KD;YtMRnqUh0vnJ=U__P~S`eA5JwB|yM1yv!*yE}>SsvP@;Ig^5F{ep2> zM+#agjSpL|`uo2DB{ZmI>8Xk7wri)>NOX{TvAZlOLt8~MI}{oOdy1B?h6PvIDoEdM zD>2{KV8V3lExj>4(xU}ux_*1ZY3}VK`f+2=(2YAjA%T5{;;d|VcFU9YqJkDK{FMn- zYd`tH&4K+yYbWkwZ2t1zi{dfCXnG%6Ro2I6Pae3MFJc8=WI!btbzQ%abFE~s&k$QP z%xsTb3VUOe;o%#Wg3Qyk;x15u={Newyd8}}8%AtZ zPaKHt#F+QKp}UA`^Xth=fUWAY7+bim;+dgHhb_A+PzkC7mTFqtPf;bc66lV6mh{vI zJS4O12X^G7I9|OTIw>^6+V!cVH=azOJ>L2?zSfgFPk%@-v+wU36GY7wcB4kJT$8!M zZLY}vFrk14v+r|@@%|9e>$!}!@jqChRE4A~drr14jl^fDQ|~0dl@dv zw-Bjy!bfe(n+JF6!#jBn)ad+ephx?o79>1QELG|nIk>*t_L~!QTHVSo+Jhg-$Z9Do zVi{9$vxX4khbfz!#94O+v^*zdfNy$|Q}e zp*oW=D17|$I_l#Zb`w>L=|j$Tz(cl~t-?Xz96nb|1Wjlw z;~vxs=~&yI-4**2@EB(9=l08@YQ$lV-nrPhEwt2b^2D2+V6kK8yY}XDzWru(bn-m$ zC|@x?qexw5>pISbfoN^pIJ)4|0beZYuN$wkKC<}VwP#>EE_S{ftdvzkj#FgT;I5=@ zu0WMy!CmrjtA27EE6&KWEAFn;AB5RMoeXj&h?6Bzuiu;jP5)w|Fb5{jz>0ur61>8# zvMTvQEP@5?q)jo6R8Y6Wo(DBLnBLIV!VKZc@U6^6b#mWbAMhY1ISp9zzc|TC!=?C6 zZM1q6-)e)X(^0k!EBn$w%P!p+{R#^hn{(3>`%xPA&;o7Jy6<|6ugv?*0e6!)&hqun zfeiG@%@p zUafYKTtT^QdTJA8#>Vfdn`!K+oT)s$Q8G+8is3At#n0s4R&dEs;g6Yyq%HonfqS=& zEWGM2_y^3B`QLKV3PSl5VL`6DDR+-=n+pzL4lZM z+hI&wlg!l5X%fAtHC*7lyUIc<7DL2lwr3yYH~5=yz&&n>r`_3dew`hvXV@ z8pTTXuh%xPsP8Y|&k9_a+8vS8Qh3v#aq~H^X4%Fq_%Y39bI(Af46`}j&UsXH4yb(k zDD>)Km_)MLhpmRzWvYIzmpxU2ADm5mJ)Ehrvce|%y{Nw7&X@1{$oq2FE+zYgJ^#ql zAL7}@P^(7EC;N0;jmG2}7g?57ZvbrnC@8aNV1K=G3%Ylkq>682bixd!nDqht*la)F z(t2&!I4C>DZK&qWkw`51Pb&kn_}e7w@+|rMy$s6EjJ=07gwCi$3Sx_O8`5XfW<|u0 zlWXuHxQmO0x6i7Njw2#aM?&JHS~tlwlV_yiGY%|bMxqwGT0a=FY2dS^YX`lDP36O7 z-llZs!Z?1;_oCWNe=Fj3y!^6`Rffy8QApyVNf0oiU(#`twL;m?>EWopcMA2&FM=mn zmr1Vs8VVJs(iiwNy4zdJ^5h)^F0?sO9fC_4k8MvYiG_6EO91jTdV}PdUV@r z;=+VL;-qp?zTHaO|6o4Df*+S$V(y4zF^)``;@cC{R!Ix35(?>x*)!Ot1@HO+_*Hf^ zGEQAX(BlSGc-y78x)QDVxVJY2DkUN}I5Dlde)ek`cp5#332AbFpv11Rm1@nOrpv`b zulY;Fn9lG?Z`0IFKA)tDp>G(mlhTZk@!aa98)r-^%Pq!}p6624dz+j1N!m{p@+ag( zjg%h41s%&(*wG(D6;>7=IcKPub{dwt0u9feVQc~j9q8>%`bD$RL|(`DPgLla5ZC=R zv@=4XN>cj3@ao%5jGIfop!{qkZT?OccKnL@tDBvitGOWNp9ApBK%h_{#Cp4ha#jAI z;%A})7WCCygiJD)QqeY$dW>WKFpCtd|dNy+997j#_$w-y1)Vt zE{OIU;oKB!x#o>S`6(-y&7Rk(F$+F!fJe`BPy#)%Bw+)R_d)!Ioc&aj<3gCZWj`g0301<{(oiBu)!_^hU8z`;ou`dqr_^^_w>lgK7OQbLRJ)e!Y=vnlL3} z4Uf;MQ3A4Mfd2$tqZ4>{3&pUZ?$%NW)kqJGZ}JDRFhs6aSeb0saxMIgWI-wpW_a+e zuOWpE^kq{>d4iewbFbeza7WFB$Gu5`+OC#Y^;!XRMn89PTTxw(iDFN%L9na8e#_y} z=-p#-T!}78d$Yj+9cAvLBZdjs(dg#hZdUQf-_7t{>9hUBypw81GkW-Viyu}&p(Ct< zL7JwNK24Q3ODSif6@c$qGT+Cag+)Nebm~@C5Bg0PGE1G!hlVDGRaEb)?%hp;B=vhg z3JiVKZwwil$;{xCP~{@TnN^F>ZXH@g2yo7E=WhrMN;q<*Tk%2d0B)*ue%Xw#1Vgp_ zw<-?@PgtvbZ=fO#_OMBGnhcd_TxLXeW^$(r4`U|nr{AGMZ~9c$gVDvUq;sBB+HVg0 z5Y1Rz`2rU2oKMh*xq!V7MKeP2B8hhdCtG;jj~e$jBERjKv48Wx_Qd5OXT$7lGRUbi z&N4q)Zkb~vSU|(fV~kqxqb*H^=Z8L|4&8gb-^-uoVOcUyX$UzR>WTPZFQZn@C1o9M zuDnHZM!bD{ z9Hu#r#FW8DA#6ApQKDOKYd(a16Q0j5@gDoSNSXMd2&y81kOGZzPl75%?8xIx=IsF| z`tW2IeEix)GrDByk&me_h>AJ4ctYC04t<^b6XaweFFUW0W8Whw;jp(?G|{X@MZOwYo>dTrMMaPTxjrj zUz_kkMiv&bHT<0D%K8&sRcY4BM+$ymg}dA{6&AQgcs@S9Qe3AM#BP=NOy!~Ut046Y zpCl(>m-+dyuVsg%i2#lX>?4l!lXK;9zq13!1_qwaQ%#EF;ebs=%!CJKwG_IBAC!Mn zEKqaOUc=s*1B>#Nwe^wRpAjYoxL4ptd~?fi56n|4zU{e7v@|JzdnP!WEgK9iCU#b?OVt_*DG=>Ab_%ti4t41x<+OIq@(B5gWPxJgtgGwJT+97I+lRYd#s6U~7>t1O@De<8 z({Njjht)dgc67CMa;>Kr#EnF>OjDuQOte3GmP-zit!Cd?ePWW+X19mz7=j%50hsxc zUKqD70Cq%|v+-2=>>xwaaTf1eK}Nh&uk5lf9KLuq;C3*4lU)3Z-e)f7{31=IB3GC( z-QlA~ucPgV?Fyw`X$n?FO$LU1^8pWW4M0_vP5l--u}>jaesYC5Ke*m5NZJKj>G+6v zadeU!cKi|^SxI+xV*-|@$pN1{4F$$y@J&BHhu+(WUiIKaZ6LCA$Q9|1A z1r@PEs;xqZ;)>Su{0U#TNSA^bo_p3;c20nVy8-CH36Uc=Sk5ARfwCac@%VP6n{(HA zEj*|8!*X=|BZ*MaXey(Ooi$x6?DSagt^Gn>8I|WaBQ<4(mC+jpmA2dp9fC$+zSy^# zLQ`M2SFh)=85f?* zeBw!bExeS0d-;YBBuz35Q`#Eod>P+#sJ`}M zDSW_FNyA3?X*$z|>CEN6L4EwD{k5OQZLx7|6wL5hcbXhOnwZw~Rzhhbpk z%2**7$4ia~wD%CD-N|n$RGCEU_gw zc9Ac(LB;^^ao-E$!z+j%n2L6@0lNue@Z#-E3$H%DxbrUHCVNR3#Q&u@uOSTsrG#!1 zZrerwTyp6D-x-51eHe0%!2>-79KjjW`F2zqCH2i8`S2mCWU|MfZ$^Z9^x5g{B}1HOE&*EoOcVBkuF zf$O?Za_Qm}WskIrSQ+>+K|f;RZ(pHSh|q)41v!0OXSby!i1h5=o&+L5z|0Z2 zk}}v1bj9ptMmK8?&XN==`$wI(ye&=`=+DC2I@c7xSpR)=#9JbAcO0Y)CF9$OD1bvy z;og&Qh-!ZAOfB4Wi{va4FR0RSzn&Jf(=+XH>0sV>Dc4Pk1Dg2H$X_mOOrU_2$0 z=u)8@h|Ycb@}nXcDMtuPRtoo&96I0f z-J=mL8~)burU}INdb=EMft(zQO5!G}TwGkLCUT_G?ZzK@Pf22h=<>`;tJxI&qjr30 z3C$>>JHNVeYr+RlZJ7$*=H{BRRF4l0z0ErGwaE?jzmi8|0qtir#-XDT6j(LnD@N`( zQU`1WBtAo7c~qk$VBe;~AJKt7>Iofu6l&zUUlLCh)vk5|vgNi_Uh)i zvRNf1`q;}*n^uKcn<(hz${b1xE{?qCXlxCq+wU{MZsiW(bXoW2H?tkikCkVGmPUxT z6lIad7s;6jr^~lMYm_w2MIhlxQ^GyrFLm)oXKhQ7M zp?CCm?&U}?Aob319%Z;$a;LC#^0MNzR(~4vd}s0Q3wKL1cN5i0ZMoHCTp*&(zLR=m zSXEu>RY#C%ZO=fcr)NXMe$D3qj>QvRR^tVzQC~w6;fCq^OcnYjZ1Iz=fGpGJd-EZ) zYXq!PtRzfn3BOem=;rS-l(j{ytj>4mDY6r+%j+5!4`}BsTckS&)N?Oi>xn!-1cT{H z4dIoMw;oWMkGZ5bVo3}K1T&esaUKuoZIpjo{XYGy!4>A0gEdxd!EF>xVzwpAw z7%>oA_J-U}VbTU+jic-Q-*!)_7_j!En(+HiO?F%|R&95PQanX>_ekOD{Z3ZvpVE3&X?$gk6=GQyTyU7P9*e=s=F|;2JfOoUC;ah zo3Ri{Gb|B5wvz%ij6Xs2ZV4(j9zGCnvC!L`ZgI^_YGJImblMF?u2^xbNyetV%xP1A zCm7YjRDBW)BL_~9h+_kMS%=c4yeyYNb{{F-!Ssf`{mU22Ik8?(ik;7e@$qKPmYS9n z59{LNzesLVXcuZH6x+Lon=cQ`*`GGOFCpBlwv!& zQSOhB^_j64=t2czh`*!tpO0VCM8tkb6xri!+vzQR1Xs*I(=>;7R9H#Otps<-SSc)D zh^_Y4pH!7_D}Rqa+@G|YIy>ce#`2~el{TsG4d#7zWd6;MKGSn2>R#_NTdtdGGn<8be7 z{{u5fscp@(pL~Zbz9-Ys1tFwW_d>sy2ccIT47T&Z7`UStQKbm?*l8d%r@jeuIYaa4 z3sfcavT4Z~8!7aky;Zj}LZPjch|?L#d1I$eu`+qh*tj|LhGXyb0nTatj6pWS^_Cjw z#zKf94^eF|E|;_y@ls73#PhjMc4)b@kFKZnut(2kL;O38g2 z!|T7x#QOqKckRoO)s=OiX0{#sz_eaZh|juI>3z#*REHF#BySg;s@Wzr{r-9yX}Dl zE18P~D>YKHzZ69D^zJ!LOaJK}fsRV)_7DzGBxW+Pc#xPR_hj}P$HwM3(XHTc@3bWl zt=b7CAm12?d(Yz(Ec3l&AldB{|B(f?dBQ!e?k&3eF{A9E0))wr&KoUB=U#A=VYlUX zpjKiad=$R!^RufeUtA>7ZPx8%KxZUcMm$UAc)t@R?0xXB7A%+zy)$#wRAYjl=AEU= zX%?K`hFz35#xb{4TFJ-ldSwl(=piiQ+>AjHDsQPG!OumeZ=CRGc0!jM#bf_VuK9X# zPj$WYYV>cB@`p>mCuHAWRxi9$0ii{@?cDJm%oB?bZgG}+#ORx@nC-%%(Mc;>qg_BO}G3=*eQSFaCocD=*=$0MYfqn4UVaIf& z`q!wG%6Hi_g4#d!VNGsC=H4hfa4XWse*||!kf z;KMXb4 zTdT=MGEZ5JvD^TelzVL58}XPKS)W>B#tM2E#h_gmhi63H27#jE!}$;UO!8EFPH~^= z7h3_RoSZ6}@&MadH0Bw7L}X4p`%z_cc1?}O9w%>&9c2*r?$;3sLhf4uXj_#f&^LvC z0_Wuh!ermm0!{PjM=We54@bTv8Tw8NEJZc;MyWAt+{VMFHqSfau`pFpH-e;Q;IJ?O zIJl4TrK-k(FE|s#pW^<87$f@)c0x!;!%diBIm=HB`5keSdOG&Kz4`4Q$i6z>hxe|XKT>j`&k6+>n=Q;Nqa`57SIi1E&ix}<9mwLY6wf=8#qWa2C*)l6 z*OH-53U5?79H8%&dw+?>l%bY*G>hYM;e6p)<|EDCNj27u5H~sgJceGr+COi_(Hm@Q z?d(ukR9M}=72tj9h&5(66P?6tn6!Q{lg@zg;it~~7K^5x7*4t1Qf`_8RdxJkxh}>x zHDdaP)vb-=>}3_RN35BY1kmtgKK6jkg^a2-x2(*J2kX}Sti$$DrQE>1mBytaeeq$p zXzy5s4u8BrZN0QwJ!mhfH3NC_u&&7K>gN`fGp%+9_4pK6wviW@Md)M3WyK!K&`0h^ z=C!F1PkQ8&OtY6-u_R-a9h+#|D?$EB@TpI!JYkSrPd>!mo|u_Rk;;*p(<^vp`$;Q=i2 z)}Qk42>tswlLU+U&GaXgqlgIn6m?kO7Uz<(HS~D1V(384MCntER(@RM=Jp4Sr{8cc zvZQwjh{V;Xq-l5%QBS&ek4>E;{56#d@G>6lJt8%u76v{vDDiI`=I}~_5+Nos}!gR^q~-MnMyxVUmn03)c2sXXZu5CIK1gN^OTBsSy_|5Tv5CIq2GAtad7F5 zM2ZsQ{3%JTi@jidshn}=Zz+kz(TX)C=~BxD%o97d<3GQKi#Ke4tJ1JmE}9ls~URi~17zqxgnVyQyRCmrtY=!l8c7f+8^V{uq#elqzOc|1E$ z&Vc4*DKz?#1}6e>A$^YY@KPZDe~`h4toFd;_egZZtj5ja{z+7$ln`oo$9Yb*+Ai+( zPe1WRRbg|XykDVI^M5fOkc| zm;}iI=@NDU07U>I5hrsR$s#!sA*q}zCaHbaXVX`($+=n*x-;ZuYw4~8J{D|a@#uSAB&5C=qMPY?hbMVz;eu6pzL;?%GgZQg=2>tobo^*f{ zU0md18Ri6?(^L2hs2LblkPt}M#h1^(C}76lIXG4Ni=;U|nSxil@ku{Q+wqh|{P8v@ z3<((wu0O|MF7D%QMEF>;|qk2HfE%GtqF=HF(xMJ>#-G8LRpep9oyWV5n3d8BY z)X4ec0tRANEW!p>dTN2jt5FWSU0ci>xC?{tGr(6`uufs30RZaD_}eq@Mj+pwLa(p@ z&_mm-+HlLohJy)`PzgSl)$v-_V+a$gFi=K=LE?XH{36pf1>Y>1=FIF5o0)r=;re}- zc2N_agBRyGa=VWmaxjBFd8ny&LK_($U2~V>3di|aSBBC(fjC)Da`I3jZtT>#!OeAc z!cDPeTLPY_$p!lfoX>vl)!I$N|G;YP+V+%A4if3ke!{nBSQM!K>l84`n7~DJQMpl9 zNotSB#upRK=`38-1nH&hMyz$kSdF zjvq>kNPhsSFMMiCsc{ckXY|?mNd;GLHWehtViLYqmdMSqB1n+_n>#9FrjivP<9;>U z^26AyH=+CQSWN-Y20l*9n~|gO$)P<1S~mv0VNos1fSm!furXcv zD-A<|QqEolU%r5n?c2P3hR8NG1zgf|>jA+ae@7oo%r1Lm_;o$-4 zrJ%@;7Dw|g8zsu$<-;F=zNfxm8jwl?cv0?(6>q^LQ;jWbOBRvT%bTmWn(n1;{i*hi zQRQvlTsfJO#vRdcMv4T;QM12t_q&xzNPok2Mb}VfW_(^ABu$oj7nFC=<>6D8(ZyRS z7^h%=zFaCv5sST(Vi?iqx--=^k%hi&nY$9Dijsity6(CCc{S%=Ue;+=9{s3oC}4&L zWT}&|Mv$_iYDMvZr|Eaj3#-6!o13JJ9bkp(<93ppaRx~wq5YyzfyPiQ{gWVR zW^`#^Mdnh}sJ_C;ujK}!4Lt5SZCRO)1*QC1#M#HJA#-9~^oJ0h#jle=!X0CYW)+Y! zW$Vf9>3pv2g2>l3@YzUKi28V$YfRt3r)KL+T)a^xCyk#G+xKCyWrB?=3w$@6w3Aq2 zLj?#d=~U}k{uoa;tCRVilgCU6hj;Keg;P^3P+I~kvc|Q3qJ88VwFAs;{+90hr_jgH zi@D-nh}m4pi%)xxpv{**N#@u!EYb(k{ygl7v`qG3$IsAYEzS2qqJU&fx#4d0#Suwq zcIkl}cf%~y2?cvl6j8ufICLDEjhd&xO&wlT*_nAN32%DJul^n5bd)Cd=BKUhH3pj^YQw}gtwjjfzd@}Dyye!tbKk{nAO-=Kd?9Vms;~5UYZ>0ZAh?nee8YW z0T+N=k9{T+XC?Cu&3)!ak9?1zz55J-PjOfU>h||&v^;vH)7auudJDSni1y-gJ3HvQ zr&UAvwZ=}Vt|kr7Z&rmxMGpo>CnhE`u?x0i%$#aec2IAo$^YV;EY03ExnG0-EA(Yf z3{8(?QHqcDf{#)GDB7;s>uLIMgv;)Kx|im1=z-dB(lRwU-n){?y_b0BsdU?P+(tpm zP;ZN5Rf(kbddOv2dvg?6mUZf)(C@HVut?+4v$0tmY%YJj^ce|Qca7k*bjYe+_s zUkxH=4gWzx7?|!aEK#q1=574V{aq6q<^hEA)aLQ`^hpFT6tW1g~=ne(PdoW zLDQ&DKPe3}2D#H?dnn%BwlQl9el)E^E?oC(mX+wb@i|#g_YO>mPnIbI*O0|cTt544 z1n#sps!;pS{a}k%GxX|^N@96_lFT-jJLYt7UpT2m<7{63)rjG5)+tuj;7N}~Pj)&R zS6Ur6_4oVj1vB?8@qDA7pPs(Bjs2iWz!Z{3%5lr4d)>}*P{qDPrpsR2rkd z9@c5uTl-XJkPkH$*!@CFBt*?~X<%@?iR!OT^0PZ}GWz*)7x6g{_mJYcX$KqFqfCP= zI-LgPsj6$f_q2GY5_Y0G=d-Dscy$Og0;?${nKc|W=IP|MO#Wr9$%huFmTV(r>Z4wZ z4IkFUf}SD;jYio1Hg07l4qr=%yRlW;U{kYP20iR*qho@|IhaQDX@`c}S zxaag35hM`3qm-7s^*)j2eDZ;VaKXvG#3$t@JTg=~`8tKPBne9DXuR3xFf#^K-zn?T zFDy8I25B$1vUw5~OZa!T84NT50G13h$KZv2z_u9u$_+dM3)W+nQc&GJOH4Qgjy_Mi z-*AaGVKM$I*9bc`S;JImW^oouDEoF0qciz)^|MDBWWCwsXKfwhge=jfyv~C%0t>s( zU{Yk?1^c?iglydRjSxAD8NEC3R3FAgrnTIbnBN4WmQ^+uUSbaIW9!>E4@) zLVmW?TjBy2iNb5J2oDntsvXdjQ6~Y6=2*s`JFC?#LIL*FiLSPvw0;k!$oT@`5$7;X z++ZSiFxPKnDN6N!PLyRUjZ$T@~xK!9iPjk6_ zRQnCreF(?jAwd#|I^JX#K0HG^E$Q6X4;jFm2V#e6L~`;K2W%;dx`nZlNsbKf50Ues zKQ?}@*=(uF4Bm`7YwA+;_`FSyO%)XF?Jx|W8aintGIxHI4eBqaBUlzm^vLS?4Hk?1 zzO=C(&L_0{C>j!JvMsqd{y%(p&HN`q-+gV@bLEM%+-X|Pi*`QJ5vvkn>HnfCXXng!(*tJA4e>qofXU7sJz z+F#2JRJRTZJayFeVjalP`1D(r`t8sTj`$7-DxKaf?k`et$XIrrPK9lhH4Ekic=Co_ z_Dv~TGydl+FCthM1}}^0N5aqakV>LAR0ofipW#ld6(;;KqYfBZ(a)<+2xz8|dBipe z!2@1q0`_jsd)?`$XSMXwva-vmzx|)HqaRH^>m3m-8F{DvMMZQ-8fN4qeS2ih{#Jdx zm9T1kJ38zjb+){#CJ3ScBl4UR*!J^`{Sg8)CZ-PCp3yh^Oh6I!0s-?N>gZSd2F6kY z`l19pyN?3ndl;7)B`yxj;wLo$?aW2d;q&3olvz1Duq(wwUcZET0id@RrnoUeD$yulii4w?M=1r#Pw{MXUDg&Vu^7=f8Ba#gLY<@h4bArpmXTC)J zvj3uXr=9J(695t<5oO?3YevI6;u|;4ka1lz%L-+UjxcI7>)z`)J7+wP2*t^GguULN zR*RF%M?U%d2`Z1=kkHy-LW$C5E$TXMa#InmS7$4OqSNHQy3E_E>hW7W%vBU8y|_Aq z*uk%3<=^Qz(;hpp{EO>&$FKc7_yJtK0#g=feUr@JyrU_qtS&Bw3?yzaJ!QcKmC8>P z^?Ki8uX|AUonh_fD*tr5@k4Gm^V&^!HF!-?4OML`s7Y z@2ucYS6I=+%9O~+=9Z=H2#mqKdnaU9qlu}d zU^sWF)>hj$_)>Ayj0Kj*1mPQ+=>gZyu0%NqC;_DVx+UC&7p^=hk3ZsEEbG!>266|& z63-g8CY9j=t-C;>WCr_MR7Izs^Zm-Fr&iuHmw?+Yn!Dcsx|tk^ z@WQs*8bi&G_tXvI?W}5!gV>Lrd}P1M7x~|fA$McoGY(u~0hF^(rOvaNBC@YDSwDwa z1Lte*$Xr}|23&Qf{OiBY7xBn{oGK99gY(IsNB=e88d9+k0BJURew|x+T-~i5^k55j z0GkVV`efvxD^Dg;HxLdS5n^#)ZoiUT*G~}t2TniVZAqHT{2$5E7FN_AZVzQK?~mR8 zoT5N#+J~@0;n89BOX&R{phpO_E}7;0UW{DGe;s}Z5RJC{{RjWD(e7fHNx=DtlncDH zwIS`RkI!K*j3r>#kjkeKc8TC!Cc;HzfQSxUf2QghqeO#*4H~ciweA_*GQ$G#yjI{? z#gI<|bvMrk!&2-uoC}1D4cu7YTCI4aU#|-BNjt53F1${g1nJy(A&MM4GWl}f|Dt6W z6pX9K2pgU8Z`d(U()%`*KjzHf2&#ESp zsw)ic95v$xSeoR4;q3o^ zetbS=PBEhFU3$@JTLV70&Yu5 z0BgL=?~^paNObji16Ij^bCW8|o@aqVZefrzmDrXB%u?i{@84Aj{gsbZwB+8DoYfox zJjHxKKjgg=f7s``dzeY*HWB(jnx(5K!p3*H?b#w&UR4Ebt5(-tsdHTC44pTg5e=d# zsIzB#8=G64)cz_}QP&>}9Z9y7(lp_| zOuY2&GwUc*$F;8s}92kNsVxcM(&{!1vY5x=gH{%CaIJgAt)>bMBL`3i>b!08;%?5C9golrDZwT1F;6 zH9NMfru?bS-4|>g*HMGXhcHH4uwN@)bNuc)rC?6H3{k!B98e3_rKwb2vm7kV>;7OG z<(Q!G!)ykc$(m!v(AIMD1f1avFrDLMQoNWX8$b1zV(-)4s(6u6^IIIg;i&8M@rA!v zj^-NO|N1=AWc4kK0Fw{GyV1e7xELEikZ&96?rJniC|A)TUCVHmo@QI{Mm2!jK0gIT z$)R4o^{plY4BC;tS8oR0GF;_Z$lpXIya4X&no;J)Nsq}l$ymbAZeDi+SVwO&XZMhr zx{dU8zoA^1y$eIht-OsYAEMLB9kQVN&%26M_ zKil*=JQ>M~$X<5#F%}^*Pp+hQOKryM&z}8=(R{2$bG$fo1xW%RK{xO= zUu8atOMB1{Uv@S2>`E!@Nucc-Rc_DQAH6Uuo0&W`^B5SA&Z!>BJ{78bJA9{Y^D|Cz z{6PR=(CeNgQ$xqnOd3p5p30s)N-)@7Q!+sZWjBe2&Z{r$ zJi-etrq^FEvDwdR>fOC}y3@T*08X%D=9+5!Zc$uORZ(7^+1S6mZ@1dw)ZW4CdK>m= zrfH+nrJNudI|l2l!HKT)55f>?e|(*%0cSCgc`%oMU5Dm4Ugr|-+C>f2q+?|1TWBh=JX zc(5N(O)qb7bvo$j(B1JMn;$%1wTBa~ETi?qWyu0pP8mX&_PfV)gdh=Z<09j)JqRbIj;;?q?5HDV>` zO#xd?2`0L95!n!(6Gg4I>wDdxq4?s`%r*)Sj3h_=Wy}5N z7^p@{#Ii>b^l$yelYtjAw9;jQcPOh010Gi(zn(#b-HgR>>_5!E6E@hfKAbQZ$uHJp znE1+LK6HPo#;q!S+6E%oa&(3dlaI3)+r5bQ(&NBuZoSQzxM5&f`HHi!57!RHUcR|@ z2#TAxLmWE?1sD6Y{DQsd*MC*dSbQ)_BWVpCSldr=-N-dB;My&$9B5fBvoa#B(x^~* z>CAKY1{wa$V{HC73yYLFgkm^xmU&&n6G^YU)?lY`kLzuK4}E}5m^I!O z`Ga*f6kg5l+SU%5reP4`@d#)?6K|?iYaVEE#)tS$>hS(qq&gCk*jaDK_ zu=NRI2f2RZ^+BqKr7Dv4bKs1C9W$w?(hX1#B1Ci_WsLL!-CYY%US8is#)XjTPp1+b zmn_;{NPKW~q+S&Et^de;x14Ntl-luj=X%L&Wihi5f=&8vR0KUTxJ`jE zf%OciGSptXepUo7=@rB3^~euwdf6#%X<9r`#}!?*|0ATb6Ibw-VQx}CuN3lyds%j9 zPj?I{?ae4ysM+hVm7t^aiq=y7upgtLs-c3BA~%r92A{>%Ye*}}p;>YcS`|r!b}EZs z7Kdz$f+(ixP4xZ5cAonE)opI)!KN92XAIoYfQ+PjEO>fuTR|2}IU)ww*20zh_26g+ zGNLR`g6%EmH_`;ZNafs2=Yb5g%MuyaE*8FOMwa05?J^5U^6)R9r*Exo@`#(8lu9Uh z7)ZNb@-edC`$(jJnz28|fAEyS`+!^u`s8bz_l+rq*K!iI+&??+bVCJvzEsF0G#IXV&^li^DoKpu=x(V3f`d z6;4K$?q&|^R?*a;zg++-HAxL?w4~*f$jekzMy)W@G{OV^e0w{uHz^7tkMRc%;A|xt z6|`3RFbdZ8=Orqh{)_kwd0&fIJ?^?XDu|Y4QOp?43?>M*mW?yYyDm+W%GetS|7qhE z=a|ZwYm-acnypSZ2S?nh3uH$E6U)p(~#exPFmy zz(dPRk6+etD~X}T4G37zgUEjC7oM(AJ$*`6p573!ZUz}t9Ehaqw3Be0v{O40 zrCz^vAd`ChqwYP^V^sGi1}Y&Hrq_L}ZYM{CU=l7|M>0zZ`!d*1XD9<@EhE5=Owok) z(ow8?wcJ5Yk&iW@sL>R2qRwTnAa-Q@g^{uS^0g`II~nNP!bzsSN%?!mJBVs_knBia z8!STTaw8Z9=-h$26UaMFXt$R%i1YI3!bj2sjXD@YG0Iw{a-#F-bW+B@7|FkS9a_U$ z$wU`%_og-Th6s-CDDGZq3v@J_mL7t`$q;W$YlOxn-UPzsKKYhp%MMLMPzU7S?ELj_H(yl&fWD9PZ0xxyw|upWg>}xxoZR}im(vo z4!DIV;wTpSi1>9Lq<8ZHH~`+Bd5J%LtkXs5<^)M=CAdm47j*Z^BKjg7z>KnS1k|v| z$NyUn2Nc2Nr1hK1MP{8SaU{S4TM72OPWX|)N>s87L1mi6pG;Dv{S2u;6iQ*2@ zKi=rYo{Y`E*#l@}GoE|yo>+~O-+#$IqUHPvV2#=4<~+Ow?3G^pm&+rhAi4v>yP1mi zS6D#U+4*hjsP4SGsET`v$g%M^O8zTxS_r>(>c!6vddS@7#lLy_rNZLH$p5=z;aiX` z3rk!xxoU7bu%>P~3E<%QH^t^h)ZuJ%GGEH$&c6$4kp4I#Sj*|dHy2~?s@oodDx{XB zx1Grp|B5cIxmyBO**}!c46)D|VqR9DfW27?Ttw>W+|}!397jeV7*QJF<7Hwl?kjKt z(Pu!xpgaEPnB3&YU(5pW@ipXLaP3rzSLOe=*9R)iTtW)A>dph|V!@ABukRMn&)|P1 zu)S*X$GW*Y-OR}P0R7R85Q(h$Td0Rf*DLNwsw7I{(N$d~As4qSLR9jE&_f?HDkGJk zoewTVO8_QytUDrn&+U9@kfJ01xqjZlB5=zVFIrH+@%O8@$oTV)5F=)DE8_svN)p8S zp*qo-v$a1sr*F#hl`pxk-Z+vsIpdQSwh(SAFTXEz1*o0brH$+F*Hi!l-tKL zHFR|J^nlRUU$H(;Dj1I>G0x%jG4~v~-;buSO0eg&C-b^il=zOomGr1?4FC-76HyCQ zB707V(;zgKa5EOGP}etb@+-d?Zm*#8#N}3|vP$9?NPKJjiH^@PgJV&aKNU&0Uhwc| zL+e?H+qsW$-O!zG46u0ugEs(J_@2a-sHy>b=PEWfMVePwR?ZqO)p4_J5ugl3A#XRe ziiFIQA7##mGa*wukavIvoCJrEs{tg_i#s~>Kth5Y7WxTG3ZUHJy+hVi5K zc7{k7&K}_FkZNrT@x6(#EqJ%ou1OLg^H=*T3UFl==s;yKgOb}?CcILoFN_kC3dPfd z8K}u^fL+nqon0=J#UPA}@$HTe*2?G}cVfBHTPEq>ZA=;pq91m`3^I)5Ml77e-e-sc zvbir-ynz8nvpIaLEUGPO=C2~j5%IT!!HK4|K(neO6G-&BMoXvY(f+8DlKYJLGa!hb z+~<-?Dr0UAb#3Xgay-6t3y%^3BioT^@8n=u!*P>uv(>bMce^cuwQHL76&@~bsKjV8 zGzuDj^V4lZkT;oBuB__e6lV=~FuU{n1gl9oVT1k$#%Qb0=2{(qiGYw7<-WT@r`W+q zcc4sV8ae7$VQ(1}OER%s6i>;EaVOfrU|Sp#e3m_w{}!eW4p{zV##OcP&|>g?)lX>8 zFJ9ZXgTMT=W>hVO$G#jX2M2HwIz1plXG9@W90mj431f-{EWHQ}T<(W*L}o7zFD z!3KAwihW}BG=xo=ib2F8>`f$K;w`^__7^Yxq)zYcZfW`{prgORYSh6YVPuQs$3U`| zM-%cdI`o_DgEsqP)_BmP58CPvN&6`KHXyc~f*Ce`)mSv0TBC-HcC@8JByYNJW0`ne zs-&6zbkgNUeAMsp;H>Mzu zt!*S^#Qb)e!edFJ4%~?LogzECG2)Yk@H)@<_=K+RyU9C&cgDofokyKL_${ZMHJOfe z4#sQL0^Z9utt(jX?TvCh;wDAHWJZz&HB6tYWy8gLa_Ch9IY%SpbDjyLjEQpn&{-8r z&otH*MM93>s##6EXFG*L&L5|!aCAM??Pt*BU{diY;aLX&IHi`}{|F^8J~(;~(R+KW z+gl6&Df#0}HRXy_vIoDn&;d|hq4S1O`g9~S zDrJeRR;^uCt=u^e8+)(HL$jj6#!bJvIj3Np^#5Y+E90tsf<^&B2|*fZq#Hz}OQrKj zN(hny(%m5qg3{echcrkSbayvMmo$=h58>bU{cykD`{n%LInUXhotd59*-_J)^_gn? z$wLyx(lWlr4yH#A$_*Ls%At+j= zw%ymU*)sJ_DSr`q0cfy89|801^x$38vp)AS8$yzv_DWo&S=7sMYcIu^nUU}7!0>46 z_7_Gb8A5LhEHj-lb0ZCwJ?IgR6u;6YKq&5muEhQK7y}RGQtIn9LTWek)kXF&E|gow z1C|8}3QdF$M0+!9aA^cS-A8V^=x#N6tNzSJ6F9H;n43|51>mW)0{FF4WhX4TAFs=K z+7^jC;)0X6O6=t?`eIXA*O^lg{AJiKXdFe#=Yag&cC#`#EK(~{eY^e#<8R@>j;Mu! zk8BDBnmLfbY;fbxUU!gWhBpF}LQ6Gn6CWa$Zea2&IK3OOI}d!3`Rq^8k34ns7q(W! zj=M77TUfZ~#Nv%v&pht`z~mL_e=x!M?)4VZ_J~PFo11-NkR~PEwh2FCSUj>0#1Zoz z{TCA3sXw1;g)xqa3w|BsQ|VhLvT)UkyC>%0dg`3g>?|e(VIOHQ@Qn2zKYS1dFR8mX zooh+47PrR{tH+3?>vLr+El>%)Lys{4o70G-j_!BeXsuVnR4Js0dh)xepx#mKT8Zl$ zi=CCWw99XUWdbrXo?ry1s9(?ZRvVfCc;#k73`MDrpGV`m$c zo+Wh?JBCe{6}z37aHp3HbjEZK?RzMK6m1aW*!oL%8|_DOqW#(Twy{?2=V<#ij;2J@ zmGex^3fIcBN8Z&lmd3iRG!q3Ht&&KYjb*YL<) zHR5TNv=0UXe)dNx@FzK@4O&&#f(w^+#dEatAINk1cawrPR+7&?O*m~=2KC?Z44Z%P z=b464(E^J1VP{gys_|03k;_nN=|Ts#wY8VZ$Vun(U-%{62LfGR)y^+VV5{Cz{LUcbq}`8kL@qgnOe6e0 zuZ*b>)f1t}?{}toT@Y0xrm?M2W{&S&S4zW_)cH%oREdE~X|Ht^#BQO%TXmKvv7kTv z<`mjim_74)Sxpb6(|Ul_YXXmeytco^wN4;}vTq<95Q-_TNc$uAJ!#p|gx(LvZWD=2 z#e8ui&AcZOV{TIrNBf)z(uS`nm1=4BI7X_vUv`|&?j5*|rE-P{?WL8<26gwX1Ynof z{?3z9t5@tVC1|X8TZ7jgp0X}LanWZ|poFgp6r!nd?GKtixR)G`5IX88>h~df7?DygWd!lbDNIA*z zP^g5fo7H9qQ{%$#CK5Db6Lx)k*U6;TIBFA8k!1PE*@~$x+>ewk2%FfxVl+3?z>g29 zx#7b{Q;w-2`GR^|ek)-r=Ig2f6XKe9$OrYLWul;Ir!;cO3SBc>X^nUcCEG1zH0b8v5Z5n<~JUS6#1>dJ#jsa%UUd zq*`6M_eU;uF9+G@v)?2VLC`&h+)X)>FPjKIj-9IiAkZ9sn7XTl&~JrO&99FW3g6!F zQR2I>vYgGhqXK`~>I~tGll-z+Bu|sjmoJzT&u540;tOBp>v}!5tXQy-fq6VkBWRr> zu`;4}8&-r`y=@^AwG|`+P7EiDZb>79Op78Cp`sMC0}%AOs#ltY0=U0c8cw@J)M*(P zV|6Nv7|6|BH{`Vp&hH{`RV%7>>i%TIJDLz3o|*gaOWB$vs2}*5ak@F~R3BQ=%FR^YPjDI%{$+rO`&z7f8bK@7qeA1J3O0PI7DL~lD#v$|$62=SDiVOU0@bR(XnNGu|>+g|3`8zW?@<{2g* zwe1QF_-Pi$~Tp&g3AsHTugx zv$Q2tk+RJ@@HE`)%84U<;7-?+RPnS@sr=0oo(g3zTHX+$?5=s)-0m+DUYqt$%P8DA zKU8Xqp2>1iK90^8d3XOOn(qGtfclt#7<4ouczQmanmK6Sl))ky}H#UPaE-P5jMsWkZ25%}6bP z!EDzgGE>1|m+o7h!VBr=vD8;?*moPu82h3=nmvI#D}wN3Z;+}87ZlpC)V=-|-lx+5 zZ;oGqkpt<=J6#WR)Hix2HXyMN+42OrZKV_qMc$4Yw zBnLh#V+g$~`2U1#R?v0S4e5RmjjKgEExbV-Od`n1QbSw(b03yL+XY5lr4rAU89Ty3 zeaJ`NWhMXH^9A26;GKpsn`WjT$Wvm?TYy|mY%+-ulx`lw`4SwK66kR8EW zuu{MoT|(rq)1Y^u#k`1wk+<=H7+p9U(E73!jP}2;4g&lE$_-XO;(flg8?K$y4d{^! z-5~vI3PSx>fZ`NEfXWMpm)E^{cAvqpTs!qQwFj#>e_;gOVh+eyCBW+v{aOF><|i`A zH^T=KWkpwAV6G;+qV0_wnk9zc1uaBwA%`~i0OxFEux~2iJ?D_#Km!oqk}tq7>#YO- zoyTBJhF`I*hemez1^)LvYd~mk^)=tH0b zMi^IN4l>qlc<45T@uUQ6p=A5@Z#MqT38HjO3ouqmpIz0J+=fEFZ$SCI`&GA&+{)j^ zC;(;`Xl&xb;TvdMsC7C%V(=|_ADrI@MIg7hzv-s(VK}P@oI05~TjE?lI5F(fxjm`l z2@j_S0Pq5))BSEUdgBYw>pP4qH1Bdw@a!JA@h?UV^uuaGr~^d-3KIxKx1pvKPEXB~ zj7kK_U(w$|t6{tCx}$nT?V~Rhe=ntXh`BVS{oniSxLL5E|IqYYbR7 zfonD(@P6v-(*AO5rVg}o)eb;nNoAL&96R!xDOYmUo2HVn7a|Gi`odfOLdp7Ev(AZD z3yx}UuH#*cA2DR@24i49gAP$G7ZWoVhY#F-dl?>e^KRF!%yAtBbI`GzKHBGsPfV@= zmjH19mkm-yYwZ5%aTkbt zl5~Dm&7f^)Di4j+xE6G&@+Gkw-<-Qhm~XW>4&&L9t8JrH6bC_YpPFAHaYdLMGd70OK_2vo~Rz|08j*cAq;_ztN{yD^b(Pc&)Hv3pEqXefS>OB=X z9g?a-b@sEdJ<{_$xn1>$@b?;*6mAN`1pRirv`iEnpBW8M?9E)G&rUt0c_)m2%4zf3 zwgux>l2en^Y#%NfXT-VeQKhJ8$&q8_@V6G$mOn^k1_$ipy3O+aQ-}^655DB-^G>|r z4Qz_+?UWTx%uOwUk2k@A_6%`DHI>(vAaKS1+xndq4(tyMq0Vt{TshEAmvl@yj8by> zj*s9@fZWE+x0&I%i-NS%-#m$}vQmb`v=N5KlcTj$AB`7AWNVGfa}g^R*~&oX=H1(L zolhdDvARbJ1td8pCQOlVs`DlBGNxjv?bG8?unip5mx%X$C!{KmJVNY16Kw zdB$MTmS=Ko59>pMcV<^%dY`oP*RNHjBIUYBLlwoh9ZESxGb#$9gLGZLjZ#}fA_d7Y zYK`rg47qHBrjXHmsI>QM%3J=P96bT%`>Nltcl&r#_!mow2={}ciy_c&6MG3z%)zQM z(OXtVCo2bHa!drDhO{QkEJ^C!LCSMqeifJS>j;^%?h- zPG4kxN!|4PA}r=EE|+~9Z5O%^GC%htYW2_iS*1d!ct(7azpo`{PW&^1i5hQx z?9(zr;)jNQ)VEgY2|z=hPz!;A!>eke%r_f?r(-=A>F)a<$B80^i;vRIfF3$o;{1ls z&l_OQ8&Hwlb&>SElOZ!F^EusVWt06&n#bi0`D6qksx(zja#?&vMEvtA1-<8@DR$(ujy<%H2i0PXIvF9vD)_u*QIjOmV0pk~6 z!_pohVKdMy#H|HBDTH&pan5QnT5AMX!fQW%I@l(?1kEyHdt92g{3hO>Pb>nRHw|#YSG9#MO zl++Ff+CDtQAJ);=xVKtM?8yo0&`_cJt3gc4y=_T`p1E&4i>?;!+Lo|Ok zGFw}%@CuxqR@FXq)EJbV%sY6`e%Za9NUW7P+EE8Yj890*Q6{6o$;6+5+Kl`?jVD>( z%sAGAomdhpDGZ;!e&P6o?LC_Ab(=vl)~7%fD?CxOQpEhc_nc*Mf<34*aWv_m+;kf2 zo3`@HPE-<0JlTU1{K?OscFAe%6BWN^SJs(oxnGA=BpkSu+jTr`m%~PEQNO?5j4*rp z=u1M=Huf}$YyKa8Mz5MrX^(n3P@{gFa)-q|ygHc+e1q$18$ZJ*htFBwnHSb?HriEN zPbkv7`#hVf`ntY=V(YHqj3JrayqV7tN}2g&7e=2LVkO?Htp;rYf)*S8B_Go}GX2Lr z44a&AUF#LzgW!5U!KI!bJf3%AHVOzaQMCOxZM5;z(iK5?-bw~$8Q5BSK;r0eIPzoF z1nvgJo>YWC>k}IaFoEZcwpV=-FoFfDEqI+tdyJ9IoFq*0UaC*!x8*#}B*WBVsdSN( zUU}xhfXBHC-_sd*kJiaf92AOdHZmE?;6&L>W!zRoL_zyk83Z(8AAB~&Sqzh6{*!gN zpDY`C=~d-ahH+^;e&RlQI`K-Z{`AXU{5r#=J)#Z- z7C7*khJDI?gFk+*uhqv)IlGNcR0+d;m8U`|W#wbU=t$DEcnAxRE(GIAjf|eGXgk=X zgw6k2Q;zpfG3jY>?jfa0%_4nm;$W91!Kg5e`pkAE@AFmJ=odX&tyFGZI^PpLd5r99 zw``IQ`8|2n7*xjDwAN{*HexWlYfS9kY#jiQ^?{u$o%teG=M)o6E$U`8Xd1 zetT%cQ^D4k(e|7}0)}Y3tIQZQ6c%(T@ji5j?SIub?8D->Fh?9qyKRldjHX!08!qnf z3NxzKl}?OD%@YO=k<8<}54^t|GrVhvv9SMc{ZU;}(u|!|_K0zWAbi?DE-O7^(*)fF0=bjnpKvhVl$`WL@K)`{<0H)F9SGtRvq zw0TDmLnx&XZXX2}z5;+%!9{;G=LN3oshK(7qGwl6U}`_GdvKxa>daWW>9EH2lUj<& zefb#%L)qzqCSdfPY(V6SQKsOCM4&&Q4F>NT`M&qP9uT~DfR!SK7#%2&DW)PI19!$isSG|4Vdt?tzu&p~ zfhP}2FDHN_D?^7^<7+`H8B$XDEeWd>;^<+Rn zPu6gR$tHn?k9#DU%aaPg~?{{Zv&9*f{F*L`1l2TB7H*!~+H^S~q%czM6}=0Bm=2rGa% zicsRnH;Cv4p(7g9MU6U@rug@Reh@cEH7xv&?c*&}*n>|+|+OdymdMeLLJq;xi+ZlyJ zLM+dV0XPmftFeFu3qc{{EJeo0wYeMavu%E|eH!#Ei{gDmS7E39R^7cMz7;|DSmM5X zO-4O}w_<6ti`GMM+dueKJ{KGX2|9MVzB?e9&piyWyCN6aCk4PsG}vuuSg(S4u<&sm zrdF-0l_#vYiP!vfACI1@xV=;lfobxk=?;NeJS;cyvmW~`ti{znAl29Rp7i1u{)i|t z$7e1m#|^@C+oxLHYFU5$-|phr_DRcY~82b zvlj%(BffrQKfh+|lzPB=2gDP3hxt=-NV1ASW?L)qwQPm<+3bh^t}ozui(1S&1k+>!yJ1IU2+K(-)$X{x%dPmnMrL&NlOs^8J9=EUT^C~3WZ zt{Qq2<@8oeU1Oi(555Ra$^jZwQi3A$WAsk=;)O_L4_2!=Lj+e_<sLKt438B~{Q zrk#E8HQk&Rrj`2`OIt*k8po&=CiBHrdh?Si5u@pRSI7(X&E-3AL)a-pS6J}@xW*Qh zc=iXr)8!yx@7cysR3o`2^*;JszQF?Nn#FAB^o6F0x7BZX&3IAop*HIK zJbmS{n9T38Vai$ z_V{AGt)<@Y)s_|Y(2hwiV(V~6 zjzpbm-^gZ<(n|vzm}()96GqMEnx${TD!f=m2QLckhn0?giafKb6Qq8Q@gtyq154FP zX5TV9j;s*gXGCh_6XhN31*W)|hlPe*bRm0x)j|o_izRy9Uy{ka#&qk}e*cyj-jCo4 z<0lMZn%9^0*(|enj@5rBAM_`@E?qaq;YY}~S6mH?E|d1JT{~@0b+J^r0>ZcB?id)Osa^8Wer3EOI&Wb+~Y>}Xb8R8yLWQd7ho90PdFX; za6jjZZUYt#Q|O=YbLvo9lhZ!e2>-ARM^_iu#~2L4&+n;!DBy78F#D*r_trUoAy5OO zeJwVSux7wgl4Zi_%QkWhoDGw2=L8Y0_(j}Pr~r)n5Dxc&9*m@nLT(f0rVSJM zANOP;*}`6lWKAT$>Y{!=cH|Q*(NmDyg=mt-T0_CZAnqLW=y9KvUR47BqPbG@J)qaq zVN9O`LCFkN-p@9Cl|So*|M+Q7RKzQDE+4_qYGBv46y|#&b$*zuv6Szy$LZ=S)@PSi z5V$Mr8DN0?e#rP~d~oA1mbz4nMjv)dZRLOnkvsWv+L34;8CPb4a8gCJZx~xLb=

99%_OXMBP_FW1)+pcEw5)+ud6Rd=W2^g)DC42sk)?AZPECy5o(-Ye zk~Z2i#E$mFY^7q2O`#SDg&%(PEjA0!gneAma7{Ob!{(<>tq{oe3;Ipz6+d+&dp|J? zxrA-~oDN6mjH}jE(ct7Z`6(eeWasPqfxk0Yy{&rqB!4tCtMkN#8^0j~yUsoOHJ0kW z9zW^P>89NT&cwxsmJEn?yM{O2l1{tc%w%X?q__P?Q{~yf#p39s46_Z$p;&ss)_nh@ zwu6qYi0f%INs-x_Uh>8~cNqGcd)ER66$97+twLH~up08O`=szc32U9z-xnkZ+|Fj3&Pz7VcXLY;IUVTb&>u zlxXyBg>*E?FOe`|hk35A!ee&)n#MYkN%9g<%R}Rt2Qa!)6v2-8Ob{~8-kcDDMp}Wg z7KRGZ5Rk}EtUWje-xg1Zq!cJ6RW&K_#v5GTc03@kivf^i9ZUX*y z_`E(7oSrOQbc~c*7bZMG2MZR=`qJE2kxJMzaLZfqS}T&^_pMjEk{Q2k^N zG`Yq_6q?cUO$KVG$%Nl=607*`Av3ZO1P#I+oqsfw{dnhpxt5hglfqdxPp?Z89q4-p zSaqT*bkDDve71rw{k7^E!w_@eG{3JUZfX}Wzp0{%i?!f`5y+ww@FnSYaN_5AIi9af zhvH;v{p+@OgGTJ+jt7k8s8MJv84|gV*Zx?)B%PD+ZzjAkb4F=|TuS8p7g|tSZL@jC zCKh6O?0Zz}`In>Hp7hvPVop_u8p*kjD>(D(zGnG0f$?@j*8b$zGpC*Sf%9i#1}oBG zSx0>d7dmX{5Vjnr_W35qx&_qa1U~zgVO^H6(VhvxMP!{5U$!aSq5C^&YUFWYxEOH{ zg>fT@FkB%`;cZ@QC~`NT2$9JE%SFb=RUf-|k65q6E@68~lCpzqg-&jIbN3s4dRFGS z*hr~-4JQj*3q;N`nzwE%N}8JP<8SFW+%XNRxA{5)6&Xv{8!Q+ z&*-~9WGWfMuh6`6I zOcMnJYD)*AKJ2=3kgl~`N;6z!pqw!unhol$MGF0b$nV&D1`Zw_0(Wc8!oX1h0YmqL ztQQ`-6i+9VUf!!eCIOdM=ZOF3(m*(1#}#!5#N3T{ng;#ku%OH1tgwn1H1l4>_WG@2=H9!Hx$*xVE=IvEP%7x*5-|U z<*8Yi!M2M*hcE;jAff9U7xLGAm4H1YgRlW~g`pyLJ^N=3Kj6v(5A&5XO@S zU}jJod-V<+9(oG$Eox`szKB!h6mo+xmGx!O_j zQUAqP1^7J(WzvJ-!x=#M4P@v3C%k5QgBTgXjns(kREB~s_zKsR2;MNQ6;;|q?yze}?T|-I~ z0IHm5_?=yQ-O=~(gVP=@gBemP9n{$7u~1rvKN`LiAxE=GdHogJ_WD0GkKEK<3nx+j z!Rsgk5PH%6@b{2^Awo<*2M0umnU=X9O~?RA&&c|Li?oB)tp6t>&%21d*TIW%D0K~J zI|eX-zhnI2@P)EURLr`*M*~b}=)13}Nw(dhZ8!@-L&v~r`0>W`qV%WWDR7fQW zu6Pytp`i>|x@1}=r|T|lkr|ftFPW7&{;Cm| z)riGvMEOJO!O8(A6bN_o#vZlFbdyCDP_4%n%;UuRmdi)KklhSq7CiV=$TnU&O{@Bu zdDgf{@m6;sVv_;3f*}{7L@?Vg5B+tb@z)uNrRC8clj`WaDMgnY zubg6+91cI!DNHWQu?3IJ~7a;vFIRCk!8_skuSDS4ARGh0Fe*3`&sTh2wrd zg7XRSmu_4Z=O>Tvrum5-`qZkt5fgY91A;Fh?`a6?0~SI`32YUu^&)e1clC|(6eS#P zw!Y^ALaQnd*rNTY5;6pOJ>9xN4zUW>yqi;+24iZC9U9LqZ0?8mG-xp<%vlMT)f9Hm zR-EpAMtgbIRvI~-qXj$^*LIdC`xDe&3;v9{@nTsY>c=%??deCj>|Q(f1}~}K=fDW0 z@}K#ZiOMI}Eccj1%+EZ&RXWSIb`GoWX^UB5ZkSILF~`j&$W8_uEV#K$<8|@dW%cL> zovRh7atUR^OPKGmsM|-1w$j}mvc(Wp*t}(U{)+!eUt75F-O!#*!M>Nl4y3N$)lsY3 z&tlAX$nX0~pBD#F@|>*+IDrd^XhVOc@hn)2>rq?n+%PmO{2B$|f#hOFb-9g^6yfgg zU90w#yR2EiLlNgkfB$mhMS3Ikk>s)Is79JUNyN5k&Eo0rYR>4YGb=d+qP~Mx>6hxT zfm_LBtieIQxiWDrdzDRCSY=3_5KqTxtkWFa2;A=?z?ozIIoT=Mxe+F_ky=D#Qq->B z-Oriz`vfg(Q~30}Lgi#Ubh=D?q)V5Y+8;NJA{r6W>7*C>!I#VmFB(lw(OPD|q`FGi zIKZ1m)9?1o@I)cHh(CiU$G`8(l9ut???0v?Nb;AQyx>bf z-R?kW<0%-G)F#LHE1t-dQr`0h$kB5d4jGjQz}oNQS8<P@4w=L z9tbb_vD7@_hOPqnwc6>)s&d=ILY~x~equ-DqMn(B=vRvLEp)&9sx?ZhR~c1vjSTmN zLNsKLhp6n$(o|)(2SsqE>R9=TqgAj!s(xj#JD^kxLsnQKmtI{XqpDz3WvAP|cAfyP za<9VszjFJ`p4138lPonClgHTlCddEae&m|3+I*WM`-6k#RvqVi)5Ed_5hqMW9H z%1k__d2KhnHT6%dmc9ZEetVm8?kzIw3Ek4hn9hnRX@N%;Wia^Hlh6hLa!A}wEA09L z+n$#thgb5^Xf7a}A++;##N|qxv4w3HW72j;oVCpvS~&eBk2weemg#m zHuuTlBBF~#V6dv4$amw188ti2v;sa(+-pK3xz!l)bBp76`%~1L0*9oX)iG4S%DXw0;2V+|8-o1+4a>0nC|6 z?m_4Cp$wtoD!mOj#lC9gDqZX(j$%IhrgIDn=%lst+V!f92(%JYiFR}%+3`Jvq|5|paz_K%1`94xS@vmjK3yi2p(&s!-vm!yugWwwID(FV>Ny)i; zJE}MqxQYwW1Oz5cEPun^K85OrLRyHSi&c{w zy5aVr4plZ-ri9Pkpv=GKK4OHF$1paCi^y})A^i6gKpP4WCH8aZF`?@}PSb2Vc&b7I zlPd<}X@J-(bwit0DiBx+3J|^l7@`b2?gIl?4$PRGA&Y+eTmAun2Vzw{mjFWuWl8?? z6kQz9N|DpW`!*tCVDP#aa@5$)?(u&IuMxVTw6+HDt z<(m4}n{0%`3zn1Ifb?gcue+ZMo>yLOb}a6SJo@N<(c^x3Pw@DeM2%$We|(E>K{OvO ze~HU?UT}GGRKGj4+=1uAcOm$V|8o2C)LnB8ZJ-JZzV&YwZBPhMa?tBo@N)H1!{qd0 zKKab8G9_d71 zu5r{y_x#7CUBJIHTB_2@ANi4=1&5`Yx@_w=uxew(x#PyOVaG2=QoEthB+Xwatf74V zWt@Oh)Nkh#!PVCC90v+_(9Te*w|FRfBsQCYTGRfkM$htsTg{Z+CiQgX>B5eSz;;cv zsp;?CoZ1-cG0B`wGT7!7GG{;PP>OITTpO3^p zXB#r!ZY79}=aaIy<6rl)vFYITY{=cXrY$5)$R9cU$NIlOT%pZVILr&-{n&s{`=F~$ zXPvrdl5+~ltgn3h;$nsc8ch(R0(F=m;ramEeypw;ux4Rp_m5gtBA zi*0{Zn#v+!C99mGMXQ3!#WDsv?hrx8gq>gAyRKs+=NHG9{ z=_z5aybTQ`tEGiwamkabAzI3{x{&Ut=|>siIgm@Vd#YEAZuvuA_GhIkQ6-ZO2JwiV z-_y*q_il{1MPCOTzipaD<8_kc4Y-s_d+^f}a3!tZHE6mwu}HK_mz6rM>>!fsWPF%2Xa^kw=gv)wyI=*;Hk;my?-oIDpa zc_?>&u|BwMweKs}zf?WS8`IzOO{BO`qV1dXZ1`^kxCYPJ*Vi~Sim>! zQ#S(-ouA<=_sIwFET`zst->eV(~6{-H1(#~l=Hbh-=^Qs!46pC%v|LMk|wA{?tE~f z|AC6L`96_T9*y(QxPmeocYjSoM3mCEe~u>R3Reh$TYnaVVb}JeiC;mg9T~ELd~Zs; zK}Jjd)Cjq97M}L5H|fpxwg8chwp1M@nadPwEk3ukZg;02XtiHuYVaAf?!13fuGVEh zQGC#75N+Ka?HJykaLJp+uCFk@Wp5N6v{7IdGup)Nn~V%4em8d6@*{AkOJkbClBvahx?4W z6#MA!QGfjY$k!;E&%^;U5#N0MU~6);lGja>oNV$Xzu%Qe2M(MZ0SNTU?>)LKy7XhY z)Djp$AqA5BGMc4N+j`)W_3>+gywECnohZM*$%fdRk(LU#<(adOOziFgEG6sWZo7Of7CEXIsWwjON(LV=^F`A~NA6I|>1~R5 z=7(gud$k&8yiI=VLu2ILS6TWP?5YNq%T{BNaX05Z#ii&k{ue#UM%;1}_9?00g2n{? zNQFa%E)x&7wqs;bhBD%bn3BYF@qy+Qc6=)!!ZF~$1up-k(UcYsm+kufLC#4HDst5j z>=g2>57Y{}-|V!v#{{9yYq(+c!q3CkkHm5%eMQq&Xm&rr!hr8m*2c!p2W1TbvSBm9 zI@^kvSqnT;tSGwPzfII4s^}n`KS9f0@@e{mF^zZ&6D&^C2%kgYORYScKU!u5+8bH) zbK)-sOfUZ|EZ5W0xUL0&qOlrdB3!Si`#kBcvB8b3ZMB+2lMw~*R^eL&6n#QBCjOwX zhZ!Z|guR4x|dC+q$?v#=p-4g}-e;wZ+*&*K8S?}NG4GI2%w9VMmD&Jx}A?IT+M34dO*2ALk4n|)dILVe~eRVu- zQC*6oiW-4@@(x7_tN@#TPlQ2X$yg7E>gY5aHLXcekhDjy3Z3Ip=!JEvSW)C~u*-Tt zzV)8T$7O2a&_%IRw$Kg&2OZk5S?zeVM^jHl;}3tMT~QvyJb zQkQ_{H?c)+3C5bFC)XNRl8Mo7tvYeX9=T-1-S=c+YBnII7TAEx(b1c^ub)JN;PcrsC|Eg>&t$M z@SIwR1Sy8j>kEXu)_dt=8pjZ_Z7AZ*82GBFG(I!;0}kCho02i6&}Ui4$3xj)`!&gT z!gCpOUwj_GdfjKJw zVE<$7j<4a2ef{1PFeRNy$*CT|hv0sBhyDvmE~L==1CXvl_y~r;=8b^X2SOwnZeY*T;skQ{Lm@y zw^YMC{F@2E!_8K7vC@uLQ*7}*R=ZD;_%{R>2XZ0(5uusMh#MHQtbdI-IDlKs`*1Q> z?`2oQ)LlugRwm$t#0Pr+XOQY+rSO*n&nai>Q~#rzl|z4X6-!D>O{e?sRYZ0T0P5T~ z7#mX0OvK*X3ekjBgSx!fAlolbMlJGp2_W>JA#|sMT)=2HWkCO* zsU$(Io_xP&j&A8cjtvZ)GY}SsFqY72((LyzrZ{F@ zhWe%k*{ig-X#Io@y7*85bkU7@^b-BE1_DM%-f_l{1@Vzvp9KoG7r+d$Xs7@gDCNri zOEG2;IJbh;yLs>?8m8q+6+Z_Q`}CgkKYZI_r3gksNi+GW@6A7R8AHQ-si~iH{(BX1 z5K5Y*JJLrWfRGH6bK|b1U;}J@et4JQ8e2lH2rKwtDHa|8Td=Pv`Gwv*HEt{5L_up6 z{x1#W`2yZJCh9oD*Gn?`W*jI+v!Qt#k$Z(9U4>T3?}tnV*DcGl+jYe!Zq@JYTrVv> zXBP*61H>?m5~uYJmdEefNrFak>DeIcSYR+HF4{rR6=-b;SoU*ny8l5rS@h9BIayl2 ze8dED^p!t^R!uDD8waALN;a!3r6jN3m9^*7#2hFt35StsIx)O-d6i8^sY@NeO;GXE zZA*Hv?ltf;)X20d)Kk?{CTKn$mZ+n1`25AJ&>di}6L76ity_^j|0w(R3%`5Am3x3m zRYr=&KlZyRDDo_H_r9h;^t1PzE~6nts0QhpX*ObbGi$-heGh5F3R)}K{6o+8D6kY8 zPeE$JG;|1pd&?t`dtgO8A9R{dElwqEzOSP}lMv<|Mk*UtMDDv>XBXH<(|3qd_)zV0 zKn2=?^y`M-B$L*g%wocKi7}4+do=A8PMoR}&}vFp-5;-*Xf2~lJa7a-FykHhdvepg zhi~dg;%SYZ_T#DW^}$6d*LyQ@Ww7-F=dJ=q>|!ta5ZQ0SeK4|xqUM*_o<`lPR{Or+lrj9ukAemg1Lr3S8L(Qj)+czC^s944a6uCz&AV+Zy^Ob zeBO{T2Vp<~O+{2vImWx7SgLKgqyloWeuL(F#>znplXXZe*}_&am0Mk}_qI#~f9A1Y z==FxK`xd;PHHmy(`NsGv;|t|ZWN7LfCX`$j>ywm8xmsfP8`cCH6uCGIvq! z=xXTk@G7KCP@!HwT}An5=l+31`X=L_E`C*mBng|fHfjZ%lXe61v#IVN#+^nn7rRB5 zvja6Bx)Zx1pW2wPdh{`j#c+h1JrsgNrnL(8l_V!+urY+oQn+Y#$h>l*aMX?IGLRyF=@D*b~^Ss#1M4Q#p+saUdI^> z4H-rwCr0W`$`P3{ONBchIdUDcheK>U(i*VLk1d`&(WK$jmLAv9;_+OFA#9Le&dz9l z%HhQ{Ta|3)+}W<((ieKIB!Rue0@(5LaiP$I@E;y^U&6*6o*?P(*cgO;X71O&6Cu&8 z!a80gHWp$kJtixuq5CAGLSmDzLkUlbjb#Kc1>r`>SzrJJ2C;HhhfR>VDp1D{*^4po zitr;Ur)$2QcQDTMmBe*_{LK6EY{%O1oa)*vJqT6=XBj@3F<1zrK2i1QTt`hdsb>=z z)@`=~2PHVw$N0X=)JONxI&;P%#@a-^;ZSeuf3I4^iP;42d6tpnNh{@U`Ab=kl4nXD zYgvhWFU&ow?K?D?lM)D5h7U;K5A=gDtAl#2hlWyRcm;n_+mpktwHm9RRa}C2P|0HP zb%5r9U0HKy*vPtzEyaveNn#d%QapMS-lDzm+}a~!h{A5&mJRnzh^+9%7a4M4{87F% znR-qQ1CI7dYg~g>Y0aRt!3HhqyU&G&7`22qgM{@cS>W3e>-{Y#KeWfXXGwOW+zK9a zyzJSx^Wn&7Y6WpbuU%DaI~86wa0w&|69?7C)Kn6^T_+c&^mJr+9#O8z$za7TI`}w& zIeO2M_wlBPL8JnjGOoi-#2fPdc*fhnSo^o$f*#m1@~d<2%oY|4E>b^#xs3(Ll^i+##EK081-u)$ z;MC0(15p7BjIK?n_k$Pw#`AA|HK}Oy9*x(mr6K9zgf27--Jo7o;u>h4L!|);()DlG zB)G>V8UE9NXy{zD0^BJYVdS9Pq?*Uv{L3dF>m6bG|MG9fAjB)5Hj8Gx`#xyN`ER&8 zLc)l54zfX;F+3S)4 zRrH65*JsscbpQhJ(#>9pEU9^Xt@v`@zkVQ^K4xNja^P#)|K`wv`~{Xd*XzO|4m0zt z+1unxgsjKiN9X|V0MFk$8*ug8EV$uqDFem_qD?+@AOy|B3`RI2{3rf>v1Wy=d-6pfnVMJn8;-wA=Fs7Kl|lQ)XTLD-YEuIJj|JY)0%<6RER z{mf!AWm$&LWPJs1GV6J%;uJQ@A6S=_@4ZtpAs--d?=RjQOYBh&yRddYMQtdQG#S9$ zl#59EK`~)~+$NzXUl};`X>&HH6!AgrxAd?_xyL z>dH3PPaw|XWJS-~N_@o~!n~4V)h{J@IqkApX*oULM4v8UfB*}U0>ly+ouYN#A#+9t zq6~%qhr7Rw%Bl_90AWN>N~L*3Ktj5^L!`SyN|EmF6qOQ?5@|%b8!16TxEMav;A&Cj149yPlZh|74^JHFeve!KsBIbC&*sZDUPXxnK(yx=R4AIB$?15C zx{NV{ADwj3cu2}5ytjX#;oq+O$a3H0%JZZGjJ1}APIg4A%`8-^eu~kpr`X2bd$tpf z-OQC!599CCYG%$+81A=r`~9>7VC+weZ)N!+Yt68_HA9cMC$P4-L{Xs^sx(ss3dHlq4#+oQ zWfO`gSX53md%0IVKgp3L)kJn$u=c);yl;}ZE4JIBm3(fD^m^V3;6x)nxQuG#&r*=D zZUixqR|ihV9_lKhgM27VOg0d&Yg`0$7O*5sNcsHBT77 z;DV3(jFx<9q0V}M-MUctN1#IxdubZQEEjSFm=`(0U?GwM z`r;_Q$_r`3FA0zV4XN;)&R{yva=D3tOxdj3c)Y65+s$-}>;!U|gXyCNrbfp{6o%Y0 zgyUYk(q8uR?_-TI6WvOFnth31=)vW&!f)h-4oBZlh;0Ev-Qa#O<493m>oH5S{vPB- z>tB^iHIu!!dDkC{@hYTl=}eIs5O<^!zPHW1!5OJw;iEra@AAv|U1DO4SeNWGYCO%3 zCsE1~23IqL1LIvi{*;J_j8K{sDwnV!xEYV=e@{c0EBEozG_$Q;(g(xmchi?-_)R%0 zCDV<#M&t(Dn#QduJ_4wTKV|=RZ`trG=9>49OZnw$Je2TB2MN6{Pd_0Y(BxH?2%I(X zqKFx-f-lT{J8wESw941{rM$k6P~OVzr{lTdp|>1KIe6IE>?FtQPPUlFe_HZxgWyB} z$3Bt7`b5@ThSR_!6K``M*dg}Qq5mBPio|_Ju44Xa$b0Bf6lpOTy}NxCU@!xBpi<{^ zdgV+jzqX8+zE$AH`6gkL`bGX;;^nqz>L!P4O?Gf2#YTpACr1A$SvYc^PIrQz*E^1u znY8bIzQuiCx>Q!%+U81O9yymo`qjkzMuJ?$Le`zSG6K!viIYr`cPX97Mz>$9R8Kyc zD6}85`qleTFh-iwS}&2slmJ-zPSIcW`&N-3PUuhuh=fgVw;yg3h^o958?~DzRuH)H z6n5n*d;o^U^C;{nidp$viBL-;mb*xcN1{uGD|)?JtPX5W>{)%M^x8=G8yiUrFg^w{ z?q{HT5&{c5&J2iw}=qiNzE6y=G+COqiKF10-y9_6pv7aY&^k9ph40g`+!@6z@>$d1$edXh^?iHs^zVA z7&8m@3>CJ3s#V1{=>%>?ajDo|R+ivBy=V(}ir^d(oYcD=c#6VWYF`+eGSpPlsi^t= zf0~$`&If(({csGK}Oi#(=+n1*0;9FxSD))35+O<|0CEoxTV$JB!qP5Wse8 zKm=DPLx8L*lD62h1DX8E+B%kP!<-D<%ieKG_%vU}HPEw)goxGUzt6a}w?v|Zk;z`f zC{n7xG1yIb(&#SdJA$ndGIZPyf)sPXPA*M`9ZEOm;Vz9wV6_c_C)0_D@ckR+;FGio zxE%S5n>tCwT@g%>FAl0pzRh5FHR^|!z>!^d!(+4Jnd+ktXHe)=6j|Z!b@2W1i>t#D z+!$G54H*0+0^IN+beBiSg-weKtccPgC6oUFRcROlUG9;Sx$x*u5V$VTJ6Eysi|7L| zcBzDt(X*f}(Q@nU(m#HJ!V6!i7D{%a+tn8ls7tdT^od8K^$mC=svEjjE%U_$j!M)s zbQ5@}dqQ=HD=@oS$O<%TQsvQK)0HY7ZX-Jpd}`xO6bRN_z7g2InlLknQ1)Nj7c#T& zoFk^3AhC)1cwIJ3h#Z`1G|Vz=m@xC-cNYbys)Hei07~%8)K?IE=-ehn#Mi(D9>ncL zh6`&B_B{nKRgn>QWeDR%ldswjUNs6_!IIknO;G!B5KPD}=7}9RIN9w&19z@g2@nP& z^=S}=)>4NoM7X%_!ZSoAFU;h$l%lIJ4D96vAX#9C<3yAH3GN>sj!P3j#|?y0V7r~G z5^fRJJ~jw~#r#B8{5mp}2Ir1W6$^%|{no3cf4gYe zT0Aws@ip(F2(XV0DDT~Vz*vNTAW}Q@ARnJ`?(bW)0ZwQEzD<}4f!Qu!k*#=&WAF9CO4S-Zk;K26$?1o zHSo?QD(>`ltSQfxc?hDCNhV<g4LMx|~U&XJOztBO<>0kiH22 z&d}r?@n(woQisBLnFhZr{VH1 zRW3VTq?huB8rULSStDCY+q+dsPAndy3~B7XT$G%&K9(JOe_9OsB$EU>Sq<5#1xucO zV8p5)eM(7ZTq5gP?3^lFr&dcusVPr4Q4p3YQPVd@5ld&A8^7WIq&!XNFs}96%*4_? z5PgSNWOwN^jdl%R4nf?y+$Sk#U`HN2{6V|FeOP{1o@kPHp{GFSPMs%tXvabQ`_A&| z_k#tai(F?5J9KUshU^30U)7a&9R~mpIpOZG@K>5(kM>v@3R%yfQ#ZE|v!M*4e!49= zvrsqX{U0o?-iC-Vj)iPL|W*N>WwoOB5wJf*e=PL=JqooRWiAQ#Z-gmq6M^Z>|2$IWR(e14kuyN zC2#VRItf=zPjHdtUyi-NDdC#R)}|eER2ANtr}^(@)qe@tAGs{jaZ_wBCQ3yF>}JxN zs_jP8b;!Mb@)q@6!B&)=B_kN8BU+qRi5eqk>r2P4xW>Z137zb1$cER)Z=A&52tt-m zW%ZWvYhe$O2*5QBfj~8Gbh>$@HLkFT(>rM&5pZ5Yxgm(th`Ljo0qCJW?a}kpa>pzlRV0l*b<1d1lblP3^CmU+>@=M*4QY$D$TivfI$ftW zIZUE#^NUQJld!cb;)t?W?YUU1Wc>Z)+^?J6QxeQDod3lc2!cCy^uKvV%zGVCYqz8d z_=n8^V(;rS7R`WeJgw@F6UqLibDkjg;_%coS9ww9y{`Z0+Ef)rp+BEp8h=W>94!8y zrbFF6GTZo~gP@M$@)`xVJ2;@nG`0(vZrJaIEB8$a+u1&^IUKU#N|cMy*9z|LT9YfA zfH=D5I2kJwbs`@IfF4u=t7fW8`KN|i>F8xHf2YBoh#9JQSBm~@$_$GgGCjXuXH^L{ z-`nuZSSbe3ap8N(Ig%a@XA+`*CYog<_FDIA?u=EXPVwSOVUQpI?DtEfwpzVLL2Zle z%BWQLNBJ^fBg1*86wny>B3Fj6##XfNaB%vjYa6uVjkE<_K>LQ2eB?-Mo`d59)sHis zhn2U{b|J3Z6iaCL$p=Pd4C5&)zDRED8N!qGidNV6nH{lRw(FC}D<$8GX~KS)9NTGt z58PF7aEV~CoO#9kGZ$kmBkn;{LRlwew(p1Tl+wNHNF+8n#A~8r>u4uImlMLnkP`1v z>g~V+@R|L>`;$H4e9{%_1Qmmc=aF@VQUw@JPgkM`zTd1drT9pf)bsY+_ZXJ(UCRrY z%*g@OL~#i9gk+$(#VxJJyOioW5ftl}_qHz|I3Zl4B<$b%B={86t2Tv~4ryJ1Wl(Kl zU>TD72Ld&>+^h6=UCK)4gosn)UQwuEr3d#q!rfB#EN5#DgHe_g!HD;WU7;q7>W-Ew6@#(@O-K(k`K zMzUc53*qY6!_X~83cts#R%Rp&u2LH=_pB=9f?sr_7B**5Wu{kz2ACym?zj7CJpHYx zMnxIK2Mdtr;J}A8TotD z$I2@D`Q|j{<8L;`-Kk&gh(-K{)3J5lSnU8>m9@h@#(^0?!pyZlmVU!RQ|=Y+`i90u zIk|3=TTNe0bnhY(-S87WO5u{MMgL%-;sgMA1oW&qc1-y;DSLt@UPM3gf~Q0I&)TlH z`)3&!mRdGhc#s5@xl+wRa9-9%^+W-8B)6QHyMt)~m6(I{2$`N}lSquV@z#6AJQ{i2 zw4_wF#mIr~GRTQ&#>@dA7~<8@LH$Hgc8M=t-JmRY6zw-5iudy2B)28<5)H5Uzm#D{G9H4x_Eoj%UIjosN<@DOm>T@?EA0STn3Rxh7X%?6?{2cIkSL=kCOWBf>XdGG@T{gdBmfnZxT8V$Mw{hXiFY zWDP)p?aP)Zn1Rzn>E6ANC&Z!+baJ)2h08|8Gf^Vz!m~^_lrGF(1x(1|MMLO@nVaA^ zb3^H)1r!TFkywCXm9K4BpN9L0cZ1}6M(+mw!+ZsO3XuOrD3tODp6zO{pbIsS2+YO6 ze2A1ocn6poQVI*${n7Vn@UPFED0v@TlK&56QC>C(mOR*z#Cj7i@Q;J^j#Qyh2jpT1 zu;Z>m`Ot(ZBY2HlovW8)B(oXLKIoIL{)hMN3Z|mt9tj~d6+MhXcP^$eL3)ION1||| z>`;G~|KdP@F8JtdUUU;~F@P@h&7R=f5cqMgp9gNA`YkHP$>UA*G$srB=+#ME?@H!Y z+S_2swpIFF*}OhJAW#emcVOFW@oyWr0#wCVWpzlCqulw^4=Q(HE`d5R0+jeko6cqkHNBXZZO$ z!mpi~k*^Dd6Q7hslWv4Om>S=3suxTOrn2Bx9SI@;akax&RBs?{Cn9<$1S+{l!mbq& z*_BB^@{hpdYU4u_nGjOphKTol{?OBrBf;^BBEZb3mG32trP<#7tRww?>}@73!ztat z@Lh~l1MSUs*k9MPs~7s~&bLFWH%mrskKUICD&YE!YU603kH|fuy*kghGQq;(c6^|9 z*aO!hL$|Xz$+_G`?LEY4iX_kC{d)4uBj;1Yy4C_|5Vuuzq-xb4@#?;OByxa*!IBS< zOY85KXSwq58NeRVmU+aZ&~Qnt?v^b5NBe0yF%IR^E0;=;59~n9YauEnvyh^3)z)F0@beU>T34~W)VcluR>5Eq| zT*@v*=HCbENgV`QL8CIOYRoby--G*~k>FK6&9zMWGL%1&oZDoS^oCPACv2CzxLI9_ zFm&&D?1iE%V5@ZStsU4^zxd|=8S~RkibCFmI5ZmR5qlAdPla=7YW4#?I>`?ZK^*T({gbl=U#=2bRzOf+<2qd!Cj}RK+4Basp?Y~=`XIL|q zT9B96|8PW$q;f5G8SWJ1n7N7tB=($a_>CM$MU|QRU#dMh=_Gbp9xYRhVk~da)+yIp z8HEL-g}(`ek+A8GhkvDGo2OLj*G}FDdSOkdg@mZ+;vC1AfhFmB9k9$Zt+)8=H5$tqP}kap>~d!aCe?LhHTn zG>SX{rMHiMW^P+hZ8!OUzr!ivv*Fh-41*L1l>m5L6eP28Kexi+S`ygBN$*XJk~EcW0)Sv}6u zgTzgT*z%w86$Ho(r~v|&4)Ydjw~2)V;dj0i!#fZ_SKw7<*+A5(+K&r|!+U+^Osigu zS@EreLC-=Y^IJKM4)uxSF6!ls<<}en9}XNGFp(drAXc!Dthn zKt=HncD21DdjGF3@O!k19$BWS7*9<)q!m1E7s@vpj;&?LSt&|5bm1Om zhL{jM^mUHc#Av3)8`cJXyz!Py|H;Tao99X$TI3;0;5w9+W{Kr2_owOA%ds(&cOYdQ zrwc_oP$8^SHem ztFn{f|V_jWFik%EUbl<;vg6eW?^yZK)W-Lx-vXQ3AC@F^s-@ zr&aRK#2IA^r!v|Xx09;IQj>ppPg$6omUhQIRSB@V4$UK{zNfHQI_+I?8(0vzYyilp z{i}h25U|+y5*doE75VbeE=_k}>|Le`@cLytxTJ_rg(FTjKJ7+c%b=P>fNLpIEdGnG zHgSN@GpxFbqNl|pP6FC@TzXSAIQRwsnx~g?NpBmF1-0ucw)rXuwhM-Ru0=G! z3P=Mz8Feb;UO*H18c_--S!Fal#-gC2$#O8crZ=|I1f|R}F<7=;YwFv|mSxpC13?W;6tXj#0u#K*~p-U%@$Eyd6gI zc!S0^b>-(e+&BbCBn(EayLr_8|4dwKA6_uA7;y4UR?LQ@h9z`+CEO2z zT&xL)7Gn7-<3G47D!@}uLlW)a5@`TJI{Ga49iHY-2QV$7^9&@B3h7==>;(@ayE
jWR|=Wb>vtn+(_Dzv-emz zz$tSFY4{EN;ck0q=^2wH_4F%W73!x?$SzhT7~`kNLo`4>p^Ytrbt#FO(v~xZ6HUE! zAlJD?uk~l8_r`l#Vic*GVhiVVg3HYamb3)UufS$8j|h~O9%t9T7IlA&S zTHf5CK$EIE46i2|EYjgP)bA@`Q{@+{xw(GEd~W zwIG?-h1!Rhm!{ z(AZzouLP;4!$$lS#TO(CrKRvTi`3?inRc)4-@*#lR(+pmw)Z-yB#|OG z@3DxiJW(4w7KlYdb{(UBRA~1n7RSsze`ieY(JST`5-8FPq*Cf}sDshbW5};TDZG2` zA|k4!BASeuO`G2x(RvN!zTuPldjx3HM0yk^@%ZP-c)qP0U5L*m%6Zu}FX~jupOi~O z>gtfOQ8Of>M5KzDl7Bg{3MgQkDWN^N^Pr!oHRk5`*FIc(rX37_vAw5YUOAT%${;K&M8YK9M8#`*A@zURD zzH!_a!~ps=(U%cf4A9LWH0*A=5Ff@7#`n1t@#U|z5_^)Y?Wtu4O<^+d4crJ+;QT=W zAWZ70$i`I$h|5#{nll(Rn8Do*<42dZJ%;2}QXO=00RvFDb`6N{z<1-?9E>;GS2-1X z5|tU1T=It?OX3}HydorQ5M0KYE`DSoD&!ixiUmOUkmuMYH{sdQQ&6vl zUFZhn>JTd-T$l*U*eS4!@-g`J4!%Y8brhMnh`u3n0P_0{C8iZ7G=nl=3PQdt$XVW7 zGgQjKCJ-e4Deh_`9bl)ZgWC|2_W?Rs|GX8>mlcHoJ2|145c?_>anU^VFaj73FlILpSBPQ%VF+2ZtSW5Rl^Lj#;pl}^o`Jr;d`x}ibHGmXP@sw!*tc^f z4*~nF0IK1j>O~`-!VSNF{f;((tcti9_y~+JBEWN-2Lk?LPTx4`xQ0xaI@!nXX6$YG zNGB!HkKLgo_mbTZKNUSJkraO@mV1gOZqTmBMJwv6RT({b79U`RQ37qOh zsfAIJG1kwo(RJJ%8oyLLt(l$oyhBp;A4cXJEA$OG_zTZrm}JcGcy`)-wmt52nXy#< zQ%ifM%#U>m>{<_on|A^Cy;s%LxxNg@Ql|BnsTZ;{l@F;4OPB-#CUXvzC~Z`&os$ng_JH$QL!{71r&Im?xwFw@(% zB{T=m4IkCbZSUk`ck(nDbs1G2!YLMxto;T`(*RH}q3tZeyVld8#MQ2d=mw;5t7S6> z=Ze;TGBxhtk;=61a30?&58!u7Fs}JS$s@c&88(sf50D?=wXN~gq%W#i+$mSy7g>0_Cm=$h&HPZN{&5-yu@3v4F zh+X|-56PHR_~Es2DvDi^kYg?y`a_<_T^PG*bi>Io43`%kn-cRQpH};jRyPK;k+8aMETn66()Tkm~C>Im8%4vF4WdMZjqgVwa-)ukH zbN;%~o5_RH^+l8+^}~-0Ud?Eroq{?QqyVrSjx$O(KVh|2?I}dA-`!|*uc;0rnhuY+ zj>u?$mHJ|_ty21b4@lD+nLdIAqy>N}uzp7_H~d%8Z<83k)ht$X+t`nv?snp-`p}JF zn@GQ_A*d0H9;03hU&HP6NZp<`iC%fvL!oz*pItZ;r;tB#vaAK0S{Zk@%znHS9y>Ry z;PF@+8EvtpqPs<7(zeHG-%9g7hv#svik*)0sls|Gz0-)#>dW=D$1jXo(@)vzyLh*D zO7P_0-21VYjEVToTY9K)c)H~-i&r^jy7iXC(zsT?(+!Ucw{sQ+98Ky%*22-8$Kw*a z7NZGl!Q0J_>w$Xu>4pCzs=ZuEui0y~8??oEOOsVVq+#eMTE$Xz*22%_pRdc@k3=zQ z#^0mJi+HNJ�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 literal 0 HcmV?d00001 diff --git a/content/references/Application Language.md b/content/references/Application Language.md new file mode 100644 index 00000000..9568e42c --- /dev/null +++ b/content/references/Application Language.md @@ -0,0 +1,101 @@ +--- +uid: references-application-language +title: Application Language +author: Morten Lønskov +updated: 2026-01-12 +applies_to: + products: + - product: Tabular Editor 2 + none: true + - product: Tabular Editor 3 + since: 3.25.0 + editions: + - edition: Desktop + full: true + - edition: Business + full: true + - edition: Enterprise + full: true +description: Change the display language for Tabular Editor 3's user interface. +--- + +# Application Language + +Tabular Editor 3 supports multiple UI languages. You can switch between them at any time. + +> [!NOTE] +Tabular Editor 3 is still not fully localized. Specifically we have so far not localized the individual TOM properties. + +## Supported Languages + +| Language | Status | +|----------|--------| +| English | Fully supported | +| Spanish | Preview | +| Chinese | Preview | +| French | Beta | +| German | Beta | +| Japanese | Beta | + +> [!NOTE] +> **Preview** languages have core UI elements translated but may have incomplete coverage. **Beta** languages are experimental and may have significant gaps or inconsistencies. Report issues on [GitHub](https://github.com/TabularEditor/TabularEditor3/issues). + +### Preview Languages +The languages under Beta support means that they have been verified by an human translator, but that Tabular Editor 3 may still not be fully localized. Specifically we have so far not localized the individual TOM properties. + +### Beta Languages +Beta languages are have been translated exclusively through AI and as not been verified by human translators. We plan to bring beta languages into Preview in Q2 2026. + +## Changing the Language + +There are two ways to change the application language: + +### Via Window Menu + +1. Click **Window** > **Language** +2. Select your desired language +3. Click **OK** when prompted to restart +4. Restart Tabular Editor 3 manually + +[Change Language via Window Menu](~/content/assets/images/user-interface/chaning-language-windows-ui.png) + +### Via Preferences + +1. Click **Tools** > **Preferences** +2. Navigate to **UI** section +3. Select your desired language from the **Language** dropdown +4. Click **OK** when prompted to restart +5. Restart Tabular Editor 3 manually + +[Change Language via Window Menu](~/content/assets/images/user-interface/chaning-language-preferences.png) + +## Restart Requirement + +**You must restart Tabular Editor 3** for language changes to take effect. The application prompts you to restart but does not restart automatically. Save your work before changing the language. + +[Change Language via Window Menu](~/content/assets/images/user-interface/chaning-language-restart-pop-up.png) + +## Installation Language + +During installation, the installer prompts you to select a language (English, Spanish, or Chinese). This sets your initial language preference, and Tabular Editor 3 displays in that language on first launch. + +The installer writes your selection to the preferences file in your LocalAppData folder. You can change this later using either method above. + +## Language Persistence + +Your language preference is stored in `UiPreferences.json` in your user profile. The setting persists across application updates and restarts. + +## Providing Feedback + +### Translation Issues + +If you find incorrect translations or missing text: + +- Open an issue on [GitHub](https://github.com/TabularEditor/TabularEditor3/issues) +- Include the language, the incorrect text, and where it appears in the UI +- Suggest the correct translation if possible + +## See Also + +- [Preferences](xref:preferences-index) +- [User Interface Overview](xref:ui-overview)