From 213eafe8f878c16fbb54a262af6a975b94f3957b Mon Sep 17 00:00:00 2001 From: Jan Kadlec Date: Mon, 21 Oct 2024 13:15:09 +0200 Subject: [PATCH] fix: export_tabular_by_visualization_id does not need to call afm-exec-api It is not necessary to execute visualization and get `execution_result` for `export_tabular_by_visualization_id`. Now export by visualization_id is supported out of the box. JIRA: TRIVIAL risk: low --- .../gooddata_sdk/catalog/export/request.py | 1 + .../gooddata_sdk/catalog/export/service.py | 38 +- .../layout/notification_channel.py | 1 + .../test_export_csv_by_visualization_id.yaml | 264 ++--------- ...test_export_excel_by_visualization_id.yaml | 442 ++++++------------ 5 files changed, 184 insertions(+), 562 deletions(-) diff --git a/gooddata-sdk/gooddata_sdk/catalog/export/request.py b/gooddata-sdk/gooddata_sdk/catalog/export/request.py index d62cbb0b4..591058479 100644 --- a/gooddata-sdk/gooddata_sdk/catalog/export/request.py +++ b/gooddata-sdk/gooddata_sdk/catalog/export/request.py @@ -65,6 +65,7 @@ class ExportRequest(Base): format: str file_name: str execution_result: Optional[str] = None + visualization_object: Optional[str] = None settings: Optional[ExportSettings] = None custom_override: Optional[ExportCustomOverride] = None diff --git a/gooddata-sdk/gooddata_sdk/catalog/export/service.py b/gooddata-sdk/gooddata_sdk/catalog/export/service.py index d1c30cee1..6321eccba 100644 --- a/gooddata-sdk/gooddata_sdk/catalog/export/service.py +++ b/gooddata-sdk/gooddata_sdk/catalog/export/service.py @@ -9,15 +9,10 @@ from gooddata_sdk.catalog.catalog_service_base import CatalogServiceBase from gooddata_sdk.catalog.export.request import ( - ExportCustomLabel, - ExportCustomMetric, - ExportCustomOverride, ExportRequest, ExportSettings, ) from gooddata_sdk.client import GoodDataApiClient -from gooddata_sdk.compute.model.metric import SimpleMetric -from gooddata_sdk.table import ExecutionTable, TableService from gooddata_sdk.visualization import VisualizationService @@ -258,33 +253,12 @@ def export_tabular( workspace_id, export_request.to_api(), file_path, create_func, get_func, timeout, retry, max_retry ) - @staticmethod - def _custom_overrides_labels(exec_table: ExecutionTable, metrics_format: str = "#,##0") -> ExportCustomOverride: - """ - Visualizations by default use generated hash as local_id, - therefore, we might want to use dummy logic to replace it. - For attributes by label.id - For metrics by item.id - """ - labels = { - attribute.local_id: ExportCustomLabel(title=attribute.label.id) for attribute in exec_table.attributes - } - metrics = { - metric.local_id: ExportCustomMetric( - title=metric.item.id if isinstance(metric, SimpleMetric) else metric.local_id, format=metrics_format - ) - for metric in exec_table.metrics - } - return ExportCustomOverride(labels=labels, metrics=metrics) - - def _get_visualization_exec_table(self, workspace_id: str, visualization_id: str) -> tuple[ExecutionTable, str]: + def _get_visualization_title(self, workspace_id: str, visualization_id: str) -> str: try: visualization = VisualizationService(self._client).get_visualization( workspace_id=workspace_id, visualization_id=visualization_id ) - return TableService(self._client).for_visualization( - workspace_id=workspace_id, visualization=visualization - ), visualization.title + return visualization.title except NotFoundException: raise ValueError( f"Either workspace workspace_id='{workspace_id}' " @@ -321,15 +295,13 @@ def export_tabular_by_visualization_id( Returns: None """ - exec_table, visualization_tile = self._get_visualization_exec_table(workspace_id, visualization_id) - custom_override = self._custom_overrides_labels(exec_table) - file_name = file_name if file_name is not None else visualization_tile + if file_name is None: + file_name = self._get_visualization_title(workspace_id, visualization_id) export_request = ExportRequest( format=file_format, - execution_result=exec_table.result_id, + visualization_object=visualization_id, file_name=file_name, settings=settings, - custom_override=custom_override, ) self.export_tabular( workspace_id=workspace_id, diff --git a/gooddata-sdk/gooddata_sdk/catalog/organization/layout/notification_channel.py b/gooddata-sdk/gooddata_sdk/catalog/organization/layout/notification_channel.py index 33f71e754..c30d1badd 100644 --- a/gooddata-sdk/gooddata_sdk/catalog/organization/layout/notification_channel.py +++ b/gooddata-sdk/gooddata_sdk/catalog/organization/layout/notification_channel.py @@ -5,6 +5,7 @@ from attrs import define, field from gooddata_api_client.model.declarative_notification_channel import DeclarativeNotificationChannel from gooddata_api_client.model.webhook import Webhook + from gooddata_sdk.catalog.base import Base # TODO: there is an issue with generated client which causes these two classes to fail diff --git a/gooddata-sdk/tests/export/fixtures/test_export_csv_by_visualization_id.yaml b/gooddata-sdk/tests/export/fixtures/test_export_csv_by_visualization_id.yaml index b84d7528c..6311a7ac5 100644 --- a/gooddata-sdk/tests/export/fixtures/test_export_csv_by_visualization_id.yaml +++ b/gooddata-sdk/tests/export/fixtures/test_export_csv_by_visualization_id.yaml @@ -28,7 +28,7 @@ interactions: Connection: - keep-alive Content-Length: - - '3321' + - '3305' Content-Security-Policy: - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com @@ -69,7 +69,7 @@ interactions: X-XSS-Protection: - '0' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:03 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:01 GMT; Path=/; HTTPOnly; SameSite=Lax body: string: @@ -121,9 +121,9 @@ interactions: identifier: id: date type: dataset - from: -11 + from: -12 granularity: GDC.time.month - to: 0 + to: -1 properties: controls: colorMapping: @@ -149,7 +149,7 @@ interactions: rotation: auto version: '2' visualizationUrl: local:combo2 - createdAt: 2024-10-07 09:18 + createdAt: 2024-10-21 11:45 relationships: createdBy: data: @@ -183,7 +183,6 @@ interactions: type: dataset attributes: title: Date - description: '' tags: - Date type: DATE @@ -193,7 +192,7 @@ interactions: type: metric attributes: title: '# of Active Customers' - createdAt: 2024-10-07 09:18 + createdAt: 2024-10-21 11:45 content: format: '#,##0' maql: SELECT COUNT({attribute/customer_id},{attribute/order_line_id}) @@ -203,7 +202,7 @@ interactions: type: metric attributes: title: Revenue per Customer - createdAt: 2024-10-07 09:18 + createdAt: 2024-10-21 11:45 content: format: $#,##0.0 maql: SELECT AVG(SELECT {metric/revenue} BY {attribute/customer_id}) @@ -224,51 +223,11 @@ interactions: self: http://localhost:3000/api/v1/entities/workspaces/demo/visualizationObjects/customers_trend?include=ALL - request: method: POST - uri: http://localhost:3000/api/v1/actions/workspaces/demo/execution/afm/execute + uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular body: - execution: - attributes: - - label: - identifier: - id: date.month - type: label - localIdentifier: 0de7d7f08af7480aa636857a26be72b6 - filters: - - relativeDateFilter: - dataset: - identifier: - id: date - type: dataset - from: -11 - granularity: MONTH - to: 0 - measures: - - definition: - measure: - item: - identifier: - id: amount_of_active_customers - type: metric - computeRatio: false - filters: [] - localIdentifier: 2ba0b87b59ca41a4b1530e81a5c1d081 - - definition: - measure: - item: - identifier: - id: revenue_per_customer - type: metric - computeRatio: false - filters: [] - localIdentifier: ec0606894b9f4897b7beaf1550608928 - resultSpec: - dimensions: - - itemIdentifiers: - - 0de7d7f08af7480aa636857a26be72b6 - localIdentifier: dim_0 - - itemIdentifiers: - - measureGroup - localIdentifier: dim_1 + fileName: Customers Trend + format: CSV + visualizationObject: customers_trend headers: Accept: - application/json @@ -282,8 +241,8 @@ interactions: - XMLHttpRequest response: status: - code: 200 - message: OK + code: 201 + message: Created headers: Access-Control-Allow-Credentials: - 'true' @@ -293,6 +252,8 @@ interactions: - no-cache, no-store, max-age=0, must-revalidate Connection: - keep-alive + Content-Length: + - '59' Content-Security-Policy: - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com @@ -322,8 +283,6 @@ interactions: - no-referrer Server: - nginx - Transfer-Encoding: - - chunked Vary: - Origin - Access-Control-Request-Method @@ -333,52 +292,20 @@ interactions: X-GDC-TRACE-ID: *id001 X-XSS-Protection: - '0' - content-length: - - '843' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:04 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:01 GMT; Path=/; HTTPOnly; SameSite=Lax body: string: - executionResponse: - dimensions: - - headers: - - attributeHeader: - localIdentifier: 0de7d7f08af7480aa636857a26be72b6 - label: - id: date.month - type: label - labelName: Date - Month/Year - attribute: - id: date.month - type: attribute - attributeName: Date - Month/Year - granularity: MONTH - primaryLabel: - id: date.month - type: label - format: - locale: en-US - pattern: MMM y - localIdentifier: dim_0 - - headers: - - measureGroupHeaders: - - localIdentifier: 2ba0b87b59ca41a4b1530e81a5c1d081 - format: '#,##0' - name: '# of Active Customers' - - localIdentifier: ec0606894b9f4897b7beaf1550608928 - format: $#,##0.0 - name: Revenue per Customer - localIdentifier: dim_1 - links: - executionResult: 6ae8c8de921598391ebbcdf454a4af97a246d285:3029b1cff8a8ecc84348a1529b72cd6aaee9991e4c3e26da5ab2ac45efa04ee2 + exportResult: d12edf81985c7965ae27204a2621e567dc90f9ca - request: method: GET - uri: http://localhost:3000/api/v1/actions/workspaces/demo/execution/afm/execute/result/6ae8c8de921598391ebbcdf454a4af97a246d285%3A3029b1cff8a8ecc84348a1529b72cd6aaee9991e4c3e26da5ab2ac45efa04ee2?offset=0%2C0&limit=512%2C256 + uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/d12edf81985c7965ae27204a2621e567dc90f9ca body: null headers: Accept: - - application/json + - application/pdf, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, + text/csv, text/html Accept-Encoding: - br, gzip, deflate X-GDC-VALIDATE-RELATIONS: @@ -387,8 +314,8 @@ interactions: - XMLHttpRequest response: status: - code: 200 - message: OK + code: 202 + message: Accepted headers: Access-Control-Allow-Credentials: - 'true' @@ -398,6 +325,8 @@ interactions: - no-cache, no-store, max-age=0, must-revalidate Connection: - keep-alive + Content-Length: + - '0' Content-Security-Policy: - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com @@ -410,8 +339,6 @@ interactions: *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com *.wistia.net embedwistia-a.akamaihd.net' - Content-Type: - - application/json DATE: *id001 Expires: - '0' @@ -427,8 +354,6 @@ interactions: - no-referrer Server: - nginx - Transfer-Encoding: - - chunked Vary: - Origin - Access-Control-Request-Method @@ -438,127 +363,29 @@ interactions: X-GDC-TRACE-ID: *id001 X-XSS-Protection: - '0' - content-length: - - '1402' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:04 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:01 GMT; Path=/; HTTPOnly; SameSite=Lax body: - string: - data: - - - 56 - - 170.1824 - - - 88 - - 178.174875 - - - 65 - - 174.79036363636362 - - - 66 - - 146.0419298245614 - - - 65 - - 111.88542372881356 - - - 56 - - 184.2714 - - - 54 - - 228.0194117647059 - - - 59 - - 110.62510204081633 - - - 76 - - 208.63134328358208 - - - 99 - - 194.15443181818182 - - - 107 - - 215.70928571428573 - - - 91 - - 152.4380487804878 - dimensionHeaders: - - headerGroups: - - headers: - - attributeHeader: - labelValue: 2023-11 - primaryLabelValue: 2023-11 - - attributeHeader: - labelValue: 2023-12 - primaryLabelValue: 2023-12 - - attributeHeader: - labelValue: 2024-01 - primaryLabelValue: 2024-01 - - attributeHeader: - labelValue: 2024-02 - primaryLabelValue: 2024-02 - - attributeHeader: - labelValue: 2024-03 - primaryLabelValue: 2024-03 - - attributeHeader: - labelValue: 2024-04 - primaryLabelValue: 2024-04 - - attributeHeader: - labelValue: 2024-05 - primaryLabelValue: 2024-05 - - attributeHeader: - labelValue: 2024-06 - primaryLabelValue: 2024-06 - - attributeHeader: - labelValue: 2024-07 - primaryLabelValue: 2024-07 - - attributeHeader: - labelValue: 2024-08 - primaryLabelValue: 2024-08 - - attributeHeader: - labelValue: 2024-09 - primaryLabelValue: 2024-09 - - attributeHeader: - labelValue: 2024-10 - primaryLabelValue: 2024-10 - - headerGroups: - - headers: - - measureHeader: - measureIndex: 0 - - measureHeader: - measureIndex: 1 - grandTotals: [] - paging: - count: - - 12 - - 2 - offset: - - 0 - - 0 - total: - - 12 - - 2 + string: '' - request: - method: POST - uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular - body: - fileName: Customers Trend - format: CSV - executionResult: 6ae8c8de921598391ebbcdf454a4af97a246d285:3029b1cff8a8ecc84348a1529b72cd6aaee9991e4c3e26da5ab2ac45efa04ee2 - customOverride: - labels: - 0de7d7f08af7480aa636857a26be72b6: - title: date.month - metrics: - 2ba0b87b59ca41a4b1530e81a5c1d081: - format: '#,##0' - title: amount_of_active_customers - ec0606894b9f4897b7beaf1550608928: - format: '#,##0' - title: revenue_per_customer + method: GET + uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/d12edf81985c7965ae27204a2621e567dc90f9ca + body: null headers: Accept: - - application/json + - application/pdf, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, + text/csv, text/html Accept-Encoding: - br, gzip, deflate - Content-Type: - - application/json X-GDC-VALIDATE-RELATIONS: - 'true' X-Requested-With: - XMLHttpRequest response: status: - code: 201 - message: Created + code: 202 + message: Accepted headers: Access-Control-Allow-Credentials: - 'true' @@ -569,7 +396,7 @@ interactions: Connection: - keep-alive Content-Length: - - '59' + - '0' Content-Security-Policy: - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com @@ -582,8 +409,6 @@ interactions: *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com *.wistia.net embedwistia-a.akamaihd.net' - Content-Type: - - application/json DATE: *id001 Expires: - '0' @@ -609,14 +434,13 @@ interactions: X-XSS-Protection: - '0' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:04 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:01 GMT; Path=/; HTTPOnly; SameSite=Lax body: - string: - exportResult: f23623e9360065db97c83eb212766ab0f5b2f33f + string: '' - request: method: GET - uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/f23623e9360065db97c83eb212766ab0f5b2f33f + uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/d12edf81985c7965ae27204a2621e567dc90f9ca body: null headers: Accept: @@ -680,13 +504,13 @@ interactions: X-XSS-Protection: - '0' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:04 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:02 GMT; Path=/; HTTPOnly; SameSite=Lax body: string: '' - request: method: GET - uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/f23623e9360065db97c83eb212766ab0f5b2f33f + uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/d12edf81985c7965ae27204a2621e567dc90f9ca body: null headers: Accept: @@ -716,7 +540,7 @@ interactions: Content-Disposition: - attachment; filename="=?UTF-8?Q?Customers_Trend.csv?="; filename*=UTF-8''Customers%20Trend.csv Content-Length: - - '419' + - '410' Content-Security-Policy: - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com @@ -756,10 +580,12 @@ interactions: X-XSS-Protection: - '0' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:04 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:02 GMT; Path=/; HTTPOnly; SameSite=Lax body: - string: '"date.month","amount_of_active_customers","revenue_per_customer" + string: '"Date - Month/Year","Active Customers","Revenue per Customer" + + "2023-10",73,177.2809375 "2023-11",56,170.1824 @@ -783,6 +609,4 @@ interactions: "2024-09",107,215.70928571428573 - "2024-10",91,152.4380487804878 - ' diff --git a/gooddata-sdk/tests/export/fixtures/test_export_excel_by_visualization_id.yaml b/gooddata-sdk/tests/export/fixtures/test_export_excel_by_visualization_id.yaml index 24bc0bdcc..507c6e4e8 100644 --- a/gooddata-sdk/tests/export/fixtures/test_export_excel_by_visualization_id.yaml +++ b/gooddata-sdk/tests/export/fixtures/test_export_excel_by_visualization_id.yaml @@ -28,7 +28,7 @@ interactions: Connection: - keep-alive Content-Length: - - '3321' + - '3305' Content-Security-Policy: - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com @@ -69,7 +69,7 @@ interactions: X-XSS-Protection: - '0' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:04 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:02 GMT; Path=/; HTTPOnly; SameSite=Lax body: string: @@ -121,9 +121,9 @@ interactions: identifier: id: date type: dataset - from: -11 + from: -12 granularity: GDC.time.month - to: 0 + to: -1 properties: controls: colorMapping: @@ -149,7 +149,7 @@ interactions: rotation: auto version: '2' visualizationUrl: local:combo2 - createdAt: 2024-10-07 09:18 + createdAt: 2024-10-21 11:45 relationships: createdBy: data: @@ -183,7 +183,6 @@ interactions: type: dataset attributes: title: Date - description: '' tags: - Date type: DATE @@ -193,7 +192,7 @@ interactions: type: metric attributes: title: '# of Active Customers' - createdAt: 2024-10-07 09:18 + createdAt: 2024-10-21 11:45 content: format: '#,##0' maql: SELECT COUNT({attribute/customer_id},{attribute/order_line_id}) @@ -203,7 +202,7 @@ interactions: type: metric attributes: title: Revenue per Customer - createdAt: 2024-10-07 09:18 + createdAt: 2024-10-21 11:45 content: format: $#,##0.0 maql: SELECT AVG(SELECT {metric/revenue} BY {attribute/customer_id}) @@ -224,51 +223,11 @@ interactions: self: http://localhost:3000/api/v1/entities/workspaces/demo/visualizationObjects/customers_trend?include=ALL - request: method: POST - uri: http://localhost:3000/api/v1/actions/workspaces/demo/execution/afm/execute + uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular body: - execution: - attributes: - - label: - identifier: - id: date.month - type: label - localIdentifier: 0de7d7f08af7480aa636857a26be72b6 - filters: - - relativeDateFilter: - dataset: - identifier: - id: date - type: dataset - from: -11 - granularity: MONTH - to: 0 - measures: - - definition: - measure: - item: - identifier: - id: amount_of_active_customers - type: metric - computeRatio: false - filters: [] - localIdentifier: 2ba0b87b59ca41a4b1530e81a5c1d081 - - definition: - measure: - item: - identifier: - id: revenue_per_customer - type: metric - computeRatio: false - filters: [] - localIdentifier: ec0606894b9f4897b7beaf1550608928 - resultSpec: - dimensions: - - itemIdentifiers: - - 0de7d7f08af7480aa636857a26be72b6 - localIdentifier: dim_0 - - itemIdentifiers: - - measureGroup - localIdentifier: dim_1 + fileName: Customers Trend + format: XLSX + visualizationObject: customers_trend headers: Accept: - application/json @@ -282,8 +241,8 @@ interactions: - XMLHttpRequest response: status: - code: 200 - message: OK + code: 201 + message: Created headers: Access-Control-Allow-Credentials: - 'true' @@ -293,6 +252,8 @@ interactions: - no-cache, no-store, max-age=0, must-revalidate Connection: - keep-alive + Content-Length: + - '59' Content-Security-Policy: - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com @@ -322,8 +283,6 @@ interactions: - no-referrer Server: - nginx - Transfer-Encoding: - - chunked Vary: - Origin - Access-Control-Request-Method @@ -333,52 +292,20 @@ interactions: X-GDC-TRACE-ID: *id001 X-XSS-Protection: - '0' - content-length: - - '843' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:04 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:03 GMT; Path=/; HTTPOnly; SameSite=Lax body: string: - executionResponse: - dimensions: - - headers: - - attributeHeader: - localIdentifier: 0de7d7f08af7480aa636857a26be72b6 - label: - id: date.month - type: label - labelName: Date - Month/Year - attribute: - id: date.month - type: attribute - attributeName: Date - Month/Year - granularity: MONTH - primaryLabel: - id: date.month - type: label - format: - locale: en-US - pattern: MMM y - localIdentifier: dim_0 - - headers: - - measureGroupHeaders: - - localIdentifier: 2ba0b87b59ca41a4b1530e81a5c1d081 - format: '#,##0' - name: '# of Active Customers' - - localIdentifier: ec0606894b9f4897b7beaf1550608928 - format: $#,##0.0 - name: Revenue per Customer - localIdentifier: dim_1 - links: - executionResult: 6ae8c8de921598391ebbcdf454a4af97a246d285:3029b1cff8a8ecc84348a1529b72cd6aaee9991e4c3e26da5ab2ac45efa04ee2 + exportResult: 3005aff1a735ed038348f896e7cc1db5d2a77f9b - request: method: GET - uri: http://localhost:3000/api/v1/actions/workspaces/demo/execution/afm/execute/result/6ae8c8de921598391ebbcdf454a4af97a246d285%3A3029b1cff8a8ecc84348a1529b72cd6aaee9991e4c3e26da5ab2ac45efa04ee2?offset=0%2C0&limit=512%2C256 + uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/3005aff1a735ed038348f896e7cc1db5d2a77f9b body: null headers: Accept: - - application/json + - application/pdf, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, + text/csv, text/html Accept-Encoding: - br, gzip, deflate X-GDC-VALIDATE-RELATIONS: @@ -387,8 +314,8 @@ interactions: - XMLHttpRequest response: status: - code: 200 - message: OK + code: 202 + message: Accepted headers: Access-Control-Allow-Credentials: - 'true' @@ -398,6 +325,8 @@ interactions: - no-cache, no-store, max-age=0, must-revalidate Connection: - keep-alive + Content-Length: + - '0' Content-Security-Policy: - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com @@ -410,8 +339,6 @@ interactions: *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com *.wistia.net embedwistia-a.akamaihd.net' - Content-Type: - - application/json DATE: *id001 Expires: - '0' @@ -427,8 +354,6 @@ interactions: - no-referrer Server: - nginx - Transfer-Encoding: - - chunked Vary: - Origin - Access-Control-Request-Method @@ -438,127 +363,29 @@ interactions: X-GDC-TRACE-ID: *id001 X-XSS-Protection: - '0' - content-length: - - '1402' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:04 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:03 GMT; Path=/; HTTPOnly; SameSite=Lax body: - string: - data: - - - 56 - - 170.1824 - - - 88 - - 178.174875 - - - 65 - - 174.79036363636362 - - - 66 - - 146.0419298245614 - - - 65 - - 111.88542372881356 - - - 56 - - 184.2714 - - - 54 - - 228.0194117647059 - - - 59 - - 110.62510204081633 - - - 76 - - 208.63134328358208 - - - 99 - - 194.15443181818182 - - - 107 - - 215.70928571428573 - - - 91 - - 152.4380487804878 - dimensionHeaders: - - headerGroups: - - headers: - - attributeHeader: - labelValue: 2023-11 - primaryLabelValue: 2023-11 - - attributeHeader: - labelValue: 2023-12 - primaryLabelValue: 2023-12 - - attributeHeader: - labelValue: 2024-01 - primaryLabelValue: 2024-01 - - attributeHeader: - labelValue: 2024-02 - primaryLabelValue: 2024-02 - - attributeHeader: - labelValue: 2024-03 - primaryLabelValue: 2024-03 - - attributeHeader: - labelValue: 2024-04 - primaryLabelValue: 2024-04 - - attributeHeader: - labelValue: 2024-05 - primaryLabelValue: 2024-05 - - attributeHeader: - labelValue: 2024-06 - primaryLabelValue: 2024-06 - - attributeHeader: - labelValue: 2024-07 - primaryLabelValue: 2024-07 - - attributeHeader: - labelValue: 2024-08 - primaryLabelValue: 2024-08 - - attributeHeader: - labelValue: 2024-09 - primaryLabelValue: 2024-09 - - attributeHeader: - labelValue: 2024-10 - primaryLabelValue: 2024-10 - - headerGroups: - - headers: - - measureHeader: - measureIndex: 0 - - measureHeader: - measureIndex: 1 - grandTotals: [] - paging: - count: - - 12 - - 2 - offset: - - 0 - - 0 - total: - - 12 - - 2 + string: '' - request: - method: POST - uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular - body: - fileName: Customers Trend - format: XLSX - executionResult: 6ae8c8de921598391ebbcdf454a4af97a246d285:3029b1cff8a8ecc84348a1529b72cd6aaee9991e4c3e26da5ab2ac45efa04ee2 - customOverride: - labels: - 0de7d7f08af7480aa636857a26be72b6: - title: date.month - metrics: - 2ba0b87b59ca41a4b1530e81a5c1d081: - format: '#,##0' - title: amount_of_active_customers - ec0606894b9f4897b7beaf1550608928: - format: '#,##0' - title: revenue_per_customer + method: GET + uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/3005aff1a735ed038348f896e7cc1db5d2a77f9b + body: null headers: Accept: - - application/json + - application/pdf, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, + text/csv, text/html Accept-Encoding: - br, gzip, deflate - Content-Type: - - application/json X-GDC-VALIDATE-RELATIONS: - 'true' X-Requested-With: - XMLHttpRequest response: status: - code: 201 - message: Created + code: 202 + message: Accepted headers: Access-Control-Allow-Credentials: - 'true' @@ -569,7 +396,7 @@ interactions: Connection: - keep-alive Content-Length: - - '59' + - '0' Content-Security-Policy: - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com @@ -582,8 +409,6 @@ interactions: *.mapbox.com *.litix.io *.wistia.com *.hsforms.net *.hsforms.com embedwistia-a.akamaihd.net matomo.anywhere.gooddata.com; media-src ''self'' blob: data: *.wistia.com *.wistia.net embedwistia-a.akamaihd.net' - Content-Type: - - application/json DATE: *id001 Expires: - '0' @@ -609,14 +434,13 @@ interactions: X-XSS-Protection: - '0' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:04 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:03 GMT; Path=/; HTTPOnly; SameSite=Lax body: - string: - exportResult: 0e43963b16ccc52e72cd305fcc916ae99e7afd26 + string: '' - request: method: GET - uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/0e43963b16ccc52e72cd305fcc916ae99e7afd26 + uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/3005aff1a735ed038348f896e7cc1db5d2a77f9b body: null headers: Accept: @@ -680,13 +504,13 @@ interactions: X-XSS-Protection: - '0' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:04 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:03 GMT; Path=/; HTTPOnly; SameSite=Lax body: string: '' - request: method: GET - uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/0e43963b16ccc52e72cd305fcc916ae99e7afd26 + uri: http://localhost:3000/api/v1/actions/workspaces/demo/export/tabular/3005aff1a735ed038348f896e7cc1db5d2a77f9b body: null headers: Accept: @@ -716,7 +540,7 @@ interactions: Content-Disposition: - attachment; filename="=?UTF-8?Q?Customers_Trend.xlsx?="; filename*=UTF-8''Customers%20Trend.xlsx Content-Length: - - '6144' + - '6156' Content-Security-Policy: - 'default-src ''self'' *.wistia.com *.wistia.net; script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' *.wistia.com *.wistia.net *.hsforms.net *.hsforms.com @@ -756,7 +580,7 @@ interactions: X-XSS-Protection: - '0' set-cookie: - - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 07 Oct 2024 09:18:05 GMT; + - SPRING_REDIRECT_URI=; Max-Age=0; Expires=Mon, 21 Oct 2024 11:57:04 GMT; Path=/; HTTPOnly; SameSite=Lax body: string: !!binary | @@ -776,95 +600,95 @@ interactions: tLZMbElot2n99xEJTR0IoQefxIzYmQe7683P0IsDJuqCV1AVJQj0JtjOtwo+d2+PzyCItbe6Dx4V jEiwqR/W79hrzjPkukgih3hS4Jjji5RkHA6aihDR558mpEFzlqmVUZu9blEuyvJJpmkG1FeZYmsV pK2tQOzGiP/JDk3TGXwN5mtAzzcq5HdIe3KInEN1apEVXCySp6cqcirI2zCLOWE4z+IfyEmezbsM - yzkZiMc+L/QCcdb36lez1jud0H5wytc2pZjavzDy6uLqI1BLAwQUAAAACAAAAD8A+0a6I/MCAAAY - CQAAGAAAAHhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbI2WW2+bMBTH3/cpEO8zPr4TJal6UbU9TJp2 - fabESVABR+C227efuaQzrjNNSMjm+Pj/899wzPrqV1Mnz7rrK9NuUkA4TXRbml3VHjbp92/371Wa - 9LZod0VtWr1Jf+s+vdq+W7+Y7rE/am0TN0Hbb9KjtadVlvXlUTdFj8xJty6yN11TWNftDll/6nSx - G5OaOiMYi6wpqjadZlh1/zOH2e+rUt+Z8qnRrZ0m6XRdWIffH6tTn27Xu8rFhvUknd5v0mtY3QJN - s+16lP5R6Zfeaye2ePiqa11avXMGpMmwsgdjHofgR/cID6nZm9z7kepzl+z0vniq7Rfz8kFXh6N1 - k/AhpTR1P96TpmrHmZvi16RQ7ezRtSTiElMgPE3Kp96a5uccmNOnRDIn0r+JAjHCpbqQmU3KI+Vd - YYvtujMvSTdK96di2CxYUWdUOTy8Hp6OMUc+2Pe8JevseZhmHnEzjSDeCLwccTuNoN4IeB2ROfVX - BBJFIGM6GxMZJxQCgCnOxzgXgfYUFJOqxAgUYXFxGhWnY748i4tQfIqrMa5UID4F81lcIZBMSR6X - Z1F5tpTPQ/OZt3bBA3m2WDtDMsdUnK84BY9S8AUFJTSg4J4JItwB7pvABMIMcpK7beACLmyFiFKI - JQUPvRD/8kL4XgAgpTgjVBKl4JIXMkohlxQq9EJ6Xrx5G6XvhWKIyEsWqKi4WogzCMWV/ymwQFx5 - FhCiEIacAUjBJOZ5nCKPUuRLChYI3eS+BXlAkfsWAEaCcMAEM6xA0DgF4HhpwksOGXLMAyY7ZLgX - c3T2AyskKFBGiaJckQsFCi4USViQcMxDEvAsyUNL5ujsSc4QOFMpqOm6QBKvlUCWJFSEJH61BCxD - FL9eEuBI4pwo7l7T4X4BJV45YVk6eVgYbsCvnTmEJIviyQliVGFXPqdbQJJ5x9mpOOhPRXeo2j6p - 9d6dORi5766bTt+xbc1pbLnS9GCsOyDPvaP7BdHd0HPqe2PsuTMcnK8/Nds/UEsDBBQAAAAIAAAA - PwDvbfqrTwEAAC8CAAAPAAAAeGwvd29ya2Jvb2sueG1sjVHLTsMwELzzFZbvNA8lEa2aVKKAqISA - Q2nPJt40Vv2IbIe0f886VQrcOHlndnc0s16uTkqSL7BOGF3SZBZTAro2XOhDST+2T7d3lDjPNGfS - aCjpGRxdVTfLwdjjpzFHgvvalbT1vltEkatbUMzNTAcaO42xinmE9hC5zgLjrgXwSkZpHBeRYkLT - i8LC/kfDNI2o4cHUvQLtLyIWJPPo3rWic7RaNkLC7hKIsK57ZQptnyQlkjn/yIUHXtIMoRngD2H7 - 7r4XMoA8zmlUXUO+W8KhYb30W7Q2qeO50ixNizAZpnYCBvezFCA57YXmZihpmuFlzxNKckqGsd4L - 7lskinh+5Z5BHFpf0nlRxEE8+qU+3m96iR7DrXvnjUJTZGtBc/yw0NxgkARTLQQWdsOTUWrar5ms - MVZ4xsE0y5M5JU0v5Rq5N/1i2CgQlqZI1TdQSwMEFAAAAAgAAAA/AE3DFS27AAAABwEAABQAAAB4 - bC9zaGFyZWRTdHJpbmdzLnhtbF2PwUoEMRBE735F6LuT2RVEJMkehP0CPQ9NpncnMOmM6c6gf28W - UcFjVb2CKnf6yKvZqUoq7OEwjGCIY5kTXz28vZ7vn8CIIs+4FiYPnyRwCndORE2vsnhYVLdnayUu - lFGGshH35FJqRu2yXq1slXCWhUjzao/j+GgzJgYTS2P18ACmcXpv9PKjg5MUnAbMN2cqlwmjpp2m - 2ERL7nud1eDsjfomK+3EjaaN6i/0n5lRaciFdflLbH8SvgBQSwMEFAAAAAgAAAA/AHGJdRUZAwAA - bhEAAA0AAAB4bC9zdHlsZXMueG1s1Vhbb9owFH7fr7Dc161JKDC2EaqtEtKkrZrUbtqriZ1gzZfI - MQj66+dLIEkXSgr0svAQ+/ic7/uOfbAN48sVZ2BJVEGliGF0HkJARCIxFVkMf95O340gKDQSGDEp - SAzXpICXkzfjQq8ZuZkTooFBEEUM51rnH4OgSOaEo+Jc5kSYkVQqjrTpqiwockUQLmwQZ0EvDIcB - R1TAyVgs+JTrAiRyIXQMe1sT8K+v2Ggb9iHwcFcSGymcc7A2zycYtLoPmu5nb8/OQusalGyTcSpF - RTqA3jAZF3dgiZiBiKx7IplUQJusDIizCMSJ97hCjM4UtcYUccrW3tyzBjcRpR+nQirH7RmaPKOK - RmWzGE6noXuaXL+IwkigVq522PPwH2D/NIGXpwAehfZzSuD2Ge+A6V52dSljzdU1hsk4R1oTJaam - A8r27To3TMIUuIdxfnu8M4XWUW/QPaCQjGKrIrtqn7hZOUAFJitiStgUvEWvIR7JVa3+M3CF9vNY - LvcyazeTCptNabN6I7gxTcaMpNqEK5rN7VvL3HJIrSU3DUxRJgVilmAT0SESuP0shnpOkz9wU4Jo - oWVZgYH320+wH8l6NVTUQgTc+b0KjOfp5QavRklH7trs7ed2bvcz2+HbntRDUh47xxtYjMwZiLsL - FgfpPaYa9gK+sM6nrZW2XeHQOigbZktLCGM3Fu93ut3XIoO6Smu3ltDeWcS2aTbDsulhfMfi19E8 - dh02PAgXrNItwa7oaEd0VEUDlOdsPZU+Qd/74hyr/mdGM8HJZg7QpgvmUtE7E2oPdbt80F5ONU1s - 3yyNy32V7tbXq/T16vp6D+uzh9Ap1B4q7+IF5ZUXay/wohJ4URfYvy/wesFnRE3dBbsm9Elkd6mB - 8r7vs+jvqNLBIVkcpNvtJnXhifEg6gjtw9eqvUP1vP9fq6d/dPWcIIuT1FL/6Fp6hkyC8iCrnZaN - s3JrBfYXYQyvrWBWS2a2oExT0XJOGky8qo5IN6rRjJEmi8HAJEULpm+3gzGs2t8Jpgv+Yev1gy6l - Lr2q9jebZzR0Cqp/SiZ/AVBLAwQUAAAACAAAAD8AGPpGVLAFAABSGwAAEwAAAHhsL3RoZW1lL3Ro - ZW1lMS54bWztWU2P20QYvvMrRr63jhM7za6arTbZpIXttqvdtKjHiT2xpxl7rJnJbnND7REJCVEQ - FyRuHBBQqZW4lF+zUARF6l/g9UeS8WayzbaLALU5JJ7x835/+B3n6rUHMUNHREjKk7blXK5ZiCQ+ - D2gStq07g/6lloWkwkmAGU9I25oSaV3b+uAq3lQRiQkC8kRu4rYVKZVu2rb0YRvLyzwlCdwbcRFj - BUsR2oHAx8A2Zna9VmvaMaaJhRIcA9fboxH1CRpkLK2tGfMeg69EyWzDZ+LQzyXqFDk2GDvZj5zK - LhPoCLO2BXICfjwgD5SFGJYKbrStWv6x7K2r9pyIqRW0Gl0//5R0JUEwrud0IhzOCZ2+u3FlZ86/ - XvBfxvV6vW7PmfPLAdj3wVJnCev2W05nxlMDFZfLvLs1r+ZW8Rr/xhJ+o9PpeBsVfGOBd5fwrVrT - 3a5X8O4C7y3r39nudpsVvLfAN5fw/SsbTbeKz0ERo8l4CZ3Fcx6ZOWTE2Q0jvAXw1iwBFihby66C - PlGrci3G97noAyAPLlY0QWqakhH2AdfF8VBQnAnAmwRrd4otXy5tZbKQ9AVNVdv6KMVQEQvIq+c/ - vHr+FL16/uTk4bOThz+fPHp08vAnA+ENnIQ64cvvPv/rm0/Qn0+/ffn4SzNe6vjffvz011++MAOV - Dnzx1ZPfnz158fVnf3z/2ADfFniowwc0JhLdIsfogMdgm0EAGYrzUQwiTCsUOAKkAdhTUQV4a4qZ - CdchVefdFdAATMDrk/sVXQ8jMVHUANyN4gpwj3PW4cJozm4mSzdnkoRm4WKi4w4wPjLJ7p4KbW+S - QiZTE8tuRCpq7jOINg5JQhTK7vExIQaye5RW/LpHfcElHyl0j6IOpkaXDOhQmYlu0BjiMjUpCKGu - +GbvLupwZmK/Q46qSCgIzEwsCau48TqeKBwbNcYx05E3sYpMSh5OhV9xuFQQ6ZAwjnoBkdJEc1tM - K+ruYuhExrDvsWlcRQpFxybkTcy5jtzh426E49SoM00iHfuhHEOKYrTPlVEJXq2QbA1xwMnKcN+l - RJ2vrO/QMDInSHZnIsquXem/MU3OasaMQjd+34xn8G14NJlK4nQLXoX7HzbeHTxJ9gnk+vu++77v - vot9d1Utr9ttFw3W1ufinF+8ckgeUcYO1ZSRmzJvzRKUDvqwmS9yovlMnkZwWYqr4EKB82skuPqY - qugwwimIcXIJoSxZhxKlXMJJwFrJOz9OUjA+3/NmZ0BAY7XHg2K7oZ8N52zyVSh1QY2MwbrCGlfe - TphTANeU5nhmad6Z0mzNm1ANCGcHf6dZL0RDxmBGgszvBYNZWC48RDLCASlj5BgNcRpruq31eq9p - 0jYabydtnSDp4twV4rwLiFJtKUr2cjmypLpCx6CVV/cs5OO0bY1gkoLLOAV+MmtAmIVJ2/JVacpr - i/m0wea0dGorDa6ISIVUO1hGBVV+a/bqJFnoX/fczA8XY4ChG62nRaPl/Ita2KdDS0Yj4qsVO4tl - eY9PFBGHUXCMhmwiDjDo7RbZFVAJz4z6bCGgQt0y8aqVX1bB6Vc0ZXVglka47EktLfYFPL+e65Cv - NPXsFbq/oSmNCzTFe3dNyTIXxtZGkB+oYAwQGGU52ra4UBGHLpRG1O8LGBxyWaAXgrLIVEIse9+c - 6UqOFn2r4FE0uTBSBzREgkKnU5EgZF+Vdr6GmVPXn68zRmWfmasr0+J3SI4IG2TV28zst1A06yal - I3Lc6aDZpuoahv3/8OTjrph8zh4PFoLc88wirtb0tUfBxtupcM5Hbd1scd1b+1GbwuEDZV/QuKnw - 2WK+HfADiD6aT5QIEvFSqyy/+eYQdG5pxmWs/tkxahGC1op4X+TwqTm7scLZZ4t7c2d7Bl97Z7va - Xi5RWzvI5KulP5748D7I3oGD0oQpWbxNegBHze7sLwPgYy9It/4GUEsDBBQAAAAIAAAAPwAlLLR0 - JgEAAFACAAARAAAAZG9jUHJvcHMvY29yZS54bWydkstuwjAQRff9isj7xA70Qa0kSG3FqkiVSkXV - nWUPwWr8kO025O9rEgggsepyfO+cuTNyMd+pJvkF56XRJcozghLQ3Aip6xJ9rBbpDCU+MC1YYzSU - qAOP5tVNwS3lxsGbMxZckOCTCNKecluibQiWYuz5FhTzWXToKG6MUyzE0tXYMv7NasATQu6xgsAE - CwzvgakdieiAFHxE2h/X9ADBMTSgQAeP8yzHJ28Ap/zVhl45cyoZOgtXrUdxdO+8HI1t22bttLfG - /Dn+XL6+96umUu9PxQFVheCUO2DBuKrA50U8XMN8WMYTbySIpy7qV94Oiwx9IJIYgA5xj8p6+vyy - WqBqQia3aU5S8rAijzSfUXL3tR950X8CqsOQfxOPgCH35Seo/gBQSwMEFAAAAAgAAAA/ALLAMkd+ - AQAAGQMAABAAAABkb2NQcm9wcy9hcHAueG1snVLBTuswELzzFZHv1GmF0FPlGKEC4sDTq9QAZ+Ns - GgvHtrzbqH1fj5OqIQVO5DQ7OxpPdlfc7FubdRDReFew+SxnGTjtK+O2BXsuHy7/sAxJuUpZ76Bg - B0B2Iy/EOvoAkQxglhwcFqwhCkvOUTfQKpyltkud2sdWUSrjlvu6NhruvN614Igv8vyaw57AVVBd - htGQHR2XHf3WtPK6z4cv5SEkPyluQ7BGK0o/Kf8aHT36mrL7vQYr+LQpktEG9C4aOshc8GkpNlpZ - WCVjWSuLIPgnIR5B9TNbKxNRio6WHWjyMUPzP01twbI3hdDHKVinolGO2FF2LAZsA1KUrz6+YwNA - KPhIDnCqnWJzJeeDIIFzIR+DJHwesTRkAf/VaxXph8TzaeIhA5tkXO2QfJuuJitjWt+3oKcnvzyy - 8m1QLk2Sj+jJuHd8DqW/UwSnuZ6TYtOoCFVaxTj3kRCPKWC0vX7VKLeF6qT53uiv4OV46XK+mOXp - G5Z/4gT/PGr5AVBLAQIUAxQAAAAIAAAAPwBhXUk6TwEAAI8EAAATAAAAAAAAAAAAAACAgQAAAABb - Q29udGVudF9UeXBlc10ueG1sUEsBAhQDFAAAAAgAAAA/APKfSdrpAAAASwIAAAsAAAAAAAAAAAAA - AICBgAEAAF9yZWxzLy5yZWxzUEsBAhQDFAAAAAgAAAA/AER1W/DoAAAAuQIAABoAAAAAAAAAAAAA - AICBkgIAAHhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzUEsBAhQDFAAAAAgAAAA/APtGuiPzAgAA - GAkAABgAAAAAAAAAAAAAAICBsgMAAHhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbFBLAQIUAxQAAAAI - AAAAPwDvbfqrTwEAAC8CAAAPAAAAAAAAAAAAAACAgdsGAAB4bC93b3JrYm9vay54bWxQSwECFAMU - AAAACAAAAD8ATcMVLbsAAAAHAQAAFAAAAAAAAAAAAAAAgIFXCAAAeGwvc2hhcmVkU3RyaW5ncy54 - bWxQSwECFAMUAAAACAAAAD8AcYl1FRkDAABuEQAADQAAAAAAAAAAAAAAgIFECQAAeGwvc3R5bGVz - LnhtbFBLAQIUAxQAAAAIAAAAPwAY+kZUsAUAAFIbAAATAAAAAAAAAAAAAACAgYgMAAB4bC90aGVt - ZS90aGVtZTEueG1sUEsBAhQDFAAAAAgAAAA/ACUstHQmAQAAUAIAABEAAAAAAAAAAAAAAICBaRIA - AGRvY1Byb3BzL2NvcmUueG1sUEsBAhQDFAAAAAgAAAA/ALLAMkd+AQAAGQMAABAAAAAAAAAAAAAA - AICBvhMAAGRvY1Byb3BzL2FwcC54bWxQSwUGAAAAAAoACgCAAgAAahUAAAAA + yzkZiMc+L/QCcdb36lez1jud0H5wytc2pZjavzDy6uLqI1BLAwQUAAAACAAAAD8ABmeTRe4CAAAS + CQAAGAAAAHhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbI1W246bMBB971cg3ms8vjtKstqLVu1DparX + Z5Y4CdqAI/Bu2r+vgWRrHKgqJGQzl3PmDIxZ3vyqDsmradrS1qsUEE4TUxd2U9a7Vfr92+N7lSat + y+tNfrC1WaW/TZverN8tT7Z5bvfGuMQnqNtVunfuuMiyttibKm+RPZraW7a2qXLnt80ua4+NyTd9 + UHXICMYiq/KyTocMi+Z/ctjttizMgy1eKlO7IUljDrnz9Nt9eWzT9XJTeltXT9KY7Sq9hcU90DRb + L3voH6U5tcE6cfnTV3MwhTMbL0CadJU9WfvcGT/6R7gLza5iH3tWn5tkY7b5y8F9sacPptztnU/C + u5DCHtr+nlRl3Weu8l8DQrlxe7+SiEtMgfA0KV5aZ6ufZ8M5fAgk50D6N1AgRrhUM5HZgNyzfMhd + vl429pQ0PXR7zLtmwYJ6oYru4W33tLd55p18r2uyzF67NGePu8GDBB547HE/eNDAA948Mo/+RoFM + UiB9OOsDGfdNjQgMdt7bJY2wB6MYUKVERGFNJZ/Gp5P4tE8hL/gUIvzBrno7FxH+YNRnfIxAETYN + zibB2RhcxOAsKF6pCJyNilcIJFNztfNJeD6G13HzeVC74BE8H9XOkNSYiss1zUJMshAjFpRETb4T + gQgi7oAIRWACYQaaaN8GLmCmFXKShRyz4LEW8l9ayFALAKQUZ4RKohTMaaEmWagxCxVroQItrt5G + FWqhGCJyTgI9Ca5H4AxicB1+CiwC14EEhCiEQTMAKZjEXE+zADw9lPCYB2PxTMKhCjqeRziUATAS + hAMmmGEFgs4wmRmPMGYir5hAIImM+3G2njXBCgkKlFGiKFdkZkjC9JQEMmLCMY+ZhHNSX2kyGpSa + IfCyUlDDNcNkel7CeGByKmIm4cQELGMq4cwkwJHEmijuX9XuHlHJgoPsmO/Mp7zZlXWbHMzWnzYY + +e+uGc7dfu3ssV/50fRknT8aL7u9//kwTbfz6Ftr3WXTHZlvvzPrP1BLAwQUAAAACAAAAD8A7236 + q08BAAAvAgAADwAAAHhsL3dvcmtib29rLnhtbI1Ry07DMBC88xWW7zQPJRGtmlSigKiEgENpzybe + NFb9iGyHtH/POlUK3Dh5Z3Z3NLNerk5Kki+wThhd0mQWUwK6NlzoQ0k/tk+3d5Q4zzRn0mgo6Rkc + XVU3y8HY46cxR4L72pW09b5bRJGrW1DMzUwHGjuNsYp5hPYQuc4C464F8EpGaRwXkWJC04vCwv5H + wzSNqOHB1L0C7S8iFiTz6N61onO0WjZCwu4SiLCue2UKbZ8kJZI5/8iFB17SDKEZ4A9h++6+FzKA + PM5pVF1DvlvCoWG99Fu0NqnjudIsTYswGaZ2Agb3sxQgOe2F5mYoaZrhZc8TSnJKhrHeC+5bJIp4 + fuWeQRxaX9J5UcRBPPqlPt5veokew617541CU2RrQXP8sNDcYJAEUy0EFnbDk1Fq2q+ZrDFWeMbB + NMuTOSVNL+UauTf9YtgoEJamSNU3UEsDBBQAAAAIAAAAPwChHqC2ugAAAAQBAAAUAAAAeGwvc2hh + cmVkU3RyaW5ncy54bWxdj8FKBDEQRO9+RdP33R4VRCTJIivevIgePIaZdicw6YzpzqB/b0QU8Vi8 + V1DlDu95gY2rpiIez/cDAstYpiQnj89P97trBLUoU1yKsMcPVjyEM6dq0KuiHmez9YZIx5lz1H1Z + WTp5LTVH67GeSNfKcdKZ2fJCF8NwRTkmQRhLE/N4idAkvTU+/uTgNAVn4Xa0tDEcm1rJfaUjC46+ + 2Dd/5I2lMaxcf6X/zl00hh08FLGZXjj+EajfCJ9QSwMEFAAAAAgAAAA/AOXbaTEsAwAAqBEAAA0A + AAB4bC9zdHlsZXMueG1s1Vhbb9MwFH7nV1ge4gmW9EphTRFMqoQEE9IG4tVJnNTCl+A4Vbtfjy9p + k0zJ2rXdhfTBt+985zv2ie10+mnFKFhimRPBA9g79yHAPBIx4WkAf97M300gyBXiMaKC4wCucQ4/ + zV5Nc7Wm+HqBsQKagecBXCiVffS8PFpghvJzkWGuRxIhGVK6KVMvzyRGcW6MGPX6vj/2GCIczqa8 + YHOmchCJgqsADrZdwBVfY61tPITA0V2KWEthjIG1fi6g1wofNeFnb8/O/A7ouAl987cQ6uK1K6zd + ubX0Sp2zaSJ4JXcEXcdsmt+CJaKasWfgkaBCAqXnQ3PaHo4YdohLREkoielMECN07br7psNOYYlj + hAtpfTsPTT+Tyo1MwwDO5759mr5+YRkjjlp9tdO6cBvE7mkSL09BPPHN75TE7TO+B6ctzOoSSpur + qztm0wwphSWf6wYo6zfrTHvi+tVwNBa3A51KtO71R/sb5IKS2KhIL9snLiwHCI/xCuuM1q+KYa8x + HumrWv0n8OWb30N92UKvXShkrLezzepN4KZrNqU4UdpcknRhSiUy40MoJZiuxASlgiNqHGws9rAE + dicMoFqQ6A/cpCAqlCgz0HO43Q52MxlUQ0XNhMPO98rTyNPL9V6Mkj1912Zvt28LuxtZB7Y9qPuk + PHSON7Qx0qdnvL9gfpDeY7JhJ+Ez63zcXGnbFQ7Ng7Kit7QIU3pt+H4n232tp1lXSe0S45srDN9W + 9WZYVh2Naxj+OpvjrtP6B/GCVbJ10GXd67DuVdYAZRldz4UL0LW+WGDV/kxJyhnezAHaNMFCSHKr + Tc2hbpYPmmutIpFp66Wxsa+Sbn39Sl+/rq9/vz5zCJ1C7aHyBs8or7ySO4GDSuCgLnB4V+BVwUIs + 5/a+XRP6KLL3yYHyS8FFMezI0tEhURyk2+4mdeGRRmDZpX28W/v4pWrfI3ve/6/ZMzw6e04QxUly + aXh0Lj1BJF55kNVOy8ZZue0F5oswgFdGMK0FExaEKsJbzknNGa+qI9KOKhRS3PSiOWKcoIKqm+1g + AKv6dxyTgn3Yon6QpVAlqqp/M3H2xlZB9R/L7B9QSwMEFAAAAAgAAAA/ABj6RlSwBQAAUhsAABMA + AAB4bC90aGVtZS90aGVtZTEueG1s7VlNj9tEGL7zK0a+t44TO82umq022aSF7bar3bSox4k9sacZ + e6yZyW5zQ+0RCQlREBckbhwQUKmVuJRfs1AERepf4PVHkvFmss22iwC1OSSe8fN+f/gd5+q1BzFD + R0RIypO25VyuWYgkPg9oEratO4P+pZaFpMJJgBlPSNuaEmld2/rgKt5UEYkJAvJEbuK2FSmVbtq2 + 9GEby8s8JQncG3ERYwVLEdqBwMfANmZ2vVZr2jGmiYUSHAPX26MR9QkaZCytrRnzHoOvRMlsw2fi + 0M8l6hQ5Nhg72Y+cyi4T6AiztgVyAn48IA+UhRiWCm60rVr+seytq/aciKkVtBpdP/+UdCVBMK7n + dCIczgmdvrtxZWfOv17wX8b1er1uz5nzywHY98FSZwnr9ltOZ8ZTAxWXy7y7Na/mVvEa/8YSfqPT + 6XgbFXxjgXeX8K1a092uV/DuAu8t69/Z7nabFby3wDeX8P0rG023is9BEaPJeAmdxXMemTlkxNkN + I7wF8NYsARYoW8uugj5Rq3Itxve56AMgDy5WNEFqmpIR9gHXxfFQUJwJwJsEa3eKLV8ubWWykPQF + TVXb+ijFUBELyKvnP7x6/hS9ev7k5OGzk4c/nzx6dPLwJwPhDZyEOuHL7z7/65tP0J9Pv335+Esz + Xur433789NdfvjADlQ588dWT3589efH1Z398/9gA3xZ4qMMHNCYS3SLH6IDHYJtBABmK81EMIkwr + FDgCpAHYU1EFeGuKmQnXIVXn3RXQAEzA65P7FV0PIzFR1ADcjeIKcI9z1uHCaM5uJks3Z5KEZuFi + ouMOMD4yye6eCm1vkkImUxPLbkQqau4ziDYOSUIUyu7xMSEGsnuUVvy6R33BJR8pdI+iDqZGlwzo + UJmJbtAY4jI1KQihrvhm7y7qcGZiv0OOqkgoCMxMLAmruPE6nigcGzXGMdORN7GKTEoeToVfcbhU + EOmQMI56AZHSRHNbTCvq7mLoRMaw77FpXEUKRccm5E3MuY7c4eNuhOPUqDNNIh37oRxDimK0z5VR + CV6tkGwNccDJynDfpUSdr6zv0DAyJ0h2ZyLKrl3pvzFNzmrGjEI3ft+MZ/BteDSZSuJ0C16F+x82 + 3h08SfYJ5Pr7vvu+776LfXdVLa/bbRcN1tbn4pxfvHJIHlHGDtWUkZsyb80SlA76sJkvcqL5TJ5G + cFmKq+BCgfNrJLj6mKroMMIpiHFyCaEsWYcSpVzCScBayTs/TlIwPt/zZmdAQGO1x4Niu6GfDeds + 8lUodUGNjMG6whpX3k6YUwDXlOZ4ZmnemdJszZtQDQhnB3+nWS9EQ8ZgRoLM7wWDWVguPEQywgEp + Y+QYDXEaa7qt9XqvadI2Gm8nbZ0g6eLcFeK8C4hSbSlK9nI5sqS6QseglVf3LOTjtG2NYJKCyzgF + fjJrQJiFSdvyVWnKa4v5tMHmtHRqKw2uiEiFVDtYRgVVfmv26iRZ6F/33MwPF2OAoRutp0Wj5fyL + WtinQ0tGI+KrFTuLZXmPTxQRh1FwjIZsIg4w6O0W2RVQCc+M+mwhoELdMvGqlV9WwelXNGV1YJZG + uOxJLS32BTy/nuuQrzT17BW6v6EpjQs0xXt3TckyF8bWRpAfqGAMEBhlOdq2uFARhy6URtTvCxgc + clmgF4KyyFRCLHvfnOlKjhZ9q+BRNLkwUgc0RIJCp1ORIGRflXa+hplT15+vM0Zln5mrK9Pid0iO + CBtk1dvM7LdQNOsmpSNy3Omg2abqGob9//Dk466YfM4eDxaC3PPMIq7W9LVHwcbbqXDOR23dbHHd + W/tRm8LhA2Vf0Lip8Nlivh3wA4g+mk+UCBLxUqssv/nmEHRuacZlrP7ZMWoRgtaKeF/k8Kk5u7HC + 2WeLe3NnewZfe2e72l4uUVs7yOSrpT+e+PA+yN6Bg9KEKVm8TXoAR83u7C8D4GMvSLf+BlBLAwQU + AAAACAAAAD8A4kwwFSUBAABQAgAAEQAAAGRvY1Byb3BzL2NvcmUueG1snZLLasMwEEX3/QqjvS3L + 6QthO9CWrBooNKWhOyFNElHrgaTW8d9XthMngay6HN07Z+4MKud71SS/4Lw0ukIky1ECmhsh9bZC + H6tF+ogSH5gWrDEaKtSBR/P6puSWcuPgzRkLLkjwSQRpT7mt0C4ESzH2fAeK+Sw6dBQ3xikWYum2 + 2DL+zbaAizy/xwoCEyww3ANTOxHRASn4hLQ/rhkAgmNoQIEOHpOM4JM3gFP+asOgnDmVDJ2Fq9aj + OLn3Xk7Gtm2zdjZYY36C18vX92HVVOr+VBxQXQpOuQMWjKtLfF7EwzXMh2U88UaCeOqifuXtsMjY + ByKJAegY96h8zp5fVgtUF3lxm5I8LciKEHr3QPPZVz/yov8EVIch/yYeAWPuy09Q/wFQSwMEFAAA + AAgAAAA/ALLAMkd+AQAAGQMAABAAAABkb2NQcm9wcy9hcHAueG1snVLBTuswELzzFZHv1GmF0FPl + GKEC4sDTq9QAZ+NsGgvHtrzbqH1fj5OqIQVO5DQ7OxpPdlfc7FubdRDReFew+SxnGTjtK+O2BXsu + Hy7/sAxJuUpZ76BgB0B2Iy/EOvoAkQxglhwcFqwhCkvOUTfQKpyltkud2sdWUSrjlvu6NhruvN61 + 4Igv8vyaw57AVVBdhtGQHR2XHf3WtPK6z4cv5SEkPyluQ7BGK0o/Kf8aHT36mrL7vQYr+LQpktEG + 9C4aOshc8GkpNlpZWCVjWSuLIPgnIR5B9TNbKxNRio6WHWjyMUPzP01twbI3hdDHKVinolGO2FF2 + LAZsA1KUrz6+YwNAKPhIDnCqnWJzJeeDIIFzIR+DJHwesTRkAf/VaxXph8TzaeIhA5tkXO2QfJuu + JitjWt+3oKcnvzyy8m1QLk2Sj+jJuHd8DqW/UwSnuZ6TYtOoCFVaxTj3kRCPKWC0vX7VKLeF6qT5 + 3uiv4OV46XK+mOXpG5Z/4gT/PGr5AVBLAQIUAxQAAAAIAAAAPwBhXUk6TwEAAI8EAAATAAAAAAAA + AAAAAACAgQAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAhQDFAAAAAgAAAA/APKfSdrpAAAASwIA + AAsAAAAAAAAAAAAAAICBgAEAAF9yZWxzLy5yZWxzUEsBAhQDFAAAAAgAAAA/AER1W/DoAAAAuQIA + ABoAAAAAAAAAAAAAAICBkgIAAHhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzUEsBAhQDFAAAAAgA + AAA/AAZnk0XuAgAAEgkAABgAAAAAAAAAAAAAAICBsgMAAHhsL3dvcmtzaGVldHMvc2hlZXQxLnht + bFBLAQIUAxQAAAAIAAAAPwDvbfqrTwEAAC8CAAAPAAAAAAAAAAAAAACAgdYGAAB4bC93b3JrYm9v + ay54bWxQSwECFAMUAAAACAAAAD8AoR6gtroAAAAEAQAAFAAAAAAAAAAAAAAAgIFSCAAAeGwvc2hh + cmVkU3RyaW5ncy54bWxQSwECFAMUAAAACAAAAD8A5dtpMSwDAACoEQAADQAAAAAAAAAAAAAAgIE+ + CQAAeGwvc3R5bGVzLnhtbFBLAQIUAxQAAAAIAAAAPwAY+kZUsAUAAFIbAAATAAAAAAAAAAAAAACA + gZUMAAB4bC90aGVtZS90aGVtZTEueG1sUEsBAhQDFAAAAAgAAAA/AOJMMBUlAQAAUAIAABEAAAAA + AAAAAAAAAICBdhIAAGRvY1Byb3BzL2NvcmUueG1sUEsBAhQDFAAAAAgAAAA/ALLAMkd+AQAAGQMA + ABAAAAAAAAAAAAAAAICByhMAAGRvY1Byb3BzL2FwcC54bWxQSwUGAAAAAAoACgCAAgAAdhUAAAAA