From 5a2c2df5c56aabba971985807736ba3688192f3f Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 16 Oct 2023 11:30:42 -0800 Subject: [PATCH 001/193] Initial Commit --- image_services/opera/config/rtc_vv.json | 0 image_services/opera/make_opera_services.py | 303 ++++++++++++++++++++ 2 files changed, 303 insertions(+) create mode 100644 image_services/opera/config/rtc_vv.json create mode 100644 image_services/opera/make_opera_services.py diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json new file mode 100644 index 00000000..e69de29b diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py new file mode 100644 index 00000000..05f1a169 --- /dev/null +++ b/image_services/opera/make_opera_services.py @@ -0,0 +1,303 @@ +import argparse +import csv +import datetime +import json +import logging +import os +import subprocess +from pathlib import Path +from typing import List + +import arcpy +import boto3 +from osgeo import gdal, osr + +OPERA_BUCKET = 'TODO: ADD BUCKET' +OPERA_URL = 'TODO: ADD URL' + +gdal.UseExceptions() +gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'EMPTY_DIR') + + +def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: + rasters = [] + s3 = boto3.client('s3') + paginator = s3.get_paginator('list_objects_v2') + for page in paginator.paginate(Bucket=bucket, Prefix=prefix): + for obj in page['Contents']: + if obj['Key'].endswith(suffix): + rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') + return rasters + + +def get_pixel_type(data_type: str) -> int: + if data_type == 'Byte': + return 3 + if data_type == 'Float32': + return 9 + raise ValueError(f'Unsupported data type: {data_type}') + + +def get_projection(srs_wkt: str) -> str: + srs = osr.SpatialReference() + srs.ImportFromWkt(srs_wkt) + return srs.GetAttrValue('AUTHORITY', 1) + + +def remove_prefix(raster_path, prefix): + return raster_path[len(prefix):] + + +def get_raster_metadata(raster_path: str) -> dict: + assert raster_path.startswith(OPERA_BUCKET) + key = remove_prefix(raster_path, OPERA_BUCKET) + download_url = f'{OPERA_URL}_{key}' + + name = Path(raster_path).stem + tile, season, polarization, product_type = name.split('_') + polarization = polarization.upper() + tag = f'{product_type}_{polarization}' + + info = gdal.Info(raster_path, format='json') + return { + 'Raster': raster_path, + 'Name': name, + 'xMin': info['cornerCoordinates']['lowerLeft'][0], + 'yMin': info['cornerCoordinates']['lowerLeft'][1], + 'xMax': info['cornerCoordinates']['upperRight'][0], + 'yMax': info['cornerCoordinates']['upperRight'][1], + 'nRows': info['size'][1], + 'nCols': info['size'][0], + 'nBands': len(info['bands']), + 'PixelType': get_pixel_type(info['bands'][0]['type']), + 'SRS': get_projection(info['coordinateSystem']['wkt']), + 'Tag': tag, + 'GroupName': tag, + 'ProductType': product_type, + 'Polarization': polarization, + 'Tile': tile, + 'DownloadURL': download_url, + 'URLDisplay': name, + } + + +def update_csv(csv_file: str, rasters: List[str]): + if os.path.isfile(csv_file): + with open(csv_file) as f: + records = [record for record in csv.DictReader(f)] + else: + records = [] + logging.info(f'Found {len(records)} items in {csv_file}') + + existing_rasters = [record['Raster'] for record in records] + new_rasters = set(rasters) - set(existing_rasters) + + logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') + for raster in new_rasters: + record = get_raster_metadata(raster) + records.append(record) + + records = sorted(records, key=lambda x: x['Raster']) + with open(csv_file, 'w', newline='') as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) + writer.writeheader() + writer.writerows(records) + + +def calculate_overview_fields(mosaic_dataset, local_path): + # This function calculates custom attribute values for the overview record + print('Calculating field values for overview record') + ds = os.path.join(local_path, mosaic_dataset) + ds_cursor = arcpy.da.UpdateCursor(ds, ['Tag', 'MinPS', 'Category', 'StartDate', 'EndDate', 'GroupName', + 'Name', 'ProductType', 'Season', 'Polarization', 'Tile', 'DownloadURL', + 'URLDisplay']) + if ds_cursor is not None: + print('Updating Overview Field Values') + for row in ds_cursor: + if row[0] == 'Dataset': + _, ProdTypeOvField, PolOvField, SeasonOvCode, _, _, _ = row[6].split('_') + + try: + season = next(season for season in SEASONS if SEASONS[season]['SeasonCode'] == SeasonOvCode) + except StopIteration: + raise ValueError(f'Season code {SeasonOvCode} not recognized') + + TileOvField = 'Zoom in further to see specific tile information' + DLOvField = 'Zoom in further to access download link' + + row[0] = f'{ProdTypeOvField}_{PolOvField}_{SeasonOvCode}_Overview' + row[1] = 900 + row[2] = 2 + row[5] = f'{ProdTypeOvField}_{PolOvField}_{SeasonOvCode} Mosaic Overview' + row[7] = ProdTypeOvField + row[9] = PolOvField + row[10] = TileOvField + row[11] = DLOvField + row[12] = DLOvField + + ds_cursor.updateRow(row) + print('Overview fields updated') + del ds_cursor + + +def main(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s') + + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument('--working-directory', default=os.getcwd()) + parser.add_argument('config_file') + args = parser.parse_args() + + overview_path = '/vsis3/asf-gis-services/public/OPERA/' + template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' + + with open(args.config_file) as f: + config = json.load(f) + + csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') + + raster_function_template = ''.join([f'{template_directory / template};' + for template in config['raster_function_templates']]) + if config['default_raster_function_template'] != 'None': + default_raster_function_template = str(template_directory / config['default_raster_function_template']) + else: + default_raster_function_template = 'None' + + arcpy.env.parallelProcessingFactor = '75%' + + os.environ['AWS_PROFILE'] = 'edc-prod' + rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) + update_csv(csv_file, rasters) + + today = datetime.datetime.now(datetime.timezone.utc).strftime('%y%m%d_%H%M') + output_name = f'{config["project_name"]}_{config["dataset_name"]}_{today}' + overview_name = f'{output_name}_overview' + local_overview_filename = f'{overview_name}.crf' + s3_overview = f'{overview_path}{overview_name}.crf' + + try: + logging.info('Creating geodatabase') + geodatabase = arcpy.management.CreateFileGDB( + out_folder_path=args.working_directory, + out_name=f'{output_name}.gdb', + ) + + logging.info('Creating mosaic dataset') + mosaic_dataset = str(arcpy.management.CreateMosaicDataset( + in_workspace=geodatabase, + in_mosaicdataset_name=config['dataset_name'], + coordinate_system=3857, + )) + + logging.info(f'Adding source rasters to {mosaic_dataset}') + arcpy.management.AddRastersToMosaicDataset( + in_mosaic_dataset=mosaic_dataset, + raster_type='Table', + input_path=csv_file, + ) + + logging.info(f'Building raster footprints for {mosaic_dataset}') + arcpy.management.BuildFootprints( + in_mosaic_dataset=mosaic_dataset, + reset_footprint='NONE', + min_data_value=0, + max_data_value=4294967295, + approx_num_vertices=12, + update_boundary='UPDATE_BOUNDARY', + ) + + logging.info(f'Building {mosaic_dataset} dataset boundary') + arcpy.management.BuildBoundary( + in_mosaic_dataset=mosaic_dataset, + append_to_existing='OVERWRITE', + simplification_method='NONE', + ) + + logging.info(f'Setting properties for {mosaic_dataset}') + arcpy.management.SetMosaicDatasetProperties( + in_mosaic_dataset=mosaic_dataset, + rows_maximum_imagesize=5000, + columns_maximum_imagesize=5000, + allowed_compressions='JPEG;NONE;LZ77', + default_compression_type='JPEG', + JPEG_quality=80, + resampling_type='NEAREST', + LERC_Tolerance=0.01, + clip_to_footprints='CLIP', + clip_to_boundary='CLIP', + color_correction='NOT_APPLY', + footprints_may_contain_nodata='FOOTPRINTS_MAY_CONTAIN_NODATA', + allowed_mensuration_capabilities='BASIC', + default_mensuration_capabilities='BASIC', + allowed_mosaic_methods='Center;NorthWest;Nadir;LockRaster;ByAttribute;Seamline;None', + default_mosaic_method='ByAttribute', + order_field='StartDate', + order_base='1/1/2050 12:00:00 AM', + sorting_order='Ascending', + mosaic_operator='FIRST', + blend_width=10, + view_point_x=300, + view_point_y=300, + max_num_per_mosaic=50, + cell_size_tolerance=1.8, + cell_size=3, + metadata_level='BASIC', + transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;ZOrder;Dataset_ID;CenterX;' + 'CenterY;Tag;GroupName;StartDate;EndDate;ProductType;Season;Polarization;Tile;' + 'DownloadURL;URLDisplay', + use_time='DISABLED', + start_time_field='StartDate', + end_time_field='EndDate', + max_num_of_download_items=50, + max_num_of_records_returned=2000, + processing_templates=f'{raster_function_template}None', + default_processing_template=default_raster_function_template, + ) + + logging.info('Calculating cell size ranges') + arcpy.management.CalculateCellSizeRanges( + in_mosaic_dataset=mosaic_dataset, + do_compute_min='NO_MIN_CELL_SIZES', + do_compute_max='NO_MAX_CELL_SIZES', + max_range_factor=10, + cell_size_tolerance_factor=0.8, + update_missing_only='UPDATE_ALL', + ) + + logging.info(f'Calculating custom field values in {mosaic_dataset}') + arcpy.management.CalculateFields( + in_table=mosaic_dataset, + fields=[ + ['MaxPS', '910'], + ], + ) + + local_overview = os.path.join(os.getcwd(), local_overview_filename) + + logging.info(f'Generating {local_overview}') + with arcpy.EnvManager(cellSize=900): + arcpy.management.CopyRaster( + in_raster=mosaic_dataset, + out_rasterdataset=local_overview, + ) + + os.environ['AWS_PROFILE'] = 'hyp3' + logging.info(f'Moving CRF to {s3_overview}') + subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) + + logging.info('Adding overview to mosaic dataset') + arcpy.management.AddRastersToMosaicDataset( + in_mosaic_dataset=mosaic_dataset, + raster_type='Raster Dataset', + input_path=s3_overview, + ) + + calculate_overview_fields(mosaic_dataset, args.working_directory) + + except arcpy.ExecuteError: + logging.error(arcpy.GetMessages()) + raise + + +if __name__ == '__main__': + main() From e52cd9f92021478910f063df9d11e095391295cc Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 16 Oct 2023 13:01:49 -0800 Subject: [PATCH 002/193] Update with opera bucket --- image_services/opera/make_opera_services.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 05f1a169..49288cbe 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -12,9 +12,6 @@ import boto3 from osgeo import gdal, osr -OPERA_BUCKET = 'TODO: ADD BUCKET' -OPERA_URL = 'TODO: ADD URL' - gdal.UseExceptions() gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'EMPTY_DIR') @@ -48,10 +45,10 @@ def remove_prefix(raster_path, prefix): return raster_path[len(prefix):] -def get_raster_metadata(raster_path: str) -> dict: - assert raster_path.startswith(OPERA_BUCKET) - key = remove_prefix(raster_path, OPERA_BUCKET) - download_url = f'{OPERA_URL}_{key}' +def get_raster_metadata(raster_path: str, bucket: str) -> dict: + assert raster_path.startswith(f'/vsis3/{bucket}') + key = remove_prefix(raster_path, f'/vsis3/{bucket}') + download_url = f'https://{bucket}.s3.us-west-2.amazonaws.com/{key}' name = Path(raster_path).stem tile, season, polarization, product_type = name.split('_') @@ -81,7 +78,7 @@ def get_raster_metadata(raster_path: str) -> dict: } -def update_csv(csv_file: str, rasters: List[str]): +def update_csv(csv_file: str, rasters: List[str], bucket: str): if os.path.isfile(csv_file): with open(csv_file) as f: records = [record for record in csv.DictReader(f)] @@ -94,7 +91,7 @@ def update_csv(csv_file: str, rasters: List[str]): logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') for raster in new_rasters: - record = get_raster_metadata(raster) + record = get_raster_metadata(raster, bucket) records.append(record) records = sorted(records, key=lambda x: x['Raster']) @@ -148,7 +145,9 @@ def main(): parser.add_argument('config_file') args = parser.parse_args() + bucket = 'asf-cumulus-prod-opera-products' overview_path = '/vsis3/asf-gis-services/public/OPERA/' + template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' with open(args.config_file) as f: @@ -167,7 +166,7 @@ def main(): os.environ['AWS_PROFILE'] = 'edc-prod' rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) - update_csv(csv_file, rasters) + update_csv(csv_file, rasters, bucket) today = datetime.datetime.now(datetime.timezone.utc).strftime('%y%m%d_%H%M') output_name = f'{config["project_name"]}_{config["dataset_name"]}_{today}' From ed6b12a786d9a51f76dc09c0247c90df067074eb Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 16 Oct 2023 13:05:30 -0800 Subject: [PATCH 003/193] Add to dos/remove 'SEASON' --- image_services/opera/make_opera_services.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 49288cbe..b1ab2934 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -50,6 +50,7 @@ def get_raster_metadata(raster_path: str, bucket: str) -> dict: key = remove_prefix(raster_path, f'/vsis3/{bucket}') download_url = f'https://{bucket}.s3.us-west-2.amazonaws.com/{key}' + # TODO: FIGURE OUT NAMING AND WHAT'S NECESSARY/INCLUDED name = Path(raster_path).stem tile, season, polarization, product_type = name.split('_') polarization = polarization.upper() @@ -106,26 +107,21 @@ def calculate_overview_fields(mosaic_dataset, local_path): print('Calculating field values for overview record') ds = os.path.join(local_path, mosaic_dataset) ds_cursor = arcpy.da.UpdateCursor(ds, ['Tag', 'MinPS', 'Category', 'StartDate', 'EndDate', 'GroupName', - 'Name', 'ProductType', 'Season', 'Polarization', 'Tile', 'DownloadURL', + 'Name', 'ProductType', 'Polarization', 'Tile', 'DownloadURL', 'URLDisplay']) if ds_cursor is not None: print('Updating Overview Field Values') for row in ds_cursor: if row[0] == 'Dataset': - _, ProdTypeOvField, PolOvField, SeasonOvCode, _, _, _ = row[6].split('_') - - try: - season = next(season for season in SEASONS if SEASONS[season]['SeasonCode'] == SeasonOvCode) - except StopIteration: - raise ValueError(f'Season code {SeasonOvCode} not recognized') + _, ProdTypeOvField, PolOvField, _, _, _ = row[6].split('_') TileOvField = 'Zoom in further to see specific tile information' DLOvField = 'Zoom in further to access download link' - row[0] = f'{ProdTypeOvField}_{PolOvField}_{SeasonOvCode}_Overview' + row[0] = f'{ProdTypeOvField}_{PolOvField}__Overview' row[1] = 900 row[2] = 2 - row[5] = f'{ProdTypeOvField}_{PolOvField}_{SeasonOvCode} Mosaic Overview' + row[5] = f'{ProdTypeOvField}_{PolOvField} Mosaic Overview' row[7] = ProdTypeOvField row[9] = PolOvField row[10] = TileOvField From 88d013fc5fd705ab4e491588acea9ac4bdb8335c Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 16 Oct 2023 13:09:43 -0800 Subject: [PATCH 004/193] Started changelog updates --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cb3e6c1..8b147ca6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.6.6] +### Added +- Scripts to generate OPERA services using EDC-hosted source rasters in the `asf-cumulus-prod-opera-products` S3 bucket ## [0.6.5] ### Changed From fa0c77d428dfd9bfa9e6ca16e39f2b90b4e34684 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 18 Oct 2023 15:17:27 -0800 Subject: [PATCH 005/193] Add in first iteration of the OPERA service script and VV config --- image_services/opera/config/rtc_vv.json | 13 ++++++++ image_services/opera/make_opera_services.py | 36 +++++++-------------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index e69de29b..79d2ff52 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -0,0 +1,13 @@ +{ + "project_name": "OPERA", + "s3_prefix": "opera-rtc-image-service-prototype/VV", + "s3_suffix": "_VV.tif", + "dataset_name": "OPERA_TEST", + "raster_function_templates": [ + "Sentinel1_RTC_Power.rft.xml", + "Sentinel1_RTC_Amplitude.rft.xml", + "Sentinel1_RTC_dB.rft.xml", + "Sentinel1_RTC_dB_Stretch.rft.xml" + ], + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", +} diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index b1ab2934..99f340c6 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -45,21 +45,15 @@ def remove_prefix(raster_path, prefix): return raster_path[len(prefix):] -def get_raster_metadata(raster_path: str, bucket: str) -> dict: - assert raster_path.startswith(f'/vsis3/{bucket}') - key = remove_prefix(raster_path, f'/vsis3/{bucket}') - download_url = f'https://{bucket}.s3.us-west-2.amazonaws.com/{key}' - - # TODO: FIGURE OUT NAMING AND WHAT'S NECESSARY/INCLUDED - name = Path(raster_path).stem - tile, season, polarization, product_type = name.split('_') - polarization = polarization.upper() - tag = f'{product_type}_{polarization}' +def get_raster_metadata(raster_path: str) -> dict: + assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/VV/') + key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') + download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' info = gdal.Info(raster_path, format='json') return { - 'Raster': raster_path, - 'Name': name, + 'Raster': info['description'], + 'Name': Path(info['description']).stem, 'xMin': info['cornerCoordinates']['lowerLeft'][0], 'yMin': info['cornerCoordinates']['lowerLeft'][1], 'xMax': info['cornerCoordinates']['upperRight'][0], @@ -69,17 +63,11 @@ def get_raster_metadata(raster_path: str, bucket: str) -> dict: 'nBands': len(info['bands']), 'PixelType': get_pixel_type(info['bands'][0]['type']), 'SRS': get_projection(info['coordinateSystem']['wkt']), - 'Tag': tag, - 'GroupName': tag, - 'ProductType': product_type, - 'Polarization': polarization, - 'Tile': tile, 'DownloadURL': download_url, - 'URLDisplay': name, } -def update_csv(csv_file: str, rasters: List[str], bucket: str): +def update_csv(csv_file: str, rasters: List[str]): if os.path.isfile(csv_file): with open(csv_file) as f: records = [record for record in csv.DictReader(f)] @@ -92,7 +80,7 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str): logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') for raster in new_rasters: - record = get_raster_metadata(raster, bucket) + record = get_raster_metadata(raster) records.append(record) records = sorted(records, key=lambda x: x['Raster']) @@ -141,7 +129,7 @@ def main(): parser.add_argument('config_file') args = parser.parse_args() - bucket = 'asf-cumulus-prod-opera-products' + bucket = 'hyp3-testing' overview_path = '/vsis3/asf-gis-services/public/OPERA/' template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' @@ -160,9 +148,9 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' - os.environ['AWS_PROFILE'] = 'edc-prod' + os.environ['AWS_PROFILE'] = 'hyp3' rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) - update_csv(csv_file, rasters, bucket) + update_csv(csv_file, rasters) today = datetime.datetime.now(datetime.timezone.utc).strftime('%y%m%d_%H%M') output_name = f'{config["project_name"]}_{config["dataset_name"]}_{today}' @@ -287,8 +275,6 @@ def main(): input_path=s3_overview, ) - calculate_overview_fields(mosaic_dataset, args.working_directory) - except arcpy.ExecuteError: logging.error(arcpy.GetMessages()) raise From 9642a4ee6871c94f18d103437a965578f36802ee Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 18 Oct 2023 15:41:38 -0800 Subject: [PATCH 006/193] add in all service config files --- image_services/opera/config/rtc_hh.json | 13 +++++++++++++ image_services/opera/config/rtc_hv.json | 13 +++++++++++++ image_services/opera/config/rtc_vh.json | 13 +++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 image_services/opera/config/rtc_hh.json create mode 100644 image_services/opera/config/rtc_hv.json create mode 100644 image_services/opera/config/rtc_vh.json diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json new file mode 100644 index 00000000..44c421cf --- /dev/null +++ b/image_services/opera/config/rtc_hh.json @@ -0,0 +1,13 @@ +{ + "project_name": "OPERA", + "s3_prefix": "opera-rtc-image-service-prototype/HH", + "s3_suffix": "_HH.tif", + "dataset_name": "OPERA_TEST", + "raster_function_templates": [ + "Sentinel1_RTC_Power.rft.xml", + "Sentinel1_RTC_Amplitude.rft.xml", + "Sentinel1_RTC_dB.rft.xml", + "Sentinel1_RTC_dB_Stretch.rft.xml" + ], + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", +} diff --git a/image_services/opera/config/rtc_hv.json b/image_services/opera/config/rtc_hv.json new file mode 100644 index 00000000..6bb1e521 --- /dev/null +++ b/image_services/opera/config/rtc_hv.json @@ -0,0 +1,13 @@ +{ + "project_name": "OPERA", + "s3_prefix": "opera-rtc-image-service-prototype/HV", + "s3_suffix": "_HV.tif", + "dataset_name": "OPERA_TEST", + "raster_function_templates": [ + "Sentinel1_RTC_Power.rft.xml", + "Sentinel1_RTC_Amplitude.rft.xml", + "Sentinel1_RTC_dB.rft.xml", + "Sentinel1_RTC_dB_Stretch.rft.xml" + ], + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", +} diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json new file mode 100644 index 00000000..b883fc2c --- /dev/null +++ b/image_services/opera/config/rtc_vh.json @@ -0,0 +1,13 @@ +{ + "project_name": "OPERA", + "s3_prefix": "opera-rtc-image-service-prototype/VH", + "s3_suffix": "_VH.tif", + "dataset_name": "OPERA_TEST", + "raster_function_templates": [ + "Sentinel1_RTC_Power.rft.xml", + "Sentinel1_RTC_Amplitude.rft.xml", + "Sentinel1_RTC_dB.rft.xml", + "Sentinel1_RTC_dB_Stretch.rft.xml" + ], + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", +} From 885ccc463ea462d09b208a216871e742c719d615 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 18 Oct 2023 16:03:16 -0800 Subject: [PATCH 007/193] update transmission fields --- image_services/opera/make_opera_services.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 99f340c6..bb66f773 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -64,6 +64,8 @@ def get_raster_metadata(raster_path: str) -> dict: 'PixelType': get_pixel_type(info['bands'][0]['type']), 'SRS': get_projection(info['coordinateSystem']['wkt']), 'DownloadURL': download_url, + 'StartDate': name[36:38] + '/' + name[38:40] + '/' + name[32:36], + 'EndDate': name[36:38] + '/' + name[38:40] + '/' + name[32:36] } @@ -225,9 +227,8 @@ def main(): cell_size_tolerance=1.8, cell_size=3, metadata_level='BASIC', - transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;ZOrder;Dataset_ID;CenterX;' - 'CenterY;Tag;GroupName;StartDate;EndDate;ProductType;Season;Polarization;Tile;' - 'DownloadURL;URLDisplay', + transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;ZOrder;Dataset_ID;CenterX;CenterY;' + 'Tag;ProductName;GroupName;DownloadURL', use_time='DISABLED', start_time_field='StartDate', end_time_field='EndDate', From 8335354ca360a23ff2d789f0bcade1fe3fc4af19 Mon Sep 17 00:00:00 2001 From: jrsmale Date: Wed, 18 Oct 2023 16:17:12 -0800 Subject: [PATCH 008/193] Fix config files and add sample raster function template --- image_services/opera/config/rtc_hh.json | 5 +- image_services/opera/config/rtc_hv.json | 5 +- image_services/opera/config/rtc_vh.json | 5 +- image_services/opera/make_opera_services.py | 3 +- .../Sentinel1_RTC_dB_Stretch.rft.xml | 301 ++++++++++++++++++ 5 files changed, 306 insertions(+), 13 deletions(-) create mode 100644 image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index 44c421cf..3184d4e3 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -4,10 +4,7 @@ "s3_suffix": "_HH.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_Power.rft.xml", - "Sentinel1_RTC_Amplitude.rft.xml", - "Sentinel1_RTC_dB.rft.xml", "Sentinel1_RTC_dB_Stretch.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml" } diff --git a/image_services/opera/config/rtc_hv.json b/image_services/opera/config/rtc_hv.json index 6bb1e521..50fe9ce4 100644 --- a/image_services/opera/config/rtc_hv.json +++ b/image_services/opera/config/rtc_hv.json @@ -4,10 +4,7 @@ "s3_suffix": "_HV.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_Power.rft.xml", - "Sentinel1_RTC_Amplitude.rft.xml", - "Sentinel1_RTC_dB.rft.xml", "Sentinel1_RTC_dB_Stretch.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml" } diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index b883fc2c..1e17e268 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -4,10 +4,7 @@ "s3_suffix": "_VH.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_Power.rft.xml", - "Sentinel1_RTC_Amplitude.rft.xml", - "Sentinel1_RTC_dB.rft.xml", "Sentinel1_RTC_dB_Stretch.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml" } diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index bb66f773..7bf74081 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -50,10 +50,11 @@ def get_raster_metadata(raster_path: str) -> dict: key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' + name = Path(raster_path).stem info = gdal.Info(raster_path, format='json') return { 'Raster': info['description'], - 'Name': Path(info['description']).stem, + 'Name': name, 'xMin': info['cornerCoordinates']['lowerLeft'][0], 'yMin': info['cornerCoordinates']['lowerLeft'][1], 'xMax': info['cornerCoordinates']['upperRight'][0], diff --git a/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml b/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml new file mode 100644 index 00000000..b204e803 --- /dev/null +++ b/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml @@ -0,0 +1,301 @@ + + Sentinel-1 RTC dB Stretch + Sentinel-1 RTC data in dB scale with a stretch applied + + Stretch + Enhances an image by adjusting the range of values displayed. This does not alter the underlying + pixel values. If a pixel has a value outside of the specified range, it will appear as either the minimum or + maximum value. + + UNKNOWN + + + + Raster + StretchType + Min + Max + MinPercent + MaxPercent + NumberOfStandardDeviation + SigmoidStrengthLevel + EstimateStatsHistogram + DRA + Statistics + Histograms + ComputeGamma + UseGamma + Gamma + + + + Sentinel-1 RTC dB + Sentinel-1 RTC data in dB scale + + Calculator + Computes a raster from a raster based mathematical expression. + UNKNOWN + + + + Rasters + InputNames + Expression + CellsizeType + ExtentType + + + + Rasters + + + + Raster + + + true + + + + __IsRasterArray__ + + false + + + InputNames + + + in + + false + + + Expression + + 10*(Log10( in )) + false + + + CellsizeType + + 2 + false + + + ExtentType + + 1 + false + + + + Converts pixel values from power to dB scale. + 0 + + + + + + + + + MatchVariable + + MatchVariable + + 1 + false + + + + UnionDimension + + UnionDimension + + 0 + false + + + + + + + StretchType + + 0 + false + + + Min + + -25 + false + + + Max + + 0 + false + + + MinPercent + + 0.25 + false + + + MaxPercent + + 0.5 + false + + + NumberOfStandardDeviation + + 2 + false + + + SigmoidStrengthLevel + + 2 + false + + + EstimateStatsHistogram + + false + false + + + DRA + + false + false + + + Statistics + + + + -25 + 0 + -8 + -6 + 1 + 1 + + + + + false + + + Histograms + + + false + + + ComputeGamma + + false + false + + + UseGamma + + false + false + + + Gamma + + + false + + + + Converts pixel values from power to dB scale, and applies a min-max stretch from -25 to 0. + 0 + C:\Users\hjkristenson\Documents\ImageServer\Thumbnails\RTC_dB_Stretch.PNG + + + + + + data:image/bmp;base64,Qk3uNwEAAAAAADYAAAAoAAAAyAAAAIUAAAABABgAAAAAALg3AQAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zc3Nurq6u7u7sbGxzs7O1tbWxcXFq6urxsbGv7+/vLy8rKyswMDAwcHBs7Ozr6+vp6enrKysrq6up6enq6urq6urqqqqtbW1vLy8sLCw/f39mJiYycnJ1dXV5eXlz8/PxsbGy8vLTExMTk5OTU1NdnZ2c3NzZGRkY2NjYmJiWVlZVVVVTU1NUlJSVlZWVlZWVVVVTk5OXl5eWFhYUlJSWVlZXFxcYmJiY2NjZWVlXV1dW1tbaGhobm5ucnJycXFxf39/eXl5f39/goKCgICAhISEioqKioqKiYmJh4eHioqKjIyMiIiIgICAhYWFfX19fHx8gYGBfHx8f39/e3t7dnZ2cHBwdnZ2bW1tcnJyc3Nzc3NzbW1tcXFxbGxsdHR0e3t7dnZ2dnZ2fHx8dnZ2gICAcXFxeHh4enp6bGxscXFxZGRkbW1tZGRkZGRkYGBgXl5eX19fYGBgVlZWUVFRUVFRSUlJUFBQWFhYVVVVVFRUV1dXV1dXTExMXFxcSUlJUVFROzs7QUFBQEBAPz8/PDw8OTk5PDw8sbGx////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vLy8ra2trKyssrKypqamqqqqwsLCsbGxqKiovLy8urq6sLCwxsbGurq6u7u7pqamsbGx3Nzcvr6+ubm5v7+/ra2trq6uvb29uLi4x8fH////ysrK3d3d3t7ew8PDw8PDwMDAwMDAy8vLPz8/R0dHRkZGZ2dnampqYGBgYmJiXl5eXFxcTk5OVVVVTExMT09PUlJSVFRUUlJSVFRUXl5eVVVVTk5OV1dXYmJiZ2dnZGRkWFhYYWFhZmZmbGxscXFxdXV1d3d3d3d3eHh4enp6goKChYWFh4eHh4eHh4eHi4uLgICAi4uLiIiIfX19fHx8fHx8gICAenp6eXl5eHh4bW1tcXFxdnZ2eHh4dXV1bm5ucnJybW1tbW1tcHBwcnJycHBweHh4e3t7bW1teHh4d3d3cnJyenp6bm5uampqYmJiY2NjZWVlZmZmZWVlY2NjV1dXYWFhVlZWWFhYVlZWVFRUUFBQWVlZWlpaTk5OY2NjVVVVYGBgV1dXVlZWTExMUVFRRUVFPz8/UVFRPT09PDw8Pj4+PDw87Ozs////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6enpyMjIs7OztbW1oaGhuLi4vLy8xMTEra2tyMjIsrKyuLi41tbWr6+vurq6urq6ubm5vr6+v7+/v7+/0tLStLS01tbWv7+/v7+/uLi4yMjI////ubm54eHh7OzsysrKw8PDx8fHtLS0urq6wMDAj4+PQEBAODg4Xl5eX19fUVFRWFhYYGBgV1dXUFBQTk5ORkZGRUVFV1dXVlZWUFBQUVFRWlpaW1tbV1dXVVVVWVlZWlpaZmZmYWFhY2NjY2Njbm5ub29vcHBwfX19fn5+d3d3b29veXl5fX19i4uLeHh4enp6fX19fX19fX19eHh4fX19fHx8e3t7e3t7dnZ2fHx8enp6eHh4eHh4d3d3b29vdXV1cnJycnJycHBwdnZ2bm5udHR0ZmZmcnJya2trdXV1cXFxbW1tcXFxcnJyaWlpaWlpY2NjYGBgYmJiXl5eY2NjU1NTYWFhWlpaUFBQUVFRU1NTUFBQWlpaYWFhWVlZVVVVXFxcW1tbWVlZVVVVV1dXSUlJQUFBREREPDw8Q0NDSEhITk5OQ0ND////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zc3NzMzMv7+/t7e3wcHBwsLCwMDAx8fHvb29y8vLz8/Pt7e3qamptLS0wcHBu7u7u7u7s7Oztra2rq6urq6uvLy8r6+vvb29tLS0/f39////6OjomZmZ1dXV19fXv7+/qampvLy81dXVr6+vx8fH////09PTMzMzUFBQXV1dWFhYQkJCUVFRUlJSRkZGSUlJSkpKPz8/TU1NUVFRRkZGVFRUU1NTWVlZXV1dUlJSUVFRUlJSZmZmaWlpWlpaZGRkbm5ub29vcnJydnZ2enp6c3NzdnZ2cXFxb29ve3t7gICAcHBwc3NzcXFxb29venp6fHx8dHR0dHR0cHBwfHx8cnJycnJydHR0dnZ2bW1tdnZ2dnZ2cnJyeHh4c3Nzbm5ucXFxcXFxbW1tc3NzcHBwbm5udXV1cXFxbGxsampqc3NzaWlpZGRka2trU1NTY2NjVlZWXV1dV1dXV1dXWlpaUFBQTExMTU1NXl5eWFhYS0tLUVFRTU1NT09PWlpaXFxcS0tLS0tLTk5OTExMREREUVFRPz8/OTk5QUFB////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////t7e3vb29ysrKysrKtra2yMjIurq6tLS0sbGxs7OztLS0t7e3xcXF39/fqKioy8vLvb29t7e3uLi4uLi4z8/Pvb2909PT4+Pj39/f5+fn6Ojot7e3xMTE/v7+8vLy0dHRvb29xcXF1tbW1tbW6enp+vr69vb23d3dtbW1OTk5TExMUFBQPDw8RkZGSEhIRkZGQUFBR0dHR0dHQUFBRkZGRERETU1NVVVVVlZWTk5OU1NTWVlZTU1NW1tbYGBgaWlpa2traWlpaGhobm5uc3Nzb29vcnJyb29vcHBwa2trcnJyc3NzcnJydHR0aGhobGxsbm5uc3Nzd3d3dXV1dXV1eXl5eHh4enp6cHBwdXV1a2trbW1tZ2dnampqb29vbm5ua2trbm5ucHBwcHBwbGxsZWVlYWFhaWlpYWFheHh4Xl5eYWFhZmZma2trXV1dUlJSYmJiWlpaV1dXVVVVVVVVTU1NXFxcWVlZVlZWW1tbUVFRTk5OTExMTU1NUlJSUlJSTExMPz8/VFRUQUFBVlZWRkZGQEBARkZG7u7u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2dnZ0tLSsrKyx8fHvLy8t7e3ysrKxMTEuLi4urq6yMjIxMTEv7+/v7+/q6uro6OjxMTEsrKyvr6+vr6+qqqq09PT3d3dx8fHqqqq6urq2dnZuLi4paWlubm5ra2tvr6+wMDA8vLyn5+fsLCwvLy80dHR9vb2sbGxx8fHw8PDvr6+JiYmODg4RkZGLS0tS0tLTExMQ0NDUlJSQkJCPz8/ODg4RERER0dHSEhIVFRUTU1NUFBQVlZWV1dXT09PWFhYYmJiampqampqbm5ucXFxbGxsb29va2trZGRkaGhob29vcHBwcHBweXl5b29vbm5ubm5uZGRkdXV1cHBwcXFxdnZ2aWlpbW1tYWFhZ2dnZGRkZ2dnYWFhY2NjX19fbW1tdnZ2YmJibGxsbGxsY2Nja2trYWFhXV1dYGBgW1tbZGRkV1dXYGBgZGRkYGBgZGRkVlZWZWVlXl5eYGBgSUlJUlJSUlJSTExMUFBQT09PTExMTk5OUFBQVFRUW1tbTk5OWVlZT09PWFhYT09PUVFRRkZGUlJSQEBAQ0ND////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z8/PxsbGw8PDu7u7w8PD0NDQxMTEs7OzxsbGurq6ubm5vr6+ubm52dnZtLS0zMzMu7u7xcXFs7OzsLCwsbGxzMzMrq6utLS07Ozs4ODgzs7OuLi4urq6srKysLCwurq67Ozs////yMjIjY2Nr6+vwcHBubm509PT1NTUvLy8qamps7OzycnJOzs7MzMzLS0tLi4uNDQ0Q0NDVFRUPT09Ojo6PDw8PT09NDQ0SEhIUFBQR0dHSEhITExMVFRUTU1NS0tLXl5eXV1dZGRkaWlpZWVlZGRkY2NjaGhoaWlpcHBwbm5ucHBwc3NzeXl5Z2dna2trcnJyampqbm5uZ2dnZ2dna2trampqZ2dnYWFhXFxcaWlpX19fYmJiZGRkZWVla2traGhobGxsY2NjampqaGhoYWFhaGhoaWlpY2NjW1tbXl5eU1NTUlJSbm5uXFxcWVlZZmZmXl5eV1dXVVVVV1dXWlpaT09PT09PVlZWWFhYSkpKRUVFV1dXV1dXWVlZREREQEBASkpKUFBQT09PUlJSRERESUlJUVFR////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yMjIurq6ra2tsLCwxcXFu7u7vLy8xMTEvLy8xsbGwMDAvb29vLy8t7e3srKyvLy8vb29u7u7sLCwqKio7+/vurq6qqqq2NjYzc3Ntra2vLy8t7e3uLi4srKyra2tu7u74ODg4uLizMzMq6urs7Ozs7Ozurq6yMjIw8PDwMDAsLCwrKyspKSksLCwx8fHKysrLy8vKysrJCQkPz8/Q0NDPj4+Nzc3MjIyLy8vLS0tPT09SEhIPz8/Pz8/QEBATU1NSUlJRkZGVVVVYGBgYWFhXV1dXV1dX19fXFxcXFxcVlZWa2trcXFxe3t7paWlc3NzampqbW1tb29vb29vaGhoZWVlYmJiXl5eYmJiXV1dY2NjWlpaX19fV1dXZWVlYmJiZGRkYmJibW1taGhoX19fXV1dW1tbYmJiVVVVZWVlWVlZWVlZYWFhX19fVlZWZWVlYGBgV1dXXl5eVFRUYWFhW1tbWVlZVFRUXFxcT09PRkZGUlJSSUlJWFhYUFBQUFBQUlJSU1NTRERER0dHRkZGT09PREREPj4+iIiI////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXFu7u7wsLCzMzMtra25eXlubm5urq6vr6+sbGxwMDArq6uu7u7xMTEycnJwsLCvLy8xMTEx8fH5ubm5ubmvr6+wsLC8fHxs7OzycnJs7OzyMjIwcHBra2tycnJyMjI5eXltbW13NzcycnJr6+vw8PDsrKyoqKitbW1rq6up6enpKSknZ2dlJSUurq6wsLCvb29fn5+GRkZGxsbOzs7Pz8/ODg4MjIyJSUlJSUlKysrNjY2PDw8PDw8QEBASkpKVVVVUlJSQkJCPT09V1dXWVlZWVlZV1dXS0tLTk5OVVVVUFBQYGBgcHBwdXV1dHR0ampqYGBga2trXl5ebW1taWlpZGRkYWFhXFxcXl5eVFRUW1tbXl5eV1dXWVlZWVlZXl5eampqaWlpZGRkZGRkYGBgbm5uYWFhYGBgZGRkUlJSW1tbVFRUXFxcV1dXVFRUW1tbU1NTU1NTYGBgZGRkUFBQU1NTVFRUU1NTTk5OW1tbQ0NDSEhITU1NSkpKTk5OS0tLQ0NDT09PT09PRUVFSEhISEhIRkZGx8fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2dnZubm5r6+v0dHRvLy80NDQ2traysrKzs7O5OTksrKyurq6ubm5urq62dnZsbGxvr6+5ubm6Ojo6urq3t7eysrK0NDQ09PT5eXlvb29uLi4ra2tu7u7wsLCtbW1uLi4s7OzsrKy3t7e2NjYxMTEy8vLvb29ubm5qqqqt7e3ra2ts7OzoKCgpKSktra2pqamvb29qKiotLS0vb29ycnJbW1tODg4MDAwMTExMzMzHR0dGhoaHR0dRUVFODg4Ly8vPj4+OTk5TExMW1tbUVFRR0dHRkZGWFhYTk5OUFBQV1dXVlZWTk5OV1dXXV1dbW1tampqcHBwZ2dnWVlZTk5OV1dXVlZWYWFhZGRkaWlpY2NjW1tbYWFhT09PWlpaW1tbT09PW1tbXV1daGhoWVlZaGhoWVlZZGRkXFxcWVlZY2NjXV1dU1NTXl5eT09PVVVVWFhYVlZWWlpaXl5eXFxcVlZWS0tLWVlZS0tLTk5OUFBQUVFRTExMQkJCUlJSUFBQR0dHQEBAQ0NDRUVFQkJCQ0NDQ0NDOjo6Tk5O////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wcHBwMDA2dnZvLy82traq6urw8PDxcXFvb29ysrKvr6+xsbGwcHBpaWltLS0qqqqx8fH2tra4eHh4ODg09PTvLy8srKyzMzM7OzswcHBt7e3s7Ozvb29vLy8wsLCx8fHxcXFxcXFz8/P2trawcHBxcXFy8vLubm5ubm5urq6paWltLS0z8/P0dHRt7e3u7u7wMDAra2ttra2wcHBycnJ0tLSurq6zMzMyMjIpKSkQkJCICAgFxcXHx8fLS0tLi4uMzMzKioqQEBAQUFBPz8/SEhIREREPT09SEhIVVVVU1NTTExMQ0NDQkJCVFRUV1dXZGRkbW1ta2trZWVlX19fQkJCZ2dnurq6VlZWXFxcVFRUWlpaVlZWU1NTWlpaWFhYTk5OVFRUUlJSWVlZW1tbY2NjYmJiXFxcZWVlWlpaYmJiWFhYY2NjWVlZV1dXUVFRWFhYXl5eWlpaVFRUWFhYU1NTVFRUT09PWVlZWVlZVFRUR0dHRUVFQ0NDUlJSPT09S0tLSkpKOjo6QEBAQ0NDRERETk5OQ0NDTk5O////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////uLi4wsLCurq6tbW1vLy8zc3NxMTEt7e3v7+/u7u7qampq6urq6urtbW1w8PDubm5w8PD5ubmtra2vb29urq6vLy8ycnJ6enp3Nzcu7u7urq609PTxsbGuLi4sLCw7u7uvr6+uLi42dnZvr6+ysrKtLS0srKyt7e31dXVw8PDy8vLzs7Ourq6xcXF1dXVwsLCzs7O09PTwsLCwMDAu7u7qqqqyMjIxMTEtLS0paWlt7e3sLCwuLi4xcXFnZ2dHBwcHh4eMzMzJCQkIiIiPj4+Ozs7UVFRREREMTExODg4QUFBQUFBPT09OTk5Ojo6Pz8/UVFRUVFRYGBgXV1dWVlZVFRU0tLS19fXWFhYRERETk5OVlZWXV1dSkpKTU1NT09PU1NTT09PT09PUlJSV1dXSEhITExMW1tbUFBQZGRkXV1dWVlZWVlZYmJiXFxcWVlZTU1NUVFRUVFRVFRUWFhYUlJSVFRUUlJSVFRUTk5OV1dXSUlJT09PTExMR0dHS0tLS0tLR0dHQkJCPz8/RkZGPT09Q0NDNDQ0Pj4+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ubm5tLS0v7+/vb29w8PD3d3dsrKyvr6+q6ursrKysbGxubm5rKysq6urwcHBwcHB4+Pj09PTrq6upKSkuLi4vr6+v7+/3d3d4eHhwcHBzs7Ov7+/wMDAubm5srKytra2paWltra2vr6+ycnJsbGxp6en5+fn4ODgurq6urq6t7e3tra2sbGxuLi4wsLC1NTUnJycxcXFx8fH19fXvr6+3NzcvLy8v7+/wsLCsrKyvb29qKiolZWVq6ursrKyx8fHzc3N1NTUzc3NsrKyXV1dQUFBNTU1JiYmNTU1KSkpKSkpJSUlKSkpJiYmKysrKCgoHx8fKioqSEhIioqKyMjIYmJiVVVVPz8/qqqqVFRUS0tLUFBQRUVFSUlJT09PWlpaS0tLUFBQUlJSR0dHSEhIUFBQSkpKUlJSTk5OZGRkVFRUX19fVlZWTk5OV1dXWlpaVFRUXV1dYGBgW1tbX19fV1dXZGRkXV1dW1tbWFhYU1NTTk5OTExMUFBQTExMSEhIQ0NDOzs7QUFBSUlJQkJCPz8/Tk5OSEhITExM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ycnJx8fHw8PDw8PD4eHhubm5r6+vvLy8sLCwtbW1u7u7r6+vtra2pKSk2dnZ5ubmw8PDtbW1xMTEtbW1tbW12tra19fXxMTEtbW1ycnJurq6vb29ysrKra2trq6uu7u7rq6uurq6xMTEsrKywcHBra2tuLi4wcHB4eHhsrKyvb29n5+frKysu7u7w8PDrq6uw8PDwcHBrq6uysrKx8fH4uLi1dXVxsbGw8PDubm5urq6urq6ubm5rq6uo6OjwMDArKysq6urubm5p6env7+/sbGxvb29wsLCzs7O0dHRwcHBwcHBm5ubtbW1ra2tqKio2dnZysrKqKiowcHBx8fH0NDQtbW1YGBgPDw8oqKiTk5OVFRUTk5ORUVFQUFBTExMT09PREREQEBARUVFSUlJPDw8SUlJT09PSkpKW1tbW1tbU1NTXl5eU1NTVFRUU1NTVlZWU1NTV1dXUlJSXFxcXFxcWlpaWFhYY2NjSkpKWlpaVlZWVVVVW1tbTk5OSkpKUlJSRUVFR0dHS0tLRUVFSUlJR0dHTk5OQUFB////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yMjIv7+/vb29ysrKxMTEsrKyrKysurq6v7+/vr6+wcHBra2tu7u72NjY6Ojorq6u3d3dwMDAwMDAp6enxcXF4eHhw8PDrKys19fXvb29wsLCubm5ra2tvr6+ubm5rq6urq6uqqqqv7+/zMzMzMzMy8vLvr6+sLCw2NjYm5ubvr6+zMzMrKysubm5wMDAwcHBtra2s7Ozt7e3xsbG4ODgzs7O3Nzc6+vr5ubmx8fHsbGxsrKyoaGhoqKitLS0wsLCzc3N0NDQycnJpqamtra2srKyr6+vwsLCvLy8uLi4zs7Ozc3Ntra2nZ2dnJycp6enwcHBzc3Nurq6s7OzsLCw0dHRurq6qKiodXV1LCwsUlJSTU1NTExMTk5OSkpKQkJCT09PRUVFQUFBRERENzc3ODg4MzMzPDw8MzMzT09PRkZGOjo6SEhIUlJSVFRUT09PUVFRT09PVVVVVlZWUVFRU1NTQUFBVVVVU1NTUFBQVVVVXFxcUlJSS0tLWFhYR0dHSEhIS0tLRkZGPz8/SkpKTk5ORkZGRUVFQUFB////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6OjowcHBx8fHubm54ODgvb29vLy8v7+/pqamsLCwsrKysbGxsLCw4ODg6+vru7u78PDwvb292NjYtLS0sLCwvb291tbW4ODgzs7O7e3tuLi4ubm5u7u7tbW1tra2zc3Nw8PDqqqqpKSksbGxnp6evb29uLi4n5+fxcXFubm5rq6uxsbGrq6us7Ozvr6+ysrKvb29srKyt7e3vb29u7u7sbGxqqqq09PT1NTU4ODg4ODgu7u7q6urtra2vb29uLi4v7+/rq6urq6utLS03t7e0dHRwcHBrq6ut7e3s7Oz0dHRwMDA7u7ura2tr6+vpKSksLCwsrKytbW1s7Ozubm5tLS0qampsLCww8PDmpqaLi4uBQUFQUFBPz8/SUlJQ0NDOjo6QUFBPDw8PDw8QkJCOjo6TExMMTExPj4+Ojo6RkZGS0tLQkJCRkZGQEBAOzs7TExMWFhYTExMT09PVFRUUFBQUlJSU1NTPz8/SEhIWVlZT09PUFBQUlJSUlJSVVVVREREQ0NDT09PQ0NDQkJCRkZGSEhIU1NTSEhINjY2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tra2w8PDurq62NjYw8PDtbW1tLS0pKSkwMDAu7u7v7+/vLy8tLS019fX9PT05eXlxMTEtra2vb29vb29rq6uubm50dHRyMjIzMzMycnJvr6+r6+vsLCwrKysurq6urq6paWlrKysoaGhqqqqqqqqpaWloqKip6ens7Ozu7u7pKSktbW1rKysr6+vs7Ozvb29rq6utbW1r6+vwMDAra2tqamppaWluLi4wMDAz8/Pzc3NqKiov7+/srKysLCwpaWlsbGxvr6+oKCgycnJtra2pKSkoqKip6enuLi4v7+/tLS0xsbGzc3Nra2ts7Ozr6+vy8vLtLS0srKypKSkpKSktra2srKyoaGhoaGhrq6uLCwsDg4OsbGxNjY2Pz8/QkJCT09PODg4PDw8Nzc3QEBAPj4+Ozs7SUlJPz8/Ozs7S0tLSkpKTExMQ0NDREREODg4PT09ODg4SUlJQ0NDSkpKVVVVUVFRVFRUS0tLR0dHT09PUVFRS0tLVVVVTExMRERERUVFSkpKR0dHQUFBTk5OQEBAQ0NDNjY2PT095ubm////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ubm5u7u7uLi4vb29qqqqpaWlsLCwubm5t7e3wMDAtLS0tbW1ubm55ubm5+fnurq6tbW1vb29w8PDs7Oztra2xcXFtra25OTk6OjoyMjIu7u7tra2tra2sLCwvLy8ubm5r6+vs7Ozr6+vrKysvr6+qamppKSkpqamtLS0q6urt7e3ra2tsLCwqampr6+vtra2ra2twsLCvLy8xsbGoaGhp6enwMDAu7u70NDQuLi4ycnJzc3NpqampaWlwsLCzc3Nt7e3ra2toqKimpqam5uboqKisbGxqqqqt7e3wcHBwsLCzc3Nr6+vxsbGsLCwuLi4rKyspqamv7+/srKyqKionJyck5OTnJycj4+PmpqapKSkAQEBoqKidXV1NjY2MTExRkZGQEBAPj4+MzMzLS0tNjY2KysrOjo6Pj4+RUVFPDw8PDw8PT09Q0NDMTExPDw8NTU1Nzc3Nzc3RkZGSkpKUFBQR0dHTk5OVFRUTU1NQEBASEhITk5ORUVFRkZGTExMTExMRERET09PUFBQTU1NUlJSREREPT09QkJC////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zc3NysrKvb29sbGxt7e3u7u7xsbGsbGxqamppKSksbGxubm5zMzM4eHh4uLi6urqsLCwra2twsLCzc3NtbW1zc3Nra2t2tras7Oz4uLi09PTpaWlubm5srKytbW1qKiora2tq6ursLCws7Ozrq6uuLi4s7Ozra2tuLi4q6urwsLCqamps7Ozs7OzycnJxcXFt7e3rKysu7u7wsLCu7u7q6ur4eHh19fXubm5tLS0wMDA2NjY1tbWqqqqsbGxtLS0paWlr6+vqKiompqaoqKioKCgqKioycnJra2tqampp6enpKSknZ2drq6uuLi4v7+/ycnJr6+vuLi4q6urqqqqrq6un5+fgoKCgICAjo6Ol5eXQEBAqKiolZWVMjIyOjo6NDQ0Ozs7QEBAPj4+Li4uKCgoMDAwKysrLS0tOTk5Ly8vPj4+MzMzNzc3JCQkLi4uR0dHNzc3NDQ0RERERkZGRkZGUVFRR0dHV1dXWlpaXFxcUVFRU1NTTExMRkZGPj4+RkZGSkpKRUVFS0tLRkZGTU1NRERESkpKQUFB////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7u7zs7Os7OzvLy8urq60tLSx8fH6Ojor6+vs7Ozr6+vuLi42dnZ4+Pjzs7O3Nzc7u7u7+/vq6urysrKurq6s7OzrKysr6+vpqamycnJsLCw5+fn4+Pj2tratLS009PTvb292tra4ODgsrKyuLi41dXV2dnZtLS0sbGxra2tsLCwnp6er6+vsbGxrq6uurq6vb29zc3Nr6+vzc3Nvb296urq4ODgsrKysLCwsrKyw8PDvLy8w8PDs7Ozra2tsrKys7OzsrKyp6enpKSkpqamw8PDurq6urq6tra2ubm5urq6s7Oztra2rKysra2tq6urvb29q6ururq6tbW1paWlsrKytLS0s7OzlZWVlJSUqampxcXFgYGBvr6+vLy8bW1tPT09Li4uNTU1NjY2PDw8ODg4MTExNDQ0MDAwOTk5Ly8vKioqNTU1KysrKysrLy8vODg4RkZGNjY2NTU1Ozs7QkJCOzs7ODg4RUVFSEhITExMUVFRTExMS0tLS0tLRUVFR0dHRkZGQkJCRUVFTk5OSUlJRERER0dHODg4SUlJ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////srKyt7e3nZ2dr6+vsLCwoqKit7e3w8PDvb29u7u7rKyssbGxtra2xMTE2dnZ2dnZ0tLStra21tbW2dnZtra2vr6+rKyst7e3ysrKu7u7vLy8xsbG39/fwMDAwcHBqqqqubm5paWlrq6us7OzvLy8xMTEx8fHuLi40tLSrq6utbW1tbW1ra2tsLCws7OzwcHBtbW1tbW11tbWv7+/wcHB09PT1NTUurq6uLi4wMDAzs7OsLCwqampyMjIqampqKion5+fsLCwtra2qampp6en2traubm5paWloaGhtra2ubm5x8fHvb29tra2vr6+m5ubq6urx8fHtLS0tLS0s7Ozvb29tbW1q6uro6Ojl5eXk5OTfX194eHhxMTExsbGdHR0Pz8/JiYmKioqLS0tKCgoJCQkOTk5MzMzREREQkJCJiYmODg4Nzc3KysrMzMzIyMjNTU1MDAwPz8/NjY2ODg4REREREREQUFBQ0NDR0dHQkJCQUFBQEBASEhIQEBASEhIRkZGRkZGUVFRQkJCTk5OU1NTT09PTExMQ0ND////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ycnJ19fX2dnZvr6+tLS0srKyu7u7zc3NwsLCwMDAvb29tLS0ysrK6+vrycnJ3d3d1NTUwcHBu7u7ubm5t7e3nJycrKysuLi4rq6uq6urw8PD0dHR7OzsxcXFtra2ra2tra2tvb29s7Ozqampu7u7tra2xsbGyMjIvb29vb29xMTEysrKsbGxuLi4tra2yMjIu7u739/fuLi4vb29tra2xsbGzMzMurq6vr6+oKCgvb29yMjIxcXFyMjIlZWVwcHBqampxMTEyMjI4eHh3t7e1dXVqqqqtbW1x8fHra2tqqqqoKCgtLS0ra2trq6uqqqqpKSkt7e3t7e3q6urvb2909PTn5+fv7+/sLCwu7u7s7OzCwsLlJSUwsLCtbW1ubm5vb29GBgYIyMjJCQkICAgIiIiJSUlPj4+JiYmMzMzODg4Pz8/QEBANzc3Ojo6QkJCJCQkLCwsNDQ0Nzc3MzMzNDQ0Ojo6LS0tQEBAQkJCQEBAOjo6QUFBQUFBQUFBNTU1Pz8/Pj4+Q0NDTk5OU1NTVVVVUFBQUVFRT09P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v7vb294uLiw8PDwMDAwMDAtLS0q6urtra2r6+vwsLCubm5wcHB4eHh3t7ey8vL3d3dzMzMq6ur6enpt7e3t7e3srKyq6urwMDAubm5qampsrKy1dXV1tbW0NDQ5OTkysrK3NzcsrKyra2tqKiotLS0tra2vLy8q6urq6uruLi4vr6+r6+vr6+vsrKyrq6uurq6x8fHtLS0r6+vtra2tLS0vr6+0tLSra2turq6tbW1rKysv7+/3t7erq6uqampz8/P6Ojo0NDQsLCwrq6uubm519fXp6enqampo6Ojp6enqampwsLCnZ2dpKSkq6urrq6uw8PDv7+/xMTEubm5vb29xsbGwcHBxsbGpaWlvr6+mZmZ5ubmvLy8v7+/wsLCwcHBkpKSVVVVHBwcJiYmHh4eHBwcJiYmIyMjLy8vMTExJiYmMjIyODg4Nzc3PT09NjY2NTU1PT09Li4uLS0tKCgoOzs7ODg4Pj4+NDQ0Nzc3Pz8/Pz8/PT09QUFBNDQ0Pj4+Ojo6PT09OTk5RERESUlJS0tLTU1NSUlJQkJC////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+vr6/f399PT0zs7Ora2t5OTkxsbGxsbGyMjItbW1qqqqqamp1NTU19fXra2tyMjIurq6q6urqampqqqqtLS0t7e3urq629vbtbW1vLy8tLS01NTUwsLCr6+vq6urra2t2trax8fHqKiot7e3ra2trKysurq6paWluLi409PTra2trKysqqqqysrKsrKyr6+vsLCwubm5ra2txMTEtLS0r6+vz8/PxcXFuLi4q6urqKioq6urr6+v8fHxvb29s7Ozrq6uqqqqqampzc3NsbGxo6OjpKSktra2ycnJt7e3pqamn5+fnp6eqKiopKSkra2tqampnZ2dqqqqqqqqtra2vr6+s7OzxMTEu7u7pqamu7u7sbGx/Pz8tra2tra2t7e3w8PDxsbGk5OThYWFFxcXHh4eGBgYICAgJSUlGRkZISEhKSkpNzc3Li4uJiYmJSUlKysrIiIiPT09JycnLCwsHBwcODg4KioqOTk5Li4uOjo6PT09MDAwSEhIPDw8RERELy8vNjY2QkJCQ0NDQEBAOzs7NTU1SUlJS0tLcnJy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tra24uLiv7+/ubm5u7u7vLy8zs7OycnJrq6usLCwnZ2ds7OzrKysurq6y8vLu7u7wcHBs7OznJycsrKy0tLSubm5t7e3lpaWiYmJvb29vb29zc3NtbW1sbGxrq6uwcHBtra2uLi4u7u7m5ubq6urq6urqKiorq6utLS0vb2909PTsLCwlpaWqamprq6urKysqamptLS0ra2tvb29q6urvb29s7Ozvb29tLS0sLCwrq6usbGx/f39/v7+u7u7sLCwsrKyrKysu7u7p6ensrKyqqqqq6ursbGxr6+vo6Ojpqamo6Ojo6OjsbGxqampvLy8qKiora2tp6enra2toaGhr6+vt7e3v7+/xsbGysrKx8fHqKio8/Pz3Nzcvr6+2NjY3d3dv7+/1dXVtra2nJycFxcXFRUVHR0dHx8fFRUVHx8fIiIiLy8vMDAwLCwsLS0tKysrHh4eIyMjLCwsNjY2KCgoLS0tLCwsHx8fISEhLi4uLi4uMjIyPDw8Ojo6MDAwOjo6Ly8vS0tLLi4uMjIyQkJCPj4+Pz8/QkJC////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Pj4vLy8zc3NvLy8ysrKxMTEtLS0qamps7Ozq6urtra2ubm5xMTE4+PjwMDAwcHBw8PDrKysm5ubxsbGubm5oaGhra2tqamppKSkr6+vuLi4rKyssrKyqqqqtbW1ycnJkpKSr6+vxcXFtra2xcXFqampuLi4s7Ozr6+vsLCwmpqaqamppaWlpqamoKCgs7OzoaGhvr6+t7e3vb29wsLCvLy8tbW1s7Ozt7e3wsLC6urq/f39/f39////4ODg8vLy19fXr6+vs7Ozt7e3p6en09PTrq6uoKCgn5+fp6enpKSkp6ensbGx6urqubm5tbW1s7OzysrKoqKiu7u7ubm5mZmZpqamvb29wMDAx8fHt7e3tbW1n5+f5ubm5eXlzMzM0dHR////s7Ozz8/PnJycsLCwlpaWHh4eHh4eKysrJiYmKysrJiYmPDw8Ozs7Nzc3LCwsIyMjJCQkLy8vJCQkJSUlOzs7Li4uQkJCJSUlFRUVMTExIyMjLy8vNTU1Q0NDMjIyOzs7NTU1QUFBOTk5QkJCNDQ0PDw8RkZGR0dH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////rKys+Pj4vb29q6urp6enrq6upaWl9/f3tra2z8/P0dHR39/f2traxcXFysrKrq6uvb29s7Ozra2tvLy8oaGhrKysxMTEuLi4sbGxr6+vubm55OTktbW1sbGxtbW1vLy8qKiovr6+1tbWy8vL0tLSp6entbW1ubm5qKior6+vsLCwq6ursbGxsrKysbGxubm5zMzMqampsbGxu7u7urq6sLCwurq6mZmZv7+/////srKyrKysxMTEwsLCx8fH2dnZr6+vMTExJycnQEBAt7e3qKioqKiotLS0paWlpKSkpqams7Ozvr6+wsLCrKyso6OjqKiozMzMp6enrKysyMjIubm5tbW1pqamtra2s7OzzMzMx8fHsrKyn5+fysrKhoaGzs7OyMjIu7u7sLCwxMTEtra2r6+vv7+/BQUFDw8PEhISKioqMDAwLy8vMjIyMDAwLS0tJCQkKCgoJCQkKysrFxcXOTk5NTU1Ojo6RERELCwsICAgFhYWISEhOjo6MjIyOjo6PDw8Ojo6REREPj4+Pz8/KysrPj4+QUFBQkJC////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////t7e3vLy8tLS0urq6tbW1m5ubvb29t7e3yMjIy8vLy8vLyMjIrKysyMjIxsbG7+/vtbW1srKywsLClJSUq6urqampysrKvb29tra25+fnsLCwrq6utLS0sbGxzMzMsrKyr6+vs7Ozr6+vwsLCubm50dHRubm53NzcqqqqsLCwsbGxqKiosbGxp6enq6urzMzMtra2np6etra2t7e3wsLCyMjIr6+v3t7evr6+////tLS0sbGxq6urs7OzuLi4wMDAJiYmHBwcMTEx7u7u1tbW1dXVzs7Ora2ttra2t7e3rq6uurq6s7Oztra2o6Ojv7+/ubm5pKSkqqqqsLCwra2tx8fHoqKiqampsLCwz8/PW1tbYWFhlZWVy8vL0NDQyMjIuLi4v7+/u7u7oqKitbW18/Pz0NDQqampnp6ePDw8AQEBAQEBAAAAFxcXJCQkJiYmGRkZICAgHR0dJiYmHBwcGBgYJSUlGxsbHR0dICAgMzMzJSUlJSUlICAgLS0tNDQ0NjY2Ozs7SkpKPDw8QUFBPz8/MDAwPj4+PT096enp////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wMDAubm5ubm5xcXFurq6urq6vLy8vb29wsLCtra2oqKira2trq6uxMTEvb29uLi4pqamu7u7vb29u7u7rq6uzc3Nurq6sLCwu7u7tLS039/fvLy8uLi4qKior6+vsLCwtra2rq6uurq6zs7O5OTkzc3NwsLC09PTu7u7s7OzrKystLS0sLCws7Ozqqqqr6+vtLS0sbGx1dXVurq6zs7Os7Ozubm5v7+/zc3N9vb2ycnJra2tsLCwu7u7urq6qqqqsLCwvb29s7Oz5eXl7u7urKyswcHBtLS0paWlq6ury8vLvr6+sbGxsLCwrq6uv7+/4ODgvr6+paWlqampuLi4t7e3mZmZt7e3rq6u3d3ds7OzxsbGoqKiwMDAxcXF5+fnvLy8tbW1ubm5sbGxq6urqqqqtbW1s7Ozu7u7wcHBeXl5CgoKAAAAAQEBAAAAHBwcDg4OBgYGExMTDAwMGBgYEhISCwsLHR0dHx8fFxcXIyMjJSUlGxsbHx8fJCQkMDAwHR0dMTExPj4+Li4uNDQ0NTU1MzMzMTExOjo6////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ysrKwMDAq6urxMTEx8fHv7+/1NTUxsbGvr6+xcXFx8fHt7e3w8PDv7+/uLi4r6+vsrKysbGxtra2sLCwr6+v2tratbW1u7u7u7u71tbWnp6es7OzsLCws7Ozrq6uyMjIr6+vvLy8tra2vr6+r6+vsrKy3Nzc3NzcrKys0dHRt7e33t7ep6en19fXsLCwtbW1uLi4ra2tsLCws7Ozp6envr6+t7e3vr6+t7e3uLi48/PztbW1s7Ozq6urqampuLi4uLi4o6OjwsLC0NDQk5OT8PDw0NDQra2trq6utra2q6urqamptra2srKyqqqqrq6ur6+v5+fnx8fHubm5uLi4nJycx8fH4ODg8/Pz0tLSnZ2djY2NyMjI0dHRz8/PzMzMvLy8rKys2NjYo6Ojqqqqubm5qqqquLi4vLy8xcXFwsLCtLS0k5OTPT09AgICAwMDAAAAGRkZDw8PERERFBQUIyMjICAgFxcXBQUFGBgYGBgYJycnJiYmIyMjICAgHBwcKSkpIyMjFBQUGhoaKioqGxsbMDAwMTExLy8vOTk5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8PDt7e3xMTEn5+foKCgrKys0tLSxsbGvb29xcXFuLi4srKytLS0sLCws7OznJycnp6eqamps7Oz19fXwsLCvr6+2NjYtra2zs7OxsbGra2turq6urq6ra2tuLi4uLi4vLy8qKiotra2vLy8wMDA4ODgqqqqra2tqKio19fX4eHhycnJoqKirq6urKysvLy8srKyrq6ukZGRtra2vr6+tLS0q6urtbW1tra25ubmyMjIuLi4tLS0sLCwmJiYqKiorq6urq6uu7u7rKysra2ttra2ubm5tbW1mJiYpKSkqqqqs7Ozr6+vvr6+srKyvLy8ycnJubm5wcHBv7+/2dnZ7e3t6enpysrKz8/Ppqamm5ubkJCQxcXFqKio1NTU7e3tsLCws7OzsbGxvLy8vLy8wMDAs7Ozrq6utbW1rq6uycnJra2tu7u7qampgoKCCAgIAQEBIiIiFxcXFxcXLCwsNDQ0OTk5EhISGxsbFhYWCQkJFBQULi4uHBwcGRkZGBgYCgoKEhISLi4uJiYmKysrHx8fISEhKysrHh4eNDQ0////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7u7qamprKyst7e3vLy80tLSzs7OwsLC0dHR29vb1NTU7u7ulJSUtra2srKyxMTErq6uv7+/rKysw8PDtra2s7OzsrKyzMzMvLy81NTUsLCws7Ozt7e3tra2w8PDsLCwr6+vr6+vr6+vrKysqqqqw8PDqqqqtLS0tLS0qqqqo6Ojvb29mZmZm5ubl5eXubm5vLy8sbGxmJiYsbGxs7OzvLy8srKyuLi45OTkx8fHsLCwvLy8s7Ozpqamra2tlpaWtLS0sLCwubm5qamptLS0xMTEurq6rq6upaWlrq6upKSkqKioqampzc3Nvb29u7u7rq6uurq6q6urtbW1o6OjkpKSx8fHzc3NqKiolJSUx8fHt7e3p6enmpqanJycoaGhvb29s7Ozq6urlJSUmZmZyMjIysrKtbW1rKystra2r6+vsrKylZWVoaGhmZmZh4eHnp6eDw8PGhoaGxsbFxcXKSkpKSkpIiIiJCQkICAgFBQUGBgYExMTHBwcJCQkFxcXBgYGCAgIEBAQJycnHx8fFxcXGRkZFRUVJycnxcXF////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////29vbvb29wMDAsrKyx8fH09PTu7u7wsLCw8PDv7+/sLCwr6+vt7e3tra2p6entra2tLS0sLCws7OztbW11tbWsbGxw8PDr6+vxcXFvr6+2NjYvb29sLCwsrKyr6+vpaWls7Ozrq6ut7e3qampxcXFnZ2dtbW1t7e3yMjIxMTExMTEvb29u7u7xcXFt7e3rKysrKyspqamr6+vuLi4sLCwtra2vLy8wcHBycnJvb2929vb5ubmsbGxurq6tLS0uLi4s7OzqamppaWlpqamqqqqqamprKysra2tpaWlqampq6urqqqq0tLSrq6uqamppaWlmJiYwMDAq6urmZmZqKiorKys29vbr6+vt7e3oqKioKCgw8PDubm5pqamqqqqrKystra2tbW10NDQxMTEsbGxu7u7n5+fr6+vsbGxsLCwp6enrKyssbGxsbGxsLCwr6+vmZmZqampjY2NlpaWFBQUFRUVDQ0NAgICFhYWHBwcISEhEREREhISERERDAwMJCQkHR0dFhYWEhISCQkJDg4ODAwMHR0dERERGhoaHx8f6Ojo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////mZmZtbW1tbW1srKyxMTEz8/PzMzMxsbGx8fHzMzMr6+vra2tsrKyo6OjpKSkr6+vq6urrq6utbW119fXtra2ubm5rKysurq6vr6+z8/PqKiosbGxuLi4tLS0rKyss7OzpKSksLCwzMzMuLi4sLCwpKSkycnJlZWVqqqqtbW1s7Oz3d3dp6enxMTE6enp3Nzcs7OztbW1tbW1srKyurq6ra2txMTEsrKyt7e3urq6tbW1sLCw0dHRy8vLtbW1tra2vb29rq6utbW1rKysrKysmpqasbGxwcHBqqqqvb290tLSxcXFqqqqtLS0pKSknZ2dra2ttLS0jY2Nnp6evr6+rq6upKSkr6+vt7e3sLCwrq6upKSkoqKiq6urtLS0qampp6enq6ur1NTUuLi4sbGxsLCwtLS0q6ursLCwtbW1ubm5srKyrq6uq6urra2ttbW1qKioqKioqamppaWlTk5OXV1dQUFBBwcHAQEBFxcXGBgYEhISERERCQkJBgYGDAwMHBwcKSkpFxcXDAwMDQ0NBQUFERERHh4eEBAQJSUl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////srKyurq6q6urxMTExMTEwsLC0tLSzMzM2traurq62NjYpqamoKCgt7e3tbW1r6+vuLi4zs7OxMTEtbW1rq6upqamra2toaGhw8PDtLS0p6entra2qKior6+vrq6uuLi4tra2tra2uLi4tra2sLCwra2tkpKSxMTEqqqqubm5o6Ojrq6uoKCg0tLSw8PDoqKiuLi4ysrKxcXFq6urqqqqvr6+ra2tpqamubm5rKyssrKysbGxqKiop6enurq6uLi4xsbGubm5u7u7paWln5+fp6enmpqaqKiowMDAyMjIoKCgsrKyq6ursrKys7Ozra2tqampsbGxz8/PqKior6+vq6urqKior6+vq6ursLCwvLy8m5ubrKyss7OztbW1oqKipKSks7OzuLi4qampzc3Nrq6uqKiotLS0tbW1oqKilZWVo6Ojm5ubo6OjuLi4qampsbGxr6+vra2turq6v7+/qqqqX19fW1tbcnJyAAAADw8PDAwMCAgIAgICBwcHAAAACwsLEhISDQ0NEBAQBgYGAQEBGhoaEBAQCAgICwsL////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3NzcxMTEwcHBv7+/z8/PysrKxMTEysrKvr6+qampr6+vqqqq3Nzctra2qKiowsLCtbW1srKyv7+/n5+ftbW1vLy8q6uro6Ojubm5qampr6+vrKyszc3NqKiolpaWpqamqampubm5t7e3w8PDu7u7p6enr6+vq6urubm5xMTEpqamra2tt7e3nJycubm50tLSycnJqqqqpKSk2NjYs7OzuLi4tLS0v7+/rq6utbW1v7+/srKytbW1pqam3NzcrKysnJycsrKyqampsLCwtra2p6ensLCwoqKiubm5wcHBuLi4o6Ojq6uriYmJnZ2dvr6+p6enwMDApqammpqaqampo6Ojvb29wMDAo6Ojm5uboaGhpqamzMzMqKioubm5rKysoqKin5+frq6uvb29tLS0urq6ubm5vLy8u7u7sLCwnJycp6enoKCgmZmZmpqaioqKoKCgsrKyv7+/sLCwm5uboqKimpqarKysvr6+pqambW1tlJSUX19fEhISAgICBgYGAAAAAAAAEhISCQkJDw8PDg4OAAAAAwMDJCQkGxsbQUFB////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////rq6uvb29xMTEu7u7y8vLxsbGzMzMvLy8vr6+wMDAvLy8qqqqurq619fXr6+vysrKw8PDwcHBurq6uLi4vr6+sbGxwcHBnZ2dsbGxw8PDpaWltLS0r6+vs7OzsbGxqqqqxMTEp6enrq6uoaGhpqamtbW1qqqqqampsrKysLCwqqqqra2tq6urpqamwcHB2tratbW1paWlqampu7u7o6OjsLCwtra2tLS0wMDArq6utbW1urq6sLCwsrKyv7+/rKysurq6tbW1s7OzsrKyvLy8t7e3ra2tv7+/v7+/vb29qampoaGhzc3NwcHBm5ubsLCwuLi4vLy8kJCQpKSku7u7p6enoqKioaGhvb29paWlpqampKSkuLi4v7+/qqqqpqamqqqq9vb2ra2to6OjqKior6+vxcXFr6+vuLi4oqKim5ubnp6eoqKilZWVsLCwoqKir6+vq6urrKyso6OjmZmZvr6+sbGx1dXVqKios7OzkJCQpqamc3NzfX19Pz8/MDAwAAAAAAAAGBgYGRkZERERDQ0NFRUVDAwMCwsLISEhyMjI////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7Ozs7Ozubm50NDQvb29wsLCu7u7paWllpaWv7+/tbW1wsLCtLS0srKytLS0srKyt7e3q6urw8PDuLi4xsbGp6envLy8u7u7s7Ozs7Oz0tLSurq6rq6usLCws7OztbW1p6ennZ2dpKSklpaWra2tuLi4ra2ttra2r6+voaGhqqqqqKiotbW1sLCwvLy8pKSkyMjIrKyszc3NxcXFra2ttLS0u7u7s7Ozp6enwMDAo6OjtbW1sbGxtLS0uLi4tbW1qKiosLCwtbW1uLi4tra2p6enw8PDt7e3tbW1np6esrKy3t7e1tbWsbGxr6+vsLCwkJCQv7+/ra2toqKipaWlra2tqqqqv7+/o6OjqKioqampqampqamplJSUtLS0qKioqqqqx8fH1dXVpaWlxcXFt7e3xsbGqampvb29s7Ozm5ublZWVnZ2dsLCwtra2uLi4urq6wsLCs7OznZ2doqKipqamoaGhnZ2dmJiYp6enra2tubm5n5+fBAQEdXV1nJycoaGhSkpKAAAAFRUVHx8fDw8PEhISEBAQCgoKDQ0N////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oqKiy8vLv7+/xMTExsbG2tras7OzrKysvLy8v7+/1dXVsbGxrq6unp6evb29vr6+wsLCtLS00tLStbW1wMDAr6+vuLi4rKystra2tLS0t7e3v7+/wsLCr6+vrKystra2xsbGsLCwsrKywMDAsLCwnZ2dpaWlqqqqx8fHtbW1qqqqpKSk4ODgurq6rKysqampra2tpqamtra2wMDAqqqqpaWlqampvb29tLS0qampurq6np6epaWlrq6uqamppaWlsrKysbGxl5eXxMTEy8vLtLS0kpKSGhoax8fH1tbWvLy8pqamq6ursrKympqaurq6urq6tLS0rq6ur6+vn5+fo6OjkJCQs7Ozs7OznZ2dl5eXqKiol5eXrKyss7Ozra2tqampuLi4srKyq6urra2tz8/P4eHhxsbGubm5vr6+ra2twMDAt7e3tra2oaGhsrKyvLy8ra2tq6urn5+ft7e3tra2p6enqqqqu7u7lZWVCAgIiIiIsbGxsbGxtLS0mpqam5ubj4+PqKionp6eCQkJCAgIGBgYGBgYDg4OIyMj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+/tbW1urq6v7+/sLCw1NTUyMjIvLy8rKysv7+/09PTycnJv7+/tra2vLy8xMTEwMDAs7Ozvb29paWlubm5v7+/sLCwsLCws7OzqKiourq6wsLCr6+vs7OzxMTEp6enqKiot7e3tLS0srKyt7e3qKion5+fz8/PsLCwz8/Py8vLr6+v3d3dzc3Nvr6+rKyssrKytLS0sbGxqqqqwcHB4eHhy8vLwMDAxsbGvLy8t7e3tbW1t7e3rq6uvLy8sLCwysrKtbW1urq6vb29sbGxoKCgqKiopKSk1NTUra2thISEqamppKSks7Ozpqamvr6+n5+fo6OjxMTEr6+vo6OjjIyMnp6eo6Ojm5ubn5+ft7e3n5+fpqamoaGhsbGxubm5n5+ftLS0rKystLS0t7e3urq6tbW1t7e3r6+vtbW1tbW1ubm5tbW1ra2tq6urr6+vs7OzoKCgn5+fu7u7ra2tuLi4sLCwn5+fn5+ftbW1k5OTJycnkJCQAAAAjo6OnZ2dpqamm5ubjIyMm5ubkpKSm5ubi4uLAgICCQkJDg4OJSUl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////mZmZtra2ycnJysrKvb29s7Ozqqqqs7OzwcHBrq6uubm5srKyvLy8q6urra2tvLy8tbW1ra2tsLCws7Ozs7OzmJiYu7u70tLSxsbGsLCwrKysubm5s7Ozvb29tLS0rq6urKyskZGRs7OzrKyszs7OpqampaWly8vLrq6uqqqqu7u7p6enuLi4sbGxsrKywcHBuLi4u7u7qqqqrq6uq6ur0tLSqampnZ2dqqqqtra209PTuLi4tbW1o6OjqKioy8vLsrKytLS0nJycurq6r6+vqqqqNDQ0qqqqpaWli4uLq6urqKiooqKioqKin5+fv7+/s7Ozl5eXu7u7srKyqqqqo6OjoqKim5ubrq6upqamrq6unp6eo6OjpqamsbGxubm5qampwcHBxcXFrq6uy8vLycnJqKiotra2sLCwpaWlqqqqvLy8t7e3srKyu7u7sbGxr6+vrq6usbGxpqamr6+vs7Ozra2tq6urm5ubpKSkn5+frq6uoqKil5eXAAAAiYmJmpqajY2N0NDQpaWljY2Ni4uLgYGBiIiIaGhogYGB////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ubm5vb29vr6+x8fH1NTUwcHBsrKywsLCvr6+srKysbGxtbW1srKyysrKr6+vsrKytLS0t7e3v7+/vr6+wcHBurq6rq6uwMDArKyssrKyrKys0NDQo6Ojt7e3p6entLS0q6ururq6vLy8v7+/srKywMDArq6upaWlpKSkqqqqm5ubpqamzMzMt7e3rKyss7Ozo6Ojs7Ozs7Ozr6+vq6urpaWl2NjYpaWlr6+vo6OjlpaWn5+foaGhp6ensLCwqqqqtLS0rq6uo6OjpKSksbGxpaWlr6+vurq6oqKirq6uNTU1ZmZmsLCwqKiotbW1jIyMoaGhr6+vqKioy8vLrKysp6enq6urr6+vmJiYtbW1nJyczs7Oo6OjoqKinZ2doaGhoaGhr6+vx8fHs7Ozv7+/xsbGxsbGwsLCu7u7ubm5x8fHzs7Ojo6OrKysv7+/u7u7qampnp6etLS0v7+/xMTEvr6+u7u7s7Ozt7e3tLS0np6en5+ftra2AAAAvb292NjYrKysn5+fsrKyp6enqKioqqqqz8/Prq6uVlZWXl5e////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXF2dnZwcHBvLy8urq6xMTEurq6rKyssbGx2dnZtra2sLCww8PDvb29tLS0uLi4s7Ozurq6tra2qqqqurq6tbW1sLCwqampuLi4wcHBv7+/m5ubysrKmJiYpqamq6urp6eny8vLvb29p6enzc3Ntra2ubm5o6OjpaWlqKiozc3Nrq6usrKyoKCgqqqqra2tt7e3xcXFsLCwra2tqKiorq6urq6u2dnZtLS0ra2tr6+vqKiop6enyMjInp6esLCwr6+vr6+vpKSkoKCgnp6erq6uo6Ojvb29qampzMzMm5ubo6OjlZWVs7Ozqqqqjo6OoaGho6OjlZWVysrKt7e3ra2tuLi4pqamvLy8oKCgl5eXpKSkqKiolpaWra2tsLCws7OzxsbGurq6uLi4tra2tbW1qampr6+vvLy8tLS0wcHBwMDAzc3NtLS0rq6utLS0srKyrKysnp6et7e3zc3NsLCwvLy8vLy8s7Ozurq6tra2paWlAQEBAAAAAAAAqKioubm5zMzMt7e3rKyspKSkqqqqqKiot7e3aWlpqKiou7u7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////t7e3tLS0v7+/sLCwsrKyoaGhwMDAqqqqpKSkqqqqrq6ut7e3vLy8rq6uuLi4tLS0sLCwqamps7Ozu7u7tra2r6+vsrKytLS0uLi4x8fHra2trq6uv7+/kZGRr6+vurq6p6en0NDQtLS0r6+vsLCwra2tsbGxuLi4p6ennJycxMTEpKSkycnJpaWlqKiov7+/rq6usrKypaWlrKystbW1vr6+nJycm5ubxcXFtbW1nZ2dq6ururq6qqqqrKysmZmZra2tpaWlrKyst7e3tra2ubm5srKyoaGhubm5np6esrKyoqKirq6uuLi4qKion5+fra2tqampuLi4ra2trq6urq6uqampt7e3o6OjtLS0u7u7tbW1r6+vs7OzsbGxra2twMDAvr6+sbGxycnJs7OzsbGxsLCwtLS0sbGxwMDAysrKuLi4tLS0r6+vq6ursLCwsLCwqamptbW1qKiotbW1q6urra2txcXFsbGxtLS0tra2qqqqOjo6KCgofn5+1dXVqamp0dHRrKysqqqqpKSkr6+vtLS0tra2n5+fsrKy1tbW////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wsLCxMTEtra2rq6upqampaWls7Ozr6+vtbW1oKCguLi4wcHBsLCwx8fHrKysvLy8vLy8srKysLCwq6urt7e3tbW1wMDAv7+/qqqqsrKy1dXVsrKyt7e3qqqqzs7OqKiou7u7sLCwsrKysrKyqKiomZmZqKiowcHBrKysrq6uycnJrq6urKysqampurq6qampra2trq6upKSkrq6utra20tLSs7Ozzs7OwMDAurq6tbW1lZWVp6enq6urpKSksLCwo6Ojs7OzoaGhu7u7pqamuLi4urq6tbW1srKyurq6m5ubsLCwzMzMjY2NoKCgqqqqtbW1vb29pqamkZGRpaWlqampqqqqsLCwpqamr6+vtbW1sLCwrKyspaWlsrKyvr6+tbW1ra2tp6ennp6evb29urq6ubm5wsLCvr6+srKyqqqqtLS0sbGxwsLCrq6unp6eoaGhqKiosrKysbGxp6entra2u7u7rq6usbGxxcXFubm5tbW1wcHBurq6////r6+vv7+/wcHBs7Ozqampo6OjwcHBp6ennZ2dqKiorKys////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6enpubm5sLCwkJCQuLi4pqamoKCgqamprq6uo6OjqqqqrKyspqamqampvr6+o6OjtbW1s7OzsrKywMDAtra2vr6+ra2tuLi4wMDAy8vLjY2NysrKy8vLsrKyjY2N0dHRycnJqKioxcXFrKysqKioo6Ojurq6pKSkvb29r6+vsrKyqqqqsbGxqKiosrKyq6urt7e3p6entLS0nZ2dra2tq6urrKyswMDAtbW1xMTEra2twsLCsbGxoKCgo6OjuLi4paWln5+fn5+fr6+vlJSUuLi4np6erKysvr6+y8vLsbGxubm5vb29nZ2dpKSkr6+vt7e3vb29paWlqampw8PDpKSktLS0srKysLCwtLS0vb29v7+/q6urpKSku7u7oaGhsbGxr6+voKCgrq6us7Ozw8PDtra2sLCwsbGxv7+/rq6utra24+PjsrKyp6en09PTo6OjtLS0u7u7tLS0qamppKSkqqqqra2ts7OzsLCwvLy8v7+/xsbGz8/PwsLClJSUtra2wsLCn5+fpaWlqqqqtLS0mJiYp6eno6OjkZGReHh4////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////pqamsbGxrKyssLCwoKCgpKSktLS0oaGhoqKira2tmpqaq6urrKyspqamtra2q6urn5+fnZ2dqKiorq6uqKiowsLCsbGxxsbGycnJuLi4rq6uy8vLra2tl5eXrKyszMzMtLS0tbW1yMjIpqamvr6+s7OzvLy8qamptra22NjYr6+voqKinp6esbGxiYmJr6+vysrKrq6usLCwuLi43t7etra2sLCwrq6umZmZq6urpqamsbGx0tLSqampnZ2doKCgm5ubra2ttbW1pqammpqal5eXra2tq6urp6enqKiopaWlsLCwubm5qampt7e3wsLCp6ent7e3fHx8np6emZmZnZ2drq6urKysqqqqqKioqqqqtra2sbGxoaGhqqqqtbW1rKyssLCwubm5wcHBsrKysLCwnJycqqqqsrKysLCwvb29vLy8r6+vqqqqtLS0srKy3t7epaWlsrKynJycsbGxsLCwubm5wsLCnJycr6+vwcHBvb298vLyr6+vtbW1vb290NDQpqamm5ubq6urvb29sLCwrKystra2s7OzpaWltbW1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////p6envLy8qampuLi4xMTEv7+/sbGxtbW1pKSkoKCgnp6eo6OjqKiorq6uqKioqKiooKCgqKiora2tpaWltra2t7e3oaGhubm5ra2toaGhxcXFra2t3t7eqKiomJiYqqqqsbGxxsbGvb29s7OzsbGxpKSkvb29q6urwcHBrKysoaGhv7+/tLS0mpqasLCwuLi49vb2s7OzysrKra2tr6+vvLy8rq6unp6ew8PDt7e3np6evLy8tra2oaGhLS0trKysnZ2do6OjsLCwqKioubm5oaGhqqqqqamppqamzMzMjY2NpaWlmJiYrKysurq6sbGxqampsrKyrKysqqqqo6OjrKyssrKylpaWrKyswcHBsbGxt7e3oKCgtbW1qKioy8vLsrKyurq6vb292travb29t7e32traoqKinp6evr6+urq6t7e3sbGxrKys2dnZqKiopKSkvLy8rKysmpqaqqqqsbGxvLy8qamps7OzsLCwurq6vb29q6ur3NzcwMDAmJiYmZmZq6ursbGxqKiolZWVo6Ojp6enmZmZsbGxvr6+9/f3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////rq6uqqqqsbGxtbW1tbW1uLi4tLS0urq6paWlsbGxs7Ozu7u7qqqqpKSkp6enl5eXs7OzpKSkpqamtbW1oKCgtbW1ra2ttra2pKSkvb29srKysbGxwcHBvr6+wMDAnJyctLS0s7Ozq6urr6+vr6+vu7u7rq6urq6utra2qampqampp6enubm5srKyqKiosrKyoKCguLi4pqamycnJt7e3sbGxra2twsLCurq6tLS0j4+Purq6srKyq6urrKyslZWVwcHBuLi4sbGxt7e3sLCwrKyspaWlra2twcHBo6Ojrq6uo6OjxcXFmpqaqampsLCwpKSkn5+fpaWls7OzxcXFsrKytbW1tLS0sbGxqqqqs7OzmJiYra2tkpKSsbGxwMDAoKCgpqams7OzqKioqampsbGxsLCwubm5wcHBp6enuLi4vr6+xcXFvLy8rKysqqqqqampra2ttbW1urq6k5OTqKiouLi4v7+/urq6srKyqqqqtbW1qqqqtLS0q6uroqKirq6ulpaWo6Ojm5ubw8PDq6urrKyspKSkqampoaGh////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2tras7OzpKSktbW1wsLCuLi4uLi4u7u7rKysqKiosbGxqKioqqqquLi4wMDArKysmpqapKSkpaWlioqKj4+Purq6n5+fo6Ojtra2urq6vLy8rKyst7e3srKyrq6uuLi4o6OjqqqqsLCwqqqqt7e3sLCwtLS0t7e3pqamqqqqxMTEuLi4ra2tnp6eu7u7wcHBs7OzrKystLS0rKysn5+fs7Ozr6+vuLi4rKyst7e3sbGxqqqqyMjIsbGxsLCwrq6uxMTEp6enlpaWp6enp6enrq6uwMDAkZGRy8vLkZGRrq6usLCwv7+/k5OTjo6Ora2tqqqqsLCwsbGxt7e3pqamr6+vtLS0r6+vra2tpaWlqKiokpKSkZGRoqKir6+vsrKypqamu7u7r6+vt7e3r6+vtLS0sbGxy8vLsbGxtLS0xcXFxMTEs7Ozq6urxsbGtLS0rq6usLCwtbW1q6urt7e3sbGxtbW1vLy8tbW1v7+/t7e3pKSksbGxr6+vrq6ura2trKyso6OjkZGRlJSUl5eXoaGhn5+fnZ2doqKirq6uzMzM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wMDAvb29tbW1ubm5v7+/tLS0q6urqampvr6+qampu7u7tbW1ubm5u7u7xMTEmJiYoqKiqKionZ2diYmJoaGhnJycnZ2dqqqqlZWVsLCwrKystbW1ra2tubm5tLS0w8PDqKiou7u7t7e3p6enuLi40tLSwsLCq6urs7OzsLCws7Ozs7Ozqampr6+vsrKyxMTEtra2qqqqsrKyvLy8rKysu7u7t7e3srKyv7+/tra2ubm5sbGxpaWlqampra2tsrKyo6OjwMDAuLi4sLCwlZWVoqKiw8PD4uLim5ubs7OzwcHBu7u7srKyr6+vhISEt7e3oqKitra2pKSkqqqqsrKyurq6rq6uwMDAqqqqpKSktLS0xMTEt7e3uLi4sLCwq6urtra2rq6uqampsrKytra2paWlwMDApKSksbGxurq6q6urqampo6OjpKSkuLi4s7Ozra2tr6+vm5ubqKiorq6uoaGhra2txsbGx8fHs7Ozrq6usLCwqampqamptbW1o6OjkJCQqKionJycra2tl5eXsLCwx8fHsbGxra2toqKizc3N////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////urq6rq6usrKyu7u7tra2t7e3srKyrKysz8/P2NjY3Nzc4+Pjtra2sLCwqampoaGhpqammJiYqqqqq6urn5+foKCgpqamoKCgqqqqmpqao6OjpKSkoqKipaWlsLCwtLS0tLS0sbGxs7OzsbGxtra2sbGxurq6rq6uqKioubm5wMDApKSktLS0oaGhmJiYoqKisLCwsrKyr6+vo6Ojpqam5ubm4+Pjtra2srKyu7u7tLS0tbW1rq6up6enqKiorKysra2tsbGxrq6umZmZpaWl4eHhubm5qampoaGhubm5w8PDt7e3ra2tra2tubm5tra2y8vLpaWlq6urrq6uo6Ojra2twcHByMjIoqKirq6uoKCgrq6urq6uq6urtbW1uLi4s7OzrKysrKyssLCwqampr6+vrKysq6urwsLCtra2ra2tsLCwl5eXsrKynp6excXFsLCwqqqqrKyss7OztLS0v7+/sbGxwcHBurq6sbGxqqqqpKSkq6urp6ensLCwjY2NsLCwv7+/zMzMr6+vw8PDy8vLrq6utLS0sLCwpKSk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+/ubm5srKyr6+vsLCws7Oznp6evr6+vLy8urq6vLy8wsLCubm5wMDAu7u7p6enlpaWsLCwq6urpqamkZGRk5OTjY2Nnp6ej4+Pm5ubkJCQnJycpaWlt7e3tbW1y8vLmpqap6enq6urqamplZWVpaWlsbGxtLS0oqKipqamn5+foaGhv7+/u7u7sbGxxsbGzMzMtra2ubm5w8PDwsLC9/f37u7us7Ozu7u7vr6+vr6+qampvLy8sbGxrKystra2uLi4pqamq6urrKysurq6sbGxtLS0xsbGs7OzzMzMxcXFoKCg+fn5r6+vtbW1s7OzpKSku7u7pKSknJycrq6usLCwtra2wsLCtLS0sbGxubm5s7OzwMDAr6+vs7Ozp6entra2srKywcHBxcXFurq6srKyuLi4tbW1wMDA29vbq6urra2turq6urq6tLS0tbW1vLy8tLS0r6+vr6+vra2ttLS0mZmZpqampqammpqarKystLS0mJiYqqqqr6+voaGhm5ubn5+fq6urr6+vwMDAvb29urq6iYmJsbGxrKyslpaW////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////sbGxvb29uLi4tLS0tra2mJiYu7u7v7+/o6Ojs7OzycnJu7u7uLi4tra2k5OTmZmZtbW1r6+viYmJnJycm5ubnJycmZmZgoKCjY2NkpKSk5OTlJSUn5+fp6envLy8s7OztbW1zMzMp6ens7OzqampxMTEw8PDwMDAysrKr6+vl5eXpaWlsrKyoKCg0NDQt7e3t7e3xMTE/v7+vr6+tLS0ubm5s7OzioqKxcXFq6uruLi4u7u7uLi4t7e3ubm5mJiYmJiYq6urw8PD2NjYn5+fpqamq6urnp6eqqqq0NDQlZWVnJycr6+vrq6uuLi4sLCwxsbG0NDQpKSk0dHRtra2tra2yMjIx8fHuLi4uLi4rq6usLCwq6urtbW1ysrKt7e3ubm5pqampKSko6Ojt7e3ra2tp6enx8fHpaWl29vbs7Ozs7Ozrq6uqKiorKyspKSkpaWlra2ts7OzpaWlo6Ojo6OjqamppaWloqKiq6urpqamsbGxs7OzkpKSnp6epKSkm5ubrq6ulpaWvLy8kZGRnZ2dp6enurq6mZmZwcHBo6Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////pKSkoqKitbW1rKyspqamuLi4wsLCvr6+tra2s7Oztra2q6urv7+/tLS0sbGxsrKypqamuLi4mJiYqKioqampn5+fnJycoKCglZWVlZWVgICAmpqaxcXFoKCgmZmZnJycqKiompqao6Ojo6OjrKysuLi4q6urrq6uu7u7tbW1t7e3s7Ozy8vLsbGxoKCgtbW1xcXFx8fH9fX10tLS1tbW7e3tysrKsbGxvb29vb29ubm5t7e3sbGxr6+vvb29rq6uu7u7q6uryMjIra2tqampsrKy1NTUpKSksbGxrq6usbGxrKysv7+/p6enr6+vzMzMxcXFw8PDsLCwz8/Pra2tsrKyvr6+1tbWpqamqampurq6tbW1nZ2do6OjyMjItLS0tra2ra2ttbW1qamppqamt7e3sbGxvLy8uLi4s7Oz4eHhpKSkpqamra2tsLCwoqKirKyssLCwvb29sLCwwMDAvLy8ubm5u7u7ra2tw8PDs7Ozra2tu7u7urq6k5OTsbGxjo6Ok5OTy8vLu7u7n5+fpqamqKioy8vLl5eXr6+vu7u7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ycnJurq6sbGxrq6urKysqKioqampsrKyra2tv7+/q6urtbW1sLCwpqamr6+vt7e3o6OjrKyskpKSk5OTlJSUlZWVn5+fnZ2dpqamX19fj4+Pu7u7m5ubrKysjo6Oo6OjsbGxpqamrq6uqampiIiIoaGhh4eHiYmJnZ2dmZmZmpqasrKy39/fqKiowMDAuLi4qqqq1dXVw8PD0NDQ09PT0NDQ2tra0NDQ4eHhzc3Nzs7OtbW1v7+/u7u7oqKitra2sbGxt7e3tra20tLSt7e3rq6usrKywsLCrKys0tLSl5eXsLCwsrKytra2qampq6urqqqq0tLSsbGxsLCwr6+vvb29sbGxr6+v1dXVs7OzvLy8o6OjsbGxqamptra2oaGhubm5s7Ozr6+vtbW1t7e3tbW1t7e3rq6uycnJ0NDQ6enp39/ft7e3rq6usrKyt7e3rKysoKCgxMTEqKiopaWltLS0vr6+sLCwwcHBvLy8vb29n5+fvb29t7e3qqqqwcHBmJiYmpqara2tnZ2drq6ur6+vqqqqqamppaWlsLCwnp6eurq6////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////uLi4uLi4vLy8tra2urq6tLS0s7Oztra2rq6uvr6+srKypaWlt7e3r6+voqKiqqqqsrKypKSkjY2NjY2NiYmJmZmZx8fHxcXFxsbGxcXFpKSktra2mpqanZ2dtbW1pKSkk5OTpqamrKysl5eXqqqqkZGRmJiYo6Ojn5+fmJiYmZmZh4eHi4uLi4uLmZmZ2traycnJqqqq2trav7+/xcXFwsLCv7+/ysrK+/v7zc3NuLi4wcHBuLi4tra2ubm5sbGxt7e3uLi4t7e3vb29rKyswsLCxsbGsrKyoKCgrq6urq6usbGxsrKyzs7Oqqqqqqqqp6en3d3duLi4rq6urq6uuLi4uLi4pKSkv7+/vLy8qKios7Ozs7Ozt7e3vr6+mJiYp6enu7u7jY2NqKio2dnZ2dnZqqqqrq6upaWlu7u7srKyvb29ra2tsrKys7Ozs7Ozv7+/sLCwtLS0pKSksrKyqqqqpqamt7e3uLi4rq6unZ2drq6upqamqKiosbGxra2tq6urn5+frq6uuLi4tbW1vLy8n5+fqKioqqqqoqKikpKS////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////p6enoaGhrq6uqKiotbW1ra2ttLS0t7e3rKysv7+/vb29urq6urq6paWlpaWls7Ozq6urnJyclJSUrq6uqqqqu7u7sLCwkZGRt7e3p6enpaWlnJycmZmZkpKSmJiYsbGxwsLCnp6eoaGhlJSUkpKSl5eXpKSknp6eqamppqampKSkpaWli4uLk5OTlZWVnJycq6urwcHBsrKyvb296Ojovb29wsLCt7e3w8PDw8PDurq6sbGxx8fHvr6+tLS0t7e3n5+fkJCQysrKvr6+tLS0rq6utLS0np6era2twsLCrKystra2x8fHr6+vsrKyn5+fqKio2dnZurq6srKyubm5rKysoKCgmZmZsbGxpKSkvr6+qqqqqampra2tqqqquLi4yMjIx8fH1tbWsrKyr6+vra2ttbW1rq6utbW1mpqarq6uvLy8w8PDpKSkrq6up6enra2tsbGxp6ens7OzqKios7Ozu7u7n5+fsLCwr6+vtLS0qKiooqKirKysrKyssrKyxMTEsbGxqKiolZWVxcXFrKysnJyckJCQnJycmJiYpqam////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+fn5tLS0srKyvr6+rKysra2tt7e3qampvLy8sbGxysrKwMDAubm5u7u7sbGxtLS0qKioq6urpaWltLS0pqamsLCwtLS0tLS0mpqal5eXra2t4eHhrKyso6OjpqamqqqqsrKywsLCk5OTmJiYi4uLjo6Ovb29oqKiioqKpqaml5eXo6OjrKysl5eXpKSkoKCgqqqqqqqquLi4t7e3+fn59vb2vLy8vr6+w8PD7u7uxMTEvb29vLy8uLi4xMTEpKSkra2tlZWVra2tuLi4xMTEw8PDt7e3sLCwqKiotLS0mpqavb29n5+frq6uqampra2tvb29zMzMp6enra2tr6+vpaWluLi4ra2tvb29rKysxsbGx8fHvr6+8/PzuLi4wcHBvb290tLSvr6+sbGxpaWlra2tsrKyqKiopqamuLi4pqamvr6+y8vLsLCwm5ubqKior6+vo6Ojq6urpqamt7e3qqqqurq6srKysbGxrq6uq6urvb29p6enrKysn5+fvb29p6envLy8r6+vkZGRjY2Nn5+fm5ubkZGRg4ODkZGRnJycoaGh////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oqKitra2s7Ozs7OzwsLCvb29nZ2dtbW1s7OzuLi4srKytLS0uLi4q6urtra2paWloqKilpaWurq6o6Ojq6uruLi4uLi4jIyMrKysm5ubnZ2doaGhn5+f1NTUrKyssbGxsbGxnZ2djo6OjIyMi4uLnp6eiYmJk5OTjY2NlpaWi4uLlpaWhYWFl5eXnJyc0NDQl5eXz8/P1NTU0NDQwsLC////ubm5j4+PwcHBvr6+tLS0w8PDrKysvLy8vLy8tra2ra2tpaWlvr6+qamprKys0NDQsLCwtbW1qqqqrq6uvr6+tLS0xMTEuLi4paWlsbGxsbGxsLCws7Ozurq6srKyqampq6urqqqqqKioenp6n5+fra2tp6enoKCgwsLClJSUu7u7p6enq6ursLCwnp6euLi4x8fHv7+/qqqqnZ2dxcXFxcXFq6uru7u7tra2urq6pqamra2tqampq6urrKyss7OzoKCgq6urra2tq6uroKCgnp6er6+vuLi4oaGhxsbGr6+vra2trq6umZmZlpaWmJiYioqKjY2NmpqaqKionJyc+fn5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tbW1tLS0rKyst7e3rq6ura2txMTEurq6ra2to6OjpKSkt7e3ubm5qKiox8fHm5ubs7Ozt7e3paWlp6enrKyssLCwpqamnZ2dsrKympqanJycp6enrq6ujY2N0dHRu7u7t7e3o6Ojk5OTsbGxjIyMjIyMiYmJkpKSj4+PkJCQmpqaioqKp6enoKCgmJiYsrKynZ2dpaWlYWFhxsbGt7e3qqqqjY2NoqKil5eXra2t+fn5q6urpKSksrKypKSksbGxsLCwq6urlJSUsbGxq6urz8/PsLCwtbW1sLCwnZ2dk5OTpKSksLCwsLCws7Ozra2trKyssrKyw8PDubm5wcHBq6urra2tqampn5+fqqqqvb29nJycrKysx8fHxMTEn5+ftLS0paWlvb29q6urtra2ubm5xcXFy8vLvr6+pKSko6Ojrq6ulJSUqqqqrKyspqamoaGhs7OztLS0xMTEq6urwMDAra2trKysqqqqqqqqtLS0srKypaWlra2tsLCwnJycnZ2doqKilZWVkZGRlJSUmZmZm5ubm5ubqampnp6em5ub////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////qKiooqKis7OzrKyst7e3vLy8t7e3sbGxwsLCuLi4rq6ut7e3t7e3q6urq6ursLCws7OzoKCgsLCwsrKyo6Ojn5+fpaWloqKiq6urubm5oKCg8/Pzw8PDn5+fp6enlpaWsrKypaWlnZ2do6OjoqKipqamqqqqlJSUpaWlra2tsLCwra2tsLCwk5OTlpaWlpaWqqqqpKSkt7e3w8PDo6Ojvb29nJyclpaWmpqaqKiorKyst7e3qqqqsLCwtra2t7e3tLS0v7+/rq6urKys39/fxcXFrq6uxMTEtLS0tra2qqqqoqKir6+vvb29tbW1np6eurq6tLS0vLy8rq6uwcHBt7e3qKiorKysrKystLS0qqqqw8PDqqqqoqKis7Ozq6urt7e31dXVr6+vurq6vLy8ra2tr6+vra2trKysxMTEsLCwrq6upKSkurq6mpqat7e3qqqqt7e3sbGxpaWlsLCws7Ozv7+/u7u7wcHBra2tvLy8o6Ojo6OjsLCwp6enoqKisLCwpqamiIiInZ2dra2toKCgpqamnZ2dn5+fpKSkn5+f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wcHBvb29ubm5vr6+uLi4q6urt7e3urq6q6uruLi4tra2t7e3tbW1ra2ttbW1p6enpKSks7OzqampysrKt7e3tra2s7OzrKyssrKylZWVsrKysLCwvb29mZmZwMDAnZ2dpqamrKysnZ2dp6enn5+fm5ubpKSktra2t7e3srKyrKysm5ubqqqqra2ttLS0kpKSjIyMlZWVr6+vo6OjjY2NwcHBsrKyt7e3sbGxsrKyqamptLS0qamptra2r6+v0NDQvb29vLy8u7u7t7e3tra2tbW11tbWubm5u7u7s7Ozra2tl5eXsLCwrq6umZmZq6ursLCwvb29p6envr6+q6ursbGxtbW1pqamoKCgo6OjrKysr6+vra2turq6nZ2dsrKyqqqqrq6uq6urw8PDrq6utLS0tra2r6+vtLS0p6enpqampqamr6+vvb29sbGxo6Ojx8fHx8fHysrK0dHRzMzMuLi4wcHBubm5v7+/s7Ozv7+/pKSkqKioo6Ojra2ttLS0srKypaWlpqamlZWVtra2t7e3p6eno6OjpaWlqKioo6OjpKSk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////mJiYxMTEubm5ubm5q6uro6Ojqampubm5v7+/ra2tw8PDxsbGtLS0tLS0oaGhnp6erq6uqKiot7e3urq6qKiosbGxr6+veXl5s7OzoKCgsLCwqamppaWlp6enu7u7ubm5pKSkxcXFzs7OrKysq6urtbW1pqamsrKys7OztLS0n5+fubm5rq6usbGxoaGhubm5p6ensbGxt7e3tra2p6entbW1vr6+sLCwsrKyvb29uLi4rq6usbGxsLCwpKSkoaGhvr6+vLy8uLi4wMDArKys3t7eyMjI1tbWsbGxubm5u7u7w8PDqKior6+vsbGxvb29wMDAs7Ozq6urqKiovr6+oKCgpaWlrKysl5eXurq6paWlrq6uoqKip6enqKiov7+/vr6+sbGxoaGhwMDAubm5t7e3r6+vq6ururq6ubm5s7OzyMjIsLCwnp6eqKiopaWltra2srKyq6urr6+vqKioubm5kZGR2tra3Nzcvr6+sLCw2trav7+/q6urpKSkr6+vnJycsLCwo6Ojra2toqKixMTEo6Ojm5ubqqqqubm5qamp////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9fX1q6urv7+/ubm5ubm5rKysra2tlZWVwcHBw8PDsLCwu7u7tbW1oaGhqqqqp6enpKSkq6urvr6+mZmZr6+voaGhoKCgo6OjqKiosbGxrKysu7u7uLi4sLCwtbW1s7Ozra2tr6+vs7Ozs7OzpaWltLS0qKio5ubmxcXFoqKisbGxurq6s7OzsbGxqKioxcXFtra2qKiotLS07e3tx8fHtra2wMDAt7e3tra2tra2sLCwycnJra2tuLi4uLi4qamps7Ozr6+vsbGxqqqqycnJrKyssrKy7e3tvb29zMzMtbW1qKioubm5t7e3paWlq6urtLS0o6OjsLCwpqamq6urpqamm5ubtbW1qKiopqamurq6rq6unp6etra2zMzMxMTEsLCwtLS0xcXFvLy8vr6+srKys7Ozm5ubrq6uq6urmpqax8fH2tra2NjYk5OTvb29urq6rq6ux8fH4ODgwMDAsLCwpaWlw8PD3NzcyMjI2NjYy8vLwcHBqampsbGx1dXVn5+fmJiYnZ2dqqqqn5+fqampnZ2dsrKym5ubj4+Purq639/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ra2twcHBwsLCvb29t7e3vr6+ra2tpKSkt7e3tra2wcHBoKCgoqKiqamps7OztLS0rq6uu7u7srKyp6enpaWlurq6qamptLS0v7+/w8PDra2tra2tt7e3rq6uq6ursLCwt7e3sbGxtLS0m5ubp6enq6urtra2tbW1srKyubm5sLCwrKyssLCwtLS0vb29tbW1ra2turq6qqqqoaGhuLi4wMDAvLy8p6enra2turq6v7+/vLy8sbGxsLCwsLCwt7e3rq6usLCwxsbGiIiItbW1tra2ra2tvb299fX1xsbGwcHBra2tlJSUvb29uLi4oKCgycnJqKiooqKizs7Ovr6+urq6rKysn5+fpKSksLCwr6+vqampqqqqubm5urq6xcXFsrKywcHBwsLCsbGxra2turq6uLi4u7u71tbWr6+vyMjIvb29srKyurq6p6ennJyczc3Nra2tra2tm5ubtbW1xsbGrKysuLi4sbGxsrKyycnJqKioqqqqrKysr6+vycnJo6Ojm5uboaGhp6eno6Ojm5ubqampo6Ojo6OjpKSkz8/PsrKy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wMDA2NjYzMzMxMTEvLy8wsLCtLS0urq6tra2mpqatLS0urq6paWlrKysw8PDvb29uLi4ra2ttLS0q6urrKysra2tsLCwu7u7pqamsrKyuLi4tbW1tLS0rq6usrKyuLi4vr6+rq6urKysubm5u7u7tbW1r6+vrKysv7+/r6+vqampsLCwtbW1srKympqawMDAuLi4rq6usrKy1tbWwcHB0tLSxsbGs7OztLS0wMDAurq6wsLCrKysurq6qKiou7u7xcXFuLi4uLi4y8vLy8vLzc3Nt7e3yMjIxsbGubm5v7+/oaGhx8fHubm5wcHBqKiosbGxtLS0r6+vpKSkmZmZ0NDQpaWlt7e3ra2tsLCwtLS0rKysr6+vrKysq6urpqamvr6+tbW1qampr6+vu7u7tbW1z8/Ppqamvb29rKyssLCwsLCwqqqqra2tq6urnZ2dsrKynp6era2tsbGxtra2srKysLCwxsbGubm5k5OTqqqqra2tqKiooqKitbW1uLi40dHRv7+/qKiot7e3pKSkwcHBsrKyz8/Pzc3Np6ennp6exMTE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+/vr6+0dHR09PTubm5t7e3tbW1tbW1wsLCw8PDuLi4r6+vr6+vv7+/zMzMp6ensbGxuLi4vb29rKysuLi4ubm5s7Ozra2ts7OzsbGxsrKyrq6utra2t7e3pqamtra2wsLCvLy8tbW1t7e3uLi4rq6utra2sLCwr6+vsrKyp6enqqqqvb29t7e3ubm5s7Ozurq6t7e3ubm5urq6tLS0ysrKuLi4o6Ojt7e3wcHBra2txcXFvb29ra2tvLy8tra2mZmZlpaWjIyMsrKysrKytLS0tLS0np6erq6uqampw8PDwMDAqampsLCwra2trKystbW1u7u7uLi4qampuLi4srKyqampv7+/r6+vtra2xcXFwMDAurq6vLy8xsbGy8vLsLCwsrKyqqqqwcHBy8vLtra2xsbGsLCwyMjIvLy8tLS0rq6us7Ozp6enr6+vuLi4tbW1urq6sLCwsbGxsbGxra2tsbGxwsLCw8PDqqqqsbGxuLi4u7u7tbW1p6enp6enrKysp6enpKSk1NTU09PTtra2ra2tmJiYsrKyqampm5ub////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ysrKtra2vLy8ycnJzMzMt7e3p6enu7u7vLy8v7+/wcHBpqamzs7OuLi4uLi4ubm5rq6upaWlo6OjrKystbW1vLy8y8vLtbW1sLCwsbGxu7u7t7e3q6urra2tr6+vwcHBwsLCpKSkpqampKSks7Ozrq6uu7u7uLi4qKiora2tqqqqpaWlsLCwrKyss7OzsbGxtra2ubm5o6Ojt7e3tLS0uLi4s7Ozv7+/vLy8vb29oqKis7OzoKCgsLCwsbGxpqamuLi4vb29p6envb29srKynJycvr6+nJyc3Nzcq6urs7Ozu7u7ubm5s7OzpKSkurq6paWlr6+vs7Ozs7OzsrKysbGxt7e3ra2t1tbW19fX09PTysrKyMjIycnJ1tbWzc3NxMTEu7u7ysrKYmJiqqqqs7Oz1tbWvLy8u7u739/fyMjIwsLCrq6us7Ozp6enwsLCubm5q6urqqqqrq6uuLi4rKysqKiov7+/uLi4oaGhvr6+s7OzpKSkpqamrKystbW1qqqqpaWlu7u7q6urn5+fpqamlZWVlJSUkJCQrKysurq6////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2NjY1NTUzMzMycnJwMDAw8PDwsLCr6+vuLi4xcXFxsbGv7+/qqqquLi4v7+/yMjIv7+/p6enqqqqubm5v7+/p6enuLi4v7+/urq6wsLCxcXFtLS009PTv7+/tLS0qKiorKystLS0pqamsLCwqKiorq6usrKyvb29tra2vb29s7OzsLCwq6urt7e3vb29v7+/w8PDxcXFubm5xMTEwsLCtbW1uLi4v7+/ubm5srKyu7u7u7u7tLS0sbGxuLi4w8PDubm5u7u7nZ2dv7+/t7e3vb29xMTEpqamx8fHsrKywcHBtra2p6ensLCwt7e3tLS0wMDAt7e3tra2p6enzMzMw8PDqqqqzc3N39/f2NjY0NDQtLS0mZmZq6urnp6exsbGra2tsrKyvLy8ra2tsrKys7Ozu7u7xMTEwcHBt7e36+vrvLy8vb29oKCgra2tvLy8rq6ut7e3ra2tqKiourq6qamppaWlvLy8tbW1qampp6enkZGRzMzMr6+vsrKyq6urjIyMvb29xsbG0tLSrq6ut7e3p6enp6envLy8p6entLS0vLy8////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tra2ysrK1dXVy8vLurq6ycnJzMzMuLi4uLi4xcXFu7u7vLy8ycnJsLCwzs7OysrKxcXFurq6wMDAtLS0ubm5vLy8tLS0srKyvLy81tbWzc3Nurq6u7u7rKystbW1tra2qqqqqqqqt7e3urq6pKSkp6ensLCwsrKyvb29vLy8t7e3urq6uLi4r6+voqKiubm5ysrK+fn5uLi4tra2srKyubm5rKystbW1sLCwra2tpKSkqqqqm5uboaGhwsLC2travr6+s7OzioqKs7Oztra2s7Ozra2tvb29wcHBra2tnZ2djo6OpKSkvLy8xMTEvr6+paWlqampt7e3wcHBra2tuLi4tbW1z8/PxsbGxsbGpKSkr6+vtra2qqqqn5+ftbW1n5+fzc3Ns7Ozs7Oz09PTra2toqKirKysoqKitLS0w8PDqqqqq6urpKSkvb29ra2tqqqq39/fu7u7qamptLS0tbW1n5+fpaWlt7e3oKCglZWVv7+/19fX1tbWrq6upqamnJycs7OzpaWlqampp6enm5ubrKysxcXFpaWlp6enpKSk1NTU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////bW1tv7+/1NTUt7e3tra2ycnJ2NjYtbW1urq6zs7OuLi4vLy8x8fHxcXFxcXFvb29u7u7vb29tbW1uLi4u7u7vr6+urq6v7+/ubm5v7+/urq6v7+/u7u7xcXFvb29wMDAurq6wcHBw8PDvr6+paWlt7e3q6ursrKysLCwubm5urq6yMjIurq6s7OzwcHB4uLiwsLCtbW1rq6uu7u7qKiovr6+t7e3vr6+v7+/ubm5vb29u7u7xcXFtbW1rq6uvb29pqamv7+/tbW1tra2oaGht7e3srKyqampsbGxsrKyuLi4t7e3u7u7sLCwuLi4r6+vqamps7Ozt7e3sbGxvb29sbGxw8PDyMjIpKSkt7e3np6eu7u7urq6pKSkrq6um5ubqKioxcXFu7u7wcHBycnJv7+/xMTExsbGubm5p6enqqqqsrKytra2tbW1x8fHpqams7OzoqKiubm5vb29ra2tq6uruLi4urq6zMzMwsLCoqKipaWluLi4tLS0m5ubqampnJycwMDAqKiopKSkqKiowMDAl5eXrq6up6enq6urqKio////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3d3dk5OTvr6+vLy80NDQx8fHu7u7t7e309PTv7+/vb29wMDAvr6+yMjIwMDAx8fHw8PDwcHBxMTEwcHBwsLCurq6wMDAwsLCvLy8vLy8xsbGxsbGx8fH1tbWw8PDtra2tra2tra2r6+vt7e3qKiotLS0uLi4uLi4u7u7sbGxv7+/sLCwvLy8wMDAz8/P2tra5eXlx8fHtbW1r6+vsrKyvLy8ubm5wMDAu7u7ubm5vb29wcHBwMDAubm5vLy8qKiowMDAwsLCp6ensbGxp6enpaWltLS0urq6sLCwuLi4qqqq0NDQvr6+urq6tLS0x8fHubm5paWlp6enq6uroaGhsLCwxMTEsrKysbGxrKyso6OjuLi4xcXFsbGxs7OzoKCgra2ttLS0oKCgt7e3srKyp6ensbGxsbGxsLCwtLS0uLi4srKysbGxurq6tra2wcHBvb29v7+/sLCwrKyssrKyq6urr6+vwsLCpaWluLi4qKiopKSkp6enu7u7mpqakpKStLS0qqqqp6enoaGhs7Ozr6+vv7+/lZWVtbW1q6urq6urpaWl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wMDAysrKysrKurq6xsbGwMDAuLi4ubm5w8PDyMjIwcHBvr6+srKyv7+/wsLCxcXFzc3Nv7+/wMDAw8PDxsbGw8PDvb29wsLCw8PDx8fHu7u7urq6wMDAvb29urq6w8PDtLS0vr6+wMDAmZmZubm5qqqqrq6un5+fsbGxs7Ozurq6t7e3urq629vbvr6+tLS0urq6urq6tLS0n5+ftbW1s7Ozv7+/yMjIu7u7s7Ozt7e3wMDAv7+/t7e3uLi4sLCwy8vLqKiotra2qqqqy8vLsLCwuLi4uLi4tra2v7+/tra2sLCwtbW1tra2wcHBt7e3v7+/r6+vs7OzoqKivr6+xMTExMTExMTEurq6r6+vsbGxpKSkq6ursLCwrq6uqqqquLi4wMDAvLy8rq6urq6urq6uoaGhnp6eqqqqt7e319fXvb29tLS0sbGxo6OjtLS0qKiovLy8tbW1t7e3srKyuLi4urq6s7Ozra2tpaWln5+fpKSkpaWloKCgoaGhoaGhsbGxqqqqtLS0m5uboKCgsLCwtra2qqqqpKSkoKCgs7Ozp6en////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ysrKycnJz8/Ptra2u7u7srKyvr6+w8PD0NDQz8/PyMjI0tLSoqKir6+vxsbGwcHBuLi4yMjIurq6x8fHwMDAvr6+w8PDw8PDwsLCxsbGwMDAvLy8vLy8vLy8tra2v7+/ycnJvr6+vb29tra2s7OzsbGxurq6qqqqubm5wcHBuLi4vr6+ubm5uLi4ubm5tLS0sbGxvb29ubm5sbGxu7u7sLCwuLi4u7u7x8fHtbW1vLy8ubm5urq6t7e3q6urysrK39/fwcHBsLCwsbGxt7e3ubm5tbW1paWlz8/Pvr6+uLi4vLy8vr6+vb29x8fHxMTE8PDwq6ur0dHRxcXFqKiou7u7v7+/tbW1o6OjoaGh4ODgycnJpaWlqKiop6enqqqqu7u7np6er6+vr6+vtbW1s7OzsLCwl5eXtbW1r6+vr6+vp6enra2ttra2qKiooaGhs7Ozr6+vwMDAl5eXt7e309PTz8/PqqqqwsLCra2trq6un5+fo6OjqamppKSkv7+/urq6sLCwqKiovLy8rq6uycnJvr6+3d3dnJyco6OjyMjI9fX1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1dXVycnJw8PDsrKyu7u7qqqqtra2rKyszc3Nz8/P19fXuLi4xsbGwcHBxsbGvb29yMjIx8fHvb29ycnJuLi4wsLCv7+/sbGxuLi4tLS0wsLCtbW1v7+/s7Ozv7+/yMjIvLy8ra2twsLCv7+/tra2vLy8vb29ubm5sLCwurq6sLCwwMDAs7OzsrKysrKywsLCubm5sLCwuLi4w8PDtbW1qqqqra2tra2trq6uxMTEq6uruLi4u7u7uLi4tra2vb29urq6zs7Ot7e3u7u7qqqqs7Oznp6eubm5vLy8q6urvr6+vb29w8PDy8vLrKysr6+vtra21dXVqampxMTEwMDAoqKiu7u7tLS0r6+v1tbWsrKys7OzpaWluLi4vr6+srKysbGxm5ubsbGxuLi4jo6Os7Ozrq6uwMDArq6usrKysrKyjY2NmJiYtbW1tLS0vr6+q6urra2tqampv7+/zMzMp6enr6+vrKyswMDAp6enurq6r6+vm5ubtbW1uLi4mpqazc3NqqqqpKSkoKCg6+vrv7+/4+PjysrKysrKra2twMDA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vr6+wcHBuLi4tbW1srKywMDAsrKyt7e3vr6+ycnJz8/PvLy8tra2zc3NwMDAs7OzxsbGt7e3w8PDubm5vb29qKioxMTExMTExsbGvr6+w8PDv7+/vr6+vb29xsbGq6ursbGxwMDAvb29wcHBv7+/t7e3t7e3tra2ysrKra2trq6uqampsrKyr6+vsbGxv7+/u7u7tra2tLS0qqqqsrKywcHBxsbGsrKym5ubsLCwioqKoKCgvr6+uLi40dHRwMDAsLCwv7+/0dHR3d3dzMzMtLS0p6entra2urq60dHR2NjY1NTUwsLCxsbGubm5urq6zMzMwMDAurq6yMjItLS0uLi4ubm5sbGxt7e3xMTEra2tq6urra2trKyssbGxra2tu7u7ubm5v7+/tLS0sbGxq6urra2tqqqqubm5lpaWu7u7vr6+qqqqn5+fqampmZmZoaGhsrKyr6+vycnJpaWls7OzqampsbGxpqamoaGhrq6uo6Ojra2tvLy8np6epqamysrKo6OjoaGhx8fHlZWVtbW1sLCwsLCw3NzcvLy81NTUrKys////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vLy8vLy8t7e3t7e3r6+vurq6tbW1xsbGv7+/wsLC0tLS1tbWzs7Ou7u7yMjI0NDQxcXFw8PDysrKvLy8uLi4uLi4u7u7xsbGvr6+tbW1x8fHubm5vb29xMTEtLS0tLS0urq6vr6+srKysLCwurq6sbGxubm5ubm5rKyssrKytbW1wsLCsbGxtLS0r6+vsbGxu7u7vr6+ycnJuLi4sbGxt7e3y8vLra2trq6uoaGhkJCQU1NTqampsrKyzMzMvLy8vr6+wcHBv7+/x8fHxMTEwsLCvLy8xsbGwcHB2NjYxcXFtLS0ysrK0dHR1tbWsLCwubm5wcHBwMDAwsLCt7e34+Pjrq6usbGxu7u7tLS0q6urrKyswsLCuLi4paWltLS0tra2sLCwsLCwrq6uxMTEs7OztbW1s7OzqKionp6eqqqqubm5xMTExcXFv7+/tbW1xcXFt7e3sLCwx8fHtra2ubm5mZmZsbGxrq6usLCwr6+vsLCwxcXFubm5t7e3lJSUqKior6+vysrKpaWlp6eno6Ojubm58PDwzc3Nv7+/x8fHysrK////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vr6+5eXlxsbGx8fHurq6tra2t7e3xMTEvLy8r6+vtbW1w8PDycnJy8vLx8fH0dHR09PTvr6+1dXVzMzMw8PDy8vLurq6urq6uLi4u7u7vr6+vLy8vr6+pqamr6+vz8/Ptra2tra2vb29uLi4u7u7srKyubm5rq6utra2p6enu7u7vr6+tbW1vr6+ubm5srKysrKytra2yMjIwcHBsrKytbW1tbW1srKy1NTUjIyM09PTqqqqvb29o6OjycnJz8/P3Nzcy8vLxcXFy8vLycnJ0tLSzc3N0NDQubm5vb29w8PDuLi4wMDAw8PDubm5urq6+/v7xMTEzMzM0NDQrq6uxsbGy8vLysrKvLy8tbW1vr6+r6+vr6+vt7e3v7+/ra2tr6+vtLS0sbGxu7u7srKyqKiosbGxtbW1u7u7uLi4urq6tra2s7Ozqqqqo6OjxcXFqampoaGhx8fHp6entbW1pqamqqqqpKSkr6+v0dHRpaWlpqamtLS0pKSknJyctra2ra2tn5+frKysnZ2dubm5t7e3urq6qqqqmpqaubm5r6+v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6+vrurq6vb29zMzMubm5z8/PwsLCzc3Nx8fHwcHBxcXFyMjIzMzMtbW1wsLCzMzM09PTvr6+vLy8x8fHx8fHtLS0w8PDu7u7xsbGwcHBvr6+sbGxt7e3urq6rKysu7u7xMTEtra2vLy8uLi4wsLCra2tt7e3tLS0vb29urq6uLi4pKSkrq6utra2rKysrKysxcXFxMTEwMDAxcXFwMDAtLS0urq6srKyrKysn5+fwMDAqqqqu7u7urq6s7Oz19fX39/f19fX1dXVwcHB8PDwzMzMxsbGxsbG0dHRwsLCxsbGnZ2dsrKyxMTEsrKyu7u7t7e3qKiovLy8w8PDxcXFvb29pKSkxcXFysrKycnJ0NDQrq6usLCwpKSks7OzrKystra2t7e3rKysuLi4t7e3urq6r6+vubm5t7e3srKyzs7OtLS0wsLCtra27Ozsw8PDwsLCq6urnZ2dxMTEra2ts7Ozs7OzpqamxMTEr6+vpqamoqKipqamoaGhurq6qqqqr6+vn5+fsrKysLCwoKCgvr6+l5eXo6OjiYmJkJCQ////6enp////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////urq6w8PDwsLC0NDQzc3Nz8/Pzc3NxsbGvr6+tLS0x8fHw8PDw8PDzMzMurq6tbW19vb28/Pz2dnZx8fHt7e3urq6y8vLurq6t7e3u7u7w8PDvr6+tLS0u7u7uLi4uLi4wcHBw8PDsrKyvb29r6+vrq6uubm5tbW1vLy8xMTEwMDAuLi4s7Ozrq6us7Ozra2tvLy8w8PDxMTEycnJwcHBHh4epqaml5eXtLS0oKCgvr6+vb294+PjwcHBv7+/tLS0r6+vzMzMw8PDyMjIx8fHwcHBx8fHvLy8qqqq1dXVy8vLxMTE19fXw8PD7Ozsr6+vvr6+urq6ubm5x8fHsrKy3NzcsrKyvLy8paWlvLy8wMDAqamptra2vb29sLCwrKyst7e3r6+vs7OztLS0iYmJsrKywMDAwcHBt7e3tbW1u7u7tbW1srKyq6ur4uLi29vbuLi4n5+ftbW1srKyzMzMnp6evb29p6entbW1qKiooKCglpaWpKSkurq6pqamp6enoqKiqampmZmZv7+/yMjIqamprq6upKSkn5+fqqqqrq6um5ub////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tra2vLy80tLSzc3Nv7+/wsLCsrKyuLi4vLy8wsLC0tLSv7+/wcHBwcHBtLS0urq6ysrK0tLSzc3NysrKwMDAxMTExcXFu7u7vLy8ysrKu7u7tra2tLS0r6+vu7u7vb29vb29srKyxcXFvb29vr6+urq6xMTEysrKs7OzwsLCyMjIwsLCuLi4wsLCtLS0wMDAvLy80tLSt7e3ubm5vr6+ubm5rKysISEhiIiIfn5+qampvb290tLS0dHR1tbWvr6+vr6+/Pz8wcHBycnJysrKzs7O5OTkxcXF2tray8vL19fX1tbWyMjIu7u7ubm5vLy8vLy8uLi4qqqqsrKytbW1u7u7srKyuLi4ubm5uLi4sLCwpqamtLS0xsbGr6+vtLS0s7OzsLCwk5OTOTk5t7e3sbGxqqqqpqamnp6esrKyxcXFrq6uxsbG3t7ezc3NwMDAs7OzwsLCqampq6urqqqqqamppqamsrKyrKysr6+vrKyssLCwra2tmpqapqamrq6usbGxvb29oaGhyMjIuLi4ra2tnZ2dr6+vlpaWl5eXpqamq6ur////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXFzs7Ox8fHw8PDr6+vxcXFwcHBtra2wMDAwMDAysrK1NTU0dHRy8vLnJyc0NDQ0dHR1dXV0NDQxsbGxMTEubm5xcXFzs7OycnJzMzMv7+/v7+/r6+vtbW1ubm5wcHBtLS0urq6w8PDuLi4tbW1rq6usLCwr6+vsrKyubm5tra2t7e3y8vLt7e3tra2vr6+wMDAwMDAzMzMxcXFvb29yMjIwMDAk5OTICAgqqqqw8PD3NzcsbGxzMzM1tbW1NTU6Ojo0NDQ5eXl1NTU2NjY1dXVz8/Prq6uurq6sbGx0tLS3d3dz8/P7+/v19fXw8PD0NDQsrKys7OzuLi4tbW1urq6u7u7ubm5s7Ozvr6+sbGxtLS0s7Ozq6ursbGxurq6u7u7wMDAqKiopqamo6OjtLS0tLS0ycnJr6+vsrKyqampwMDAx8fHvb29xsbGvLy8xcXFqampo6Ojra2tq6urn5+fpaWlqqqqp6enoKCgtbW1oKCgnZ2dqqqqoqKisLCwrq6ura2txcXFlJSUurq6oKCgqKionJycnJycmpqao6Oj+fn5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wsLCv7+/xsbG19fXwcHBwsLC09PTzs7Ow8PDz8/Px8fHyMjIzc3NyMjIvb29yMjIycnJzMzM5+fnzc3NzMzM0NDQzs7OxsbGvb29v7+/t7e3u7u7ubm5tbW1t7e3urq6q6ururq6u7u7tLS0vr6+u7u7srKyp6ensLCwsbGxtbW1sLCwv7+/srKyrq6uu7u7vb29w8PDzc3NxcXFycnJyMjIyMjI0tLSiIiIZWVlubm5sLCwz8/Pv7+/3Nzc0tLSzc3Ny8vL6Ojo4ODg1NTUz8/Py8vLzs7Ovb291dXV09PT9fX15ubm2dnZ0NDQtra29PT0vr6+yMjIzMzMysrKvb29w8PDsbGxra2tycnJubm5ra2tuLi4tLS0r6+vu7u7ubm5s7Ozv7+/srKyqKioubm5qampuLi4wMDAsrKyqqqqs7Ozn5+fsrKyw8PDy8vLtbW1uLi42NjYr6+vqqqquLi4t7e3uLi4qqqqtbW1pqams7Ozt7e3vb29s7Oznp6epqampqamsrKytbW1qqqqm5ubmJiYoqKil5eXnp6esLCwqKio////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////y8vLxcXFvr6+zc3NxcXFy8vLyMjIxMTEwsLC0dHRy8vLysrKz8/PysrKzc3N1dXV4eHhw8PDycnJwcHByMjIyMjIwcHBu7u76+vrtbW1wcHBtra2ycnJvb29vLy8tra2urq6r6+vurq6paWls7Ozr6+vr6+vsLCwsLCww8PDuLi4ubm5sbGxsbGxtbW109PTy8vLxMTEw8PDysrKv7+/w8PDxsbGzMzMxMTEJCQkhISEuLi4urq6xMTEzs7O09PTx8fHyMjIzc3N2tra1tbW4eHh3d3d6enp9fX15ubm9fX16enp6urq2dnZycnJ9fX16enp3t7eycnJ3t7evr6+tLS0sLCwyMjItra2tra2w8PDvr6+rKyssLCwqKioubm5ubm5v7+/u7u7wcHBqampp6enurq6sLCwh4eHrq6uqampqKioqampxMTEv7+/paWls7Ozrq6uvLy8s7Ozq6uroaGhycnJwcHBsbGxt7e3tLS0rq6uqKiosrKyr6+vrq6uvr6+urq6qampp6eno6OjrKysrKysl5eXm5ubmpqavLy8rq6u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vr6+zc3NycnJzMzMwsLCvb29zs7O19fXzc3NvLy8x8fHzc3NwsLCyMjIvr6+t7e3zc3NycnJ+vr6zc3NvLy8xsbGvLy8w8PDvr6+xMTEzc3Nw8PDvr6+wcHBubm5ubm5pqamtra2xcXFtLS0wcHBv7+/wsLCq6urtbW1urq6sLCwsrKyu7u7vb29ra2tqqqqxcXFxMTEv7+/wcHB0tLS19fXyMjIy8vLtbW1wMDAQkJCHh4eubm5urq66OjoysrK3d3dxcXF0dHR4+Pjz8/P0NDQ6urqv7+/8fHx5+fn39/f5eXl1NTU8fHx6Ojo19fX////wsLCsLCwsLCwvr6+tLS0u7u729vbx8fHuLi4xsbGubm5vLy8tra24uLirKysu7u7sbGxuLi4t7e3urq6ubm5q6uro6Ojvb29srKyw8PDp6enxMTEsbGxtra2sbGxp6enq6urw8PDv7+/urq6rKys3t7epqamqqqqnZ2dsbGxvb29ra2toaGhtbW1q6uro6OjpqamkpKSo6Ojq6urqKioq6urmZmZlpaWqampoqKiyMjI////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wsLCzc3Ny8vLysrKz8/P0NDQz8/Pzc3N1NTUwMDAwsLCw8PDwsLCu7u73t7excXFrq6uwMDAQ0NDmpqaxcXFx8fHzMzMw8PDv7+/w8PDu7u7vLy8q6ur19fXsrKyxMTEtra2p6ens7Oz9fX1tbW1tbW1t7e3ubm5urq6s7Ozqqqqtra2s7OzsLCwr6+vtLS0y8vLv7+/xsbGwMDAyMjIvb29xMTE39/f1tbWw8PDxcXFZGRkWFhYt7e3sLCwz8/P0tLSu7u71dXV2dnZ6OjokZGRwcHByMjIycnJ5ubm29vb8vLyycnJ4uLi5OTk1tbW2NjY0NDQy8vLw8PDyMjIuLi4pKSku7u7vb29tLS0srKyt7e3q6urp6entLS0vr6+qqqqvLy8srKyt7e3uLi4rq6uu7u7qKiopqamp6enpaWluLi4qqqqqKiov7+/tLS0s7Ozqampp6ens7Ozra2trq6ur6+vnJyctLS0oqKirq6uq6urtra2tLS0s7Ozq6urr6+vsbGxra2tvr6+oqKitLS0oKCgq6uroKCglJSUmpqarq6u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zMzMzs7OysrKyMjI4ODgysrK4ODgurq629vbwsLCvr6+xMTEx8fHu7u7yMjIurq6pqamwMDAdHR0xsbGw8PDxMTEsrKyw8PDyMjIyMjItbW1xMTEu7u7w8PDxcXFvLy8s7OzsbGxsbGxtbW1ubm5rq6uxcXFw8PDuLi4qampvr6+tra2tLS0s7OzsbGxz8/PuLi4s7OztLS00tLSx8fHyMjIz8/PwcHByMjIwsLCw8PDwMDAsrKyxMTExcXFyMjI0tLSw8PD/f393d3d5+fnwMDA0tLSu7u7zc3N0dHRyMjI6enpysrK7e3t8fHx1NTU5+fn0NDQy8vLysrKtbW1uLi4ra2trKystra2vLy8v7+/q6uruLi4r6+vpqamsLCwsLCwtra2r6+vw8PDwcHBubm5uLi4vb29tbW1r6+vvr6+oqKi5eXls7Oz0dHRrKysubm5urq6nJycubm5qqqqx8fHs7Ozq6urubm5rq6urq6upaWlu7u7wMDAra2trKysqampoKCgxMTEsbGxmpqaoaGhtLS0jY2Nmpqaq6ururq6lZWV////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vb29xsbGzMzMzc3Nx8fH0NDQ1NTU0tLS0NDQ1tbWyMjIxMTE4+Pjzc3NwMDAv7+/w8PDnp6er6+v6+vrysrKz8/PwcHB3d3dwsLCw8PDwsLC1dXV29vbvb29sLCwuLi4vLy8vr6+wMDAw8PDtLS0s7OzsrKyvr6+tbW1s7OzsLCwsrKyp6enwsLCsrKytra2tLS0urq6vb29tLS0ubm5yMjIubm519fXx8fH3d3durq60NDQ3d3d6Ojox8fHycnJ3Nzc6Ojo+vr609PTz8/P2dnZnZ2d7+/v6+vrxcXFz8/P7u7u/v7+0NDQ2tra2NjY5OTk/Pz80NDQ1tbWrq6uwMDAtbW1pqamubm5rq6urq6urq6ut7e3rq6uqqqqra2ts7OzsrKyuLi4sbGxs7OzmZmZurq6tbW1xMTEubm5sbGxsrKyyMjIv7+/uLi44ODgr6+vt7e3i4uLvr6+r6+v2trasLCwsLCwtbW1wMDAv7+/x8fHpaWlra2tr6+vpaWlqKios7OzsrKyyMjIwMDAoaGhsLCwnZ2dra2ttbW1tra2o6Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Pj4ycnJvb29yMjIysrKyMjIysrK0dHR1NTU5+fn6enp+vr6zMzMzMzMvLy8wMDAuLi4uLi4uLi4yMjIx8fHxsbGw8PDxMTEuLi4vr6+yMjIw8PDvLy8vLy8tbW1urq6wMDAurq6tLS0urq6srKyuLi4sLCwz8/PsbGxs7Ozurq6vLy8urq6tbW1np6evr6+wcHBsrKyvb29xMTExcXFwsLCwcHBx8fH1dXV0dHR2trazMzMxsbGz8/P39/fzc3N0dHRx8fH3t7eubm5////19fXvLy81NTUy8vLx8fHxMTEyMjIxcXF0dHRxcXFzMzMxMTE0tLS0tLS6urqwcHBwsLCvb29t7e3t7e3uLi4v7+/tra2qampsrKyoqKisrKytra2tLS0wcHBurq6vLy8vr6+tra2uLi4rKysvb29urq6uLi4srKyoKCgsbGxvr6+qampwMDAt7e3srKys7Ozu7u7tLS02dnZv7+/qampr6+vqKior6+vwMDAo6Ojra2tra2tsLCwtbW1srKysLCwr6+vtbW1sLCwn5+frKyspKSkoKCgpqam////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ysrKxMTEy8vLx8fHwsLCycnJycnJ1NTU1NTU2dnZ6enpv7+/wMDAzs7OzMzM4+Pju7u7vr6+v7+/u7u7wcHBtbW1urq6urq6wcHBwsLCvr6+t7e3vb29uLi4vb29vb29urq6tLS0wMDAtLS0u7u7wMDAwMDA1NTUz8/Pt7e3uLi4vr6+0tLSv7+/zc3Nubm5tra2vLy8ubm5u7u7u7u7wcHBtra20tLSzMzM5OTkx8fHzs7Ovb29zMzM0NDQx8fHysrK1NTUzc3N5+fnzMzMx8fHvr6+vb29vr6+wMDAw8PD/v7+tra2+vr62dnZwMDAwMDAvb292tra2NjY2NjYvb299/f3r6+vtLS0oqKirq6us7OzqqqqtbW1o6Ojp6ens7OzxsbGsbGxvb29vLy8sLCwtLS0qampvr6+vr6+qqqqubm5tLS0ubm5tra2pqamra2tsbGxsbGxsrKyyMjIycnJwsLCx8fHxsbGubm5u7u7tLS0s7Ozvr6+vLy8u7u7vb29tra2wcHBqKion5+fyMjInZ2drq6ukpKSqamppqampaWl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vb29tbW1y8vLurq619fXy8vL3t7eycnJzMzM39/f5ubmzMzM0dHRycnJ0dHRyMjIxsbGycnJxMTEzMzMvr6+x8fHvr6+zs7OxcXFysrKxMTEvLy8x8fHvLy8urq6urq6vb29wMDAwMDAtbW1pKSkt7e3vr6+t7e3vb29ycnJsbGxs7OzxMTEr6+vvLy8s7OzwMDAxcXFtbW1tra2vr6+t7e3ysrKxcXF09PTx8fHzMzMwsLCwsLC1tbW9/f3ycnJ0dHR/f398/PzwsLCycnJysrKxcXFwsLCycnJvb29x8fHxcXF0NDQl5eXh4eHvb29vLy809PTysrKtra2xsbGycnJ0NDQxsbGrq6uvr6+tLS0s7Ozrq6uqKiosrKyra2tr6+vrKystbW1v7+/wcHBp6enrKysubm5uLi4tbW1ubm5uLi4vr6+tra2ra2t1tbW7e3tx8fHtra2wsLCw8PD09PTtLS06enp1NTUy8vL0NDQsbGxoaGhqamprKysqamprKysoqKirq6upKSkv7+/r6+vubm5np6et7e3srKynp6erKys////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/PzysrK4ODgzc3NwMDAw8PDzs7OxMTEz8/P6urq39/f09PT1tbWzMzMuLi40NDQ9PT00dHRvr6+3Nzc+/v76+vrx8fHw8PDx8fHvLy8zc3NuLi4wMDAxsbGvLy8xcXFuLi4urq6wMDAvb29wcHBwcHBs7Ozx8fHxcXFtbW1wMDAqqqqwsLCv7+/ubm5srKyuLi4u7u7xsbGvb29xcXFvr6+wcHBtbW1wcHBxcXFxsbGx8fHxsbGysrKr6+vycnJ5+fn39/f9PT01NTU4eHhxMTEwMDAvb29tbW1uLi4r6+vn5+fu7u7wMDAnJyctLS0v7+/+Pj4tLS0vr6+xsbGwcHBvb29vLy86urqsbGxtLS0qKiosbGxs7Ozr6+vurq6tbW1s7Ozn5+ftra2u7u7tbW1vr6+r6+vuLi4qKiotLS0srKyra2tuLi4ubm529vbubm5wsLCvb29zc3NsbGxr6+vr6+vpKSkurq6tbW1vr6+r6+vzc3Nubm5rKyssrKyvb29u7u7srKypaWlsLCww8PDsLCwvb29qqqqtbW1rKysp6ensrKy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9PT06enpxsbGuLi4x8fHwcHBy8vLv7+/4eHhy8vL2traxcXFrq6u19fXz8/Pzs7O4+PjxcXF0tLS39/f1tbW9PT08/Pz0NDQysrKvb29w8PDxsbGwMDAvr6+xcXFxsbGx8fHsLCwsrKypqamurq6x8fHv7+/vb29v7+/vr6+wsLCubm5vLy8yMjIwsLCx8fHxcXFv7+/w8PDwsLCwcHBvr6+xsbGyMjIyMjIz8/PyMjIvLy8wMDAx8fHtra2yMjItbW11NTU3d3d2dnZ7e3tvb29xMTEtra2vLy8p6enIyMjAAAAkpKSsrKy0dHRqKiowcHBz8/Pvb29wcHB0NDQx8fHwsLC39/ftra2s7OzsbGxsrKyt7e3uLi4v7+/paWlu7u7x8fHw8PDs7OzwMDAtLS0sLCws7Ozra2ttra2sbGxv7+/uLi4sLCwu7u7tra2sLCwsbGxsrKyubm5qqqqrq6utLS0vr6+t7e3vb294eHhtbW1oaGhubm5u7u7m5ubq6urs7OzsrKyr6+vqqqqoKCgrq6uqqqqq6urra2twsLCtbW1ra2t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3d3d09PTzMzMzc3Nx8fHw8PDyMjIycnJtbW1w8PDvb29xMTEycnJwsLC4uLixsbGx8fH3Nzc2NjY2NjY0NDQzMzM3d3dy8vL1NTUzc3NycnJt7e3ysrKyMjIwMDAzs7O3NzcsrKyp6enysrKxsbG2tra09PTysrKyMjIycnJx8fHv7+/urq6sbGxwsLCwsLCwMDAubm5v7+/wsLCtra2x8fHy8vLw8PD2tra19fXy8vLxsbGx8fHwcHBy8vLxcXFzs7OwsLC3t7ewMDAycnJvr6+urq6tLS0mJiYEhISsLCwnp6esLCwVVVVsbGxvLy8x8fHt7e3xMTEvb290NDQw8PD6OjoyMjIxcXFrq6uq6urr6+vurq6sbGxt7e3qqqqqKiou7u7srKyjY2NuLi4urq6wsLCrKysvb29vr6+ra2ttLS0ubm5q6ururq6ubm5t7e3tra2p6ent7e3srKytLS0tra2ysrKp6ens7OzoKCgw8PDra2trq6uvr6+xsbGvb29pKSksLCws7Ozq6urq6uru7u7oKCgpaWlpqamvLy8s7Oz5ubm////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8PDw7e3t19fXysrK1NTU3NzcxMTExMTEyMjIvLy8yMjI0dHRycnJ6enp5ubm/////Pz839/f+vr6xsbGy8vL0NDQ////+Pj429vbxsbGysrK09PT0NDQysrKy8vL0NDQw8PDycnJyMjIxMTE5ubmysrKzs7O1NTUzs7O1NTU0tLSvb29zs7O2NjY7e3t3Nzc3t7e3NzcuLi46enpv7+/tra2x8fH29vb4uLiyMjIxsbG1dXV0tLSwcHBwsLCw8PDx8fHyMjIyMjIwMDAvr6+v7+/tLS0j4+PnZ2doqKira2ttLS0t7e3s7Ozvb29u7u7wcHBu7u7tbW1urq6ubm5ycnJycnJuLi4v7+/zMzMu7u7vLy8o6OjoKCgrq6uuLi4qKio1dXVtra2s7Oztra2qKiooqKixMTEt7e3ubm5srKyvr6+tbW1wcHBqampsLCwrKyssrKyr6+vvr6+tra2srKys7Ozqqqqs7OzxMTE2NjY3Nzc5+fn6+vrs7Oztra2wMDAqKiotra2rq6upaWls7Oztra2o6Ojp6enqqqq09PTra2t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Pj45eXlzMzM7+/vxMTEy8vLw8PDyMjIyMjI+fn52NjYzc3Ny8vL+/v7wcHBm5ub7+/vwcHBx8fHz8/P2tra1dXV5eXl+fn5y8vL3d3dzs7Oy8vL2NjYx8fHu7u7x8fHw8PDvr6+vr6+wsLCz8/P19fXx8fHyMjI09PT1dXVysrKxcXFxMTEv7+/nZ2dysrK7u7uw8PDxsbG1NTUt7e3x8fHx8fHysrKv7+/ycnJtra2vb29ubm5wsLCysrKwsLCvb29y8vLw8PDxMTEwMDAwsLCwMDAwMDAWFhYvr6+srKyubm5wcHBubm5qamptbW1wcHBxcXFpKSkzMzMra2tuLi4u7u7r6+vwcHBwsLCurq6/v7+r6+vra2trq6usrKyu7u7xsbGtLS0r6+vtbW1wsLCuLi4srKyrq6utLS0t7e3urq6ubm5rq6upqamtLS0tbW1qqqqsLCwra2tra2ttra2sLCwr6+vwMDAsLCwsbGxtLS0qqqqurq6s7OzqampsbGxpqampaWlpKSky8vLv7+/rKyswcHBr6+vsbGxp6ensbGxo6Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////29vb6enpuLi4y8vLwMDA0NDQ09PT1NTUycnJ5eXl3Nzczc3N+Pj4ycnJy8vLw8PDxcXF0tLS1dXV/Pz86+vr0dHR/Pz85+fn09PT29vb0NDQx8fHz8/Pw8PDwsLCycnJvr6+vr6+vb29u7u7u7u7ubm5w8PD09PTv7+/vr6+vr6+w8PD0NDQwsLCtLS0qKioysrKxcXFzc3NvLy8xsbGsrKywsLCubm5ysrKx8fHt7e3xcXFwsLCyMjIwsLCv7+/z8/P0NDQxsbGtbW1oqKi1dXVvr6+u7u72NjYsbGxvr6+ycnJvLy8t7e3yMjIubm5u7u7v7+/vr6+yMjIvLy8uLi4vb29v7+/ra2twMDAxcXFp6entLS0tLS0ubm5tLS0srKyvr6+paWltbW1tLS0qqqqrKystbW1rKysra2tvb29srKysLCw////u7u7q6urrq6utra2srKysbGxsLCwt7e3urq6tra2sbGxvr6+XV1duLi4qqqqw8PDvb29vr6+ysrKzs7Ozc3NwsLCq6urrKys7e3tpKSkqamppaWlwcHBvLy82NjY////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9fX12tra3d3d0dHRzc3NyMjIzMzMycnJxMTEx8fHxMTExMTEubm5v7+/ycnJyMjIv7+/z8/PxcXFt7e36+vrtbW15ubm3t7e2tra09PTw8PDzc3N4uLiwsLCxsbGwMDAwMDAv7+/xsbGz8/Ptra2vr6+w8PDx8fHwsLCuLi4wMDAuLi4xcXFvLy8t7e3srKyvr6+t7e3wsLCvLy8vb29xsbGwMDAsLCwtra2u7u7wMDAq6urvr6+np6et7e3v7+/w8PDxMTEycnJw8PDtbW1xsbGu7u7vr6+wsLCtbW1tLS0ubm51dXVurq6t7e3v7+/rq6uu7u7urq6rKysuLi4yMjIu7u7ubm5ubm5uLi4tbW1qqqqtra2s7Ozt7e3wsLCsbGxtbW1wcHBrKysr6+vvLy8tra2pqamwMDArKysvb29rq6uurq6xcXFqampp6ens7OzrKysoqKin5+fsbGxs7OzsbGxs7Oztra2sbGxtLS0s7Ozurq6vb29tra2vb29wsLCysrKsLCwpqamn5+fu7u74eHhqqqqq6uro6OjuLi4q6urqamp9vb2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////29vb0NDQzs7OwcHBzMzMx8fH0NDQwsLCurq6ysrKu7u70dHRycnJyMjIzMzMxMTExcXFvr6+zMzMv7+/vr6+xcXFxcXFvLy8xMTEwcHBkpKSuLi4v7+/ysrKzc3Nw8PDxcXFzMzMw8PDu7u7tbW1w8PDycnJzc3NwsLCwMDAtbW1tra2tLS0u7u7wcHBr6+vxMTEs7OzycnJv7+/vb29vr6+w8PDs7Oz2dnZzc3NxsbGvr6+ycnJtra2xsbGxMTEvLy8x8fHu7u7t7e3x8fHx8fHwMDAtra2srKyxMTEv7+/ra2ttbW1wcHBuLi4srKyrq6uqampra2ttbW1qqqquLi4vLy8r6+vu7u7sbGxwMDAubm5sLCwr6+vtbW1ubm5tLS0tbW1vb29uLi4ubm5ubm5u7u7vr6+v7+/sbGxt7e3tbW1r6+vuLi4tLS0paWlqKior6+vtra2tbW1s7Oztra2tra2tra2tra2uLi4uLi4t7e3srKyubm5qamprq6uwcHBvr6+oaGh2tray8vLqampqqqqra2tqKiooKCgrq6urq6uuLi4////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xsbGysrKz8/Px8fHy8vLz8/P0dHRw8PDy8vLwMDAwMDAxMTEwcHB1NTUy8vLv7+/wMDAysrKysrKy8vL0tLSy8vL0tLSxsbGzMzMzMzMzc3NysrKvr6+vb29wsLCxMTEurq6v7+/tra2vr6+uLi4wMDAuLi4tra2tra2wcHBmpqatLS0vr6+urq6t7e3urq6urq6q6urvr6+ubm5tLS0ra2tsbGxtra2ubm5wcHBvb29urq6vr6+x8fHwcHBwsLCwcHBwcHBwsLCxMTErKyssbGxvb29uLi4p6envLy8v7+/pKSkxcXFvLy8ubm5t7e3tLS0pqamv7+/qampsbGxtLS0vLy8r6+vuLi4u7u7tbW1ra2ttLS0sLCwqampr6+vpaWlpaWluLi4srKyubm5t7e3ra2tsLCwvb29rq6uuLi4wcHBurq6s7Ozvb29tbW1xsbGq6urpqamq6urtLS0np6epaWlubm5qqqqsrKytLS0rq6usrKytbW1srKytLS0q6urwMDAubm5q6urtbW1tLS0pKSkrKyssbGxmpqaqqqqrKystbW1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8fHzs7OzMzMxMTEyMjIysrKvr6+wsLC3NzcyMjIycnJvLy8xsbGycnJwMDAtbW15+fnxcXFwMDAvr6+yMjIvr6+zc3NycnJwsLCycnJw8PDv7+/xcXFyMjIwMDAt7e3vLy8wsLCs7OzxMTExMTEtbW1v7+/ra2tvb29rq6uuLi4tbW1uLi4tLS0qqqqwcHBwsLCvr6+uLi4sLCwyMjIvr6+vLy8xMTEwMDAu7u7ubm5ra2tu7u7tra2x8fHwMDAz8/Pvr6+vr6+wcHBxsbGzs7OycnJwcHBs7Ozubm5srKywsLCu7u7urq6tLS0vr6+vb29tra2rKysqKiotra2tLS0s7Ozq6urtbW1rKysp6entra2tra2tbW1rKyssbGxoqKipqamvLy8tbW1x8fHqKios7OzuLi4q6urtra2wMDAtra2qqqqvb29uLi4q6urqqqqoqKiwcHBt7e3n5+fpaWlvLy8s7OznZ2dvLy8xcXFsLCws7Ozu7u7wcHBz8/Pvb29np6e29vbsbGxr6+vqKiooKCgm5ubmZmZqqqqrKysrKysvb29////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0NDQzMzMx8fHxcXFxsbGysrKv7+/v7+/w8PDubm5vb29jY2Nx8fHyMjIxcXFxMTEv7+/wcHBw8PDyMjIvb29yMjIo6Ojzs7Oy8vLx8fHw8PDx8fHsbGxtra2y8vLvb29v7+/zMzMxsbGyMjIwcHBxsbGwcHBvLy8urq6tbW1tLS0xMTExMTEubm5vLy8w8PDt7e3t7e3x8fHvLy8t7e3wcHBwcHBvr6+vb29wsLCu7u7urq6tra2t7e3wcHBwcHBurq6zc3NxMTEqampysrKxcXFy8vLv7+/t7e3wMDAvLy8xMTEvr6+sLCwtLS0vb29wMDAra2tsLCws7Ozs7OzrKystLS0t7e3tbW1tra2qampt7e3ra2tr6+vqqqqsLCwo6OjpaWlvr6+vr6+srKyvr6+wcHBtra2r6+vuLi4sbGxt7e3sbGxra2ttLS0u7u7tLS0t7e3sbGxvLy8rq6utLS0y8vLu7u7rq6uurq6sLCwrq6ut7e3s7Ozqamprq6uw8PDs7OzsLCwzs7Oqampqampx8fHurq6paWlp6enr6+vmpqa////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8vLyzMzM0NDQz8/PycnJyMjI0NDQxsbGxcXFxsbGzc3Nx8fHvLy8uLi4y8vLycnJy8vL2NjYysrKwsLCrq6uuLi4ysrKwMDAtra2vr6+tra2vr6+sbGxurq6wcHBd3d3xcXFxcXFvLy8w8PDyMjIxMTExcXFv7+/urq6t7e3urq6tra2xMTEvr6+wsLCwsLCwMDAv7+/srKy4+PjwMDAw8PDysrKvb29wsLCuLi4tbW1tLS0wMDAwMDAxsbGvr6+vb29qampxMTEv7+/xMTEvb29w8PDx8fHwsLCubm5t7e3pqamysrKvr6+ra2tubm5qKiosbGxtra2tLS0r6+vvr6+tbW1sbGxubm5srKyqqqqvLy8v7+/ubm5vLy8sbGxtLS0qqqqwMDArq6usLCwo6Ojv7+/wsLCq6urwcHBtLS0vr6+rKystbW1sLCwtra2xsbGqqqqsLCwra2tsLCwqamps7Ozrq6usLCwrKysqqqqubm5t7e3rq6uubm5tLS0srKysLCwr6+vvb29qamppaWlqKion5+ft7e3rq6up6enra2toqKi////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vr6+yMjIzs7Ozc3NycnJwsLCycnJxcXFzMzMz8/PxsbGw8PDvb29Y2Njubm5ysrKwsLCxMTEwsLCxsbGxsbGxcXFv7+/ubm5wcHBwcHBvb29xMTExcXFyMjIxcXFxMTEwcHBt7e3wsLCxMTE1NTUysrKycnJxsbGzs7Ov7+/t7e3u7u7vLy8vLy8uLi4tbW1wMDAra2txcXFvb29wsLCx8fHubm5urq6w8PDvb29wMDArKyswMDAsrKywsLCw8PDubm5xMTEvr6+ubm5w8PDu7u7ubm5ubm5wsLCu7u7vr6+t7e3wsLC7+/vubm5wMDAuLi4tLS0qamptLS00NDQwsLC5ubmsLCwsbGxq6urra2tuLi4urq66enpubm5tbW1q6uroaGhv7+/u7u7p6entLS0wMDAwcHBvb29sLCwuLi4srKysbGxsbGxs7Ozubm5r6+vubm5tLS0qqqquLi4wsLCrq6urq6upqams7OzuLi4oqKiq6urtbW1rq6uoqKisrKytra20tLSs7OztLS01NTUra2tsrKynp6epaWlrKysmZmZrq6u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ysrKy8vLzc3NwsLCvb29ysrKwcHB09PTwsLCxcXFy8vLv7+/vr6+vr6+xcXFwMDAwcHBwsLCxcXFycnJy8vLvb29xcXFy8vLwcHBvr6+vb29v7+/ra2twcHBv7+/xMTE4ODgx8fHx8fHwMDAwsLCy8vLxcXFwcHByMjIvr6+xMTEyMjIxMTExcXFvr6+wsLCzMzMwsLCvLy8vLy8t7e3v7+/xsbGt7e3vLy8wcHBsLCwubm5vr6+sbGxtLS0vr6+vr6+ubm5vr6+wMDAvb29vr6+tra2v7+/v7+/wMDAurq6vr6+ubm5uLi4qamptbW1tLS0qampqKiov7+/yMjIsLCwt7e3q6urs7OzsLCwwMDAu7u72trax8fHxsbGtra2mZmZrKystLS0u7u7vLy8ubm5wcHBsLCwtbW1urq6tLS0ubm5r6+vsbGxsLCwt7e3qqqqvLy8pqamtbW1wMDAs7Ozr6+vpqamrq6uvb29srKyr6+vtLS0urq6uLi4oKCgrKysoKCgurq6ra2tubm5sbGxwsLCwsLCrq6uoqKipqamlZWVycnJ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////29vbz8/PxcXFw8PD1NTU0tLSxMTEy8vLzc3NxsbGzc3NwsLCtLS0wMDAyMjIv7+/x8fHx8fH09PTyMjIycnJw8PDwcHBwsLCxcXFxsbGyMjIurq6xMTEx8fHwcHB8PDw0dHR6Ojov7+/wcHBycnJubm5x8fHu7u7wMDAsrKyvLy8tLS0wcHBw8PDxcXFxcXFxsbGysrKwcHBzMzMxcXFwcHBtra2ysrKv7+/yMjIxMTExcXFubm5wcHBvr6+ubm5wsLCyMjI0dHRwMDAvLy8wcHBxsbGwcHBtra2tbW1xsbGsbGxu7u7sLCwsbGxrKyssLCwsbGxs7OztLS0sbGxs7OzpaWlsbGxn5+fsrKytbW1ra2tr6+vtra2ra2tqqqqzMzMsrKyl5eXu7u7vb29srKywsLCu7u7srKyrq6uu7u7vr6+tLS0sbGxv7+/uLi4r6+vtbW1ubm5rq6upqampqamt7e3rq6up6enqampu7u7qKionZ2du7u7vb29sLCwra2tqKioysrK0NDQtbW1q6uro6OjsbGxu7u7n5+fvLy8tbW1sLCw////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1tbW0tLS09PTz8/Pzc3Ny8vLzs7OysrKzs7OxcXFx8fHyMjIvr6+vb29wsLCz8/Px8fH2NjYw8PDx8fHx8fHw8PDyMjIxcXFwMDAxsbG0NDQwcHB5ubmyMjIy8vLxcXFzMzMzc3NxcXFvr6+xsbG0NDQv7+/ycnJx8fHwMDAq6urqKioxMTEtra2s7OzlpaWwMDAxcXFzc3Nvb29ubm519fXu7u7ycnJt7e3wMDAvb29tra2vr6+xMTEwsLCt7e3xsbG3t7ez8/PyMjIvr6+vr6+v7+/wMDAv7+/vLy8ubm5vr6+sLCwqqqqm5ubra2tsLCwtLS0rq6usrKywcHBurq6tra2urq6srKyq6urtra2srKyqqqqu7u7vLy8urq6ra2tt7e3qqqqubm5srKywMDApaWlt7e3t7e3w8PDwcHBwMDAtLS0tLS0q6urs7OztLS0mZmZxMTErKysrKysm5ubtbW1pqamsLCwra2tq6urr6+vrKyss7Ozrq6uvLy8pqamtLS0vLy8pqamqKiorq6ur6+vrq6usLCwubm5rq6uoaGhoqKi////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0NDQysrKz8/P09PT0tLS0NDQ09PTzc3Nz8/Pzs7OzMzMy8vLy8vLwcHBw8PDwMDAzc3N1NTUr6+vwsLCwcHBxcXFxMTEurq6w8PDzs7Ou7u7wsLCwMDAzMzMw8PDurq6x8fHv7+/wcHBxcXFwMDAv7+/xMTEysrKv7+/uLi4tra2xMTEwsLCvr6+xMTEv7+/ysrKvr6+ubm5xMTEyMjIurq6w8PDvb29xMTEvb29t7e3wMDAxsbGv7+/tLS0tLS0vb29zc3N1NTUu7u7ycnJw8PDsLCwv7+/v7+/urq6rq6uubm5z8/PvLy8tbW1tbW1vr6+r6+vsLCwtra2t7e3rq6uvr6+tbW1rq6usrKysLCwsLCwr6+vsrKyeXl5j4+Ps7OzwcHBsbGxsLCwsLCwr6+vra2tubm5xMTEtLS0u7u70dHRsLCwrq6urKystLS0qqqqs7OzpKSkqqqquLi4sbGxr6+vr6+vn5+fra2trKyssLCwra2tq6ursrKyrKysrq6uq6urr6+vsLCwqqqqwcHBu7u7uLi4s7OzsLCwpKSkpKSkoKCg////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1dXVzc3N0tLS09PT1NTU0tLS0NDQ1NTUy8vLzc3N0NDQ0tLSzs7OycnJxsbGxsbGxcXFvb29y8vLyMjIycnJy8vLw8PDv7+/rq6uvr6+zs7OuLi4ysrKx8fHwcHBw8PDxsbGw8PDtra2v7+/wsLCq6urtbW1wcHBxcXFx8fHxMTEr6+vyMjIwcHBvLy8tra2wsLCwMDAsLCwwcHBqqqqurq6xsbGyMjIw8PDycnJwcHBurq6ra2ttbW1ubm5srKyv7+/tra2ra2twMDAw8PDu7u7yMjItbW1xMTEv7+/ra2tq6urx8fHr6+vvb29x8fHvb29sLCwvr6+tbW1xMTEtbW1vr6+qqqqrKysvLy8s7Ozs7OzqKiowcHBu7u7uLi4sbGxkJCQt7e3g4ODubm5ubm5ubm5u7u7q6ursbGxt7e3vr6+sLCwsbGxrKysuLi4urq6pqamq6urwsLCubm5sbGxra2tvLy8xcXFpaWls7OzqqqquLi4urq6vr6+p6enqqqqt7e3sLCwqKiov7+/w8PD9/f3xMTEq6urkZGRpKSkra2trKys4eHh////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z8/P1NTU0NDQzc3Nz8/P0tLSzMzM0NDQxsbG1NTUy8vLy8vLw8PDxMTEzs7OxcXFz8/PxsbGxcXFysrKxcXF2dnZycnJysrKwcHBx8fHvr6+sbGxwsLCwsLCxMTEwsLCwcHBycnJubm5sbGxtLS0ubm5v7+/wMDAx8fHubm5xcXFzMzMwcHBu7u7uLi4vLy8w8PDvr6+v7+/xcXFwMDAxcXFwsLCvr6+vLy8t7e3p6enurq6paWlu7u7xcXFvr6+t7e3ubm5ysrKvb29t7e3xMTEs7OzpqamlZWVubm5vLy8tra2ubm5ubm5vb29wsLCwMDAubm5vr6+tLS0sbGxs7Ozt7e3urq6r6+vsLCwpqamtLS0s7Ozvb29qqqquLi4q6urEhISq6urtLS0sbGxsrKyu7u7urq6s7Ozurq6tLS0q6urq6urn5+fr6+vpqampaWlurq6tLS0ra2trKystbW1xMTEra2trKysqKiosrKyw8PDu7u7q6ursLCwtra2s7OzrKyss7Ozubm5urq6urq6mJiYmpqaurq6rq6ulJSUurq6p6en////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXFxsbG0dHRx8fHysrKxsbGwsLCw8PDxsbGzs7OwsLCyMjI0tLSzMzMxcXFxcXFwcHBzs7Oz8/PxcXFx8fHv7+/xcXFu7u7ycnJyMjIvr6+ubm5zMzMzMzM29vbtra2x8fHx8fHwMDAvr6+u7u7uLi4rKyswcHBuLi4vr6+urq6ubm5yMjIy8vLwsLCvLy8wcHBvb29u7u71dXVubm5urq6tbW1v7+/tra2vb29urq6u7u7wcHBr6+vdHR0zs7OxMTEycnJx8fHurq6vr6+srKyubm5ubm5mZmZurq6tLS0rKyswcHBtLS0vb29ubm5t7e3tLS0tbW1ubm5uLi4wMDAuLi4xsbGra2tqampu7u7sLCwqampubm5uLi4uLi4sLCwRkZGODg4srKysLCws7Ozq6urvr6+q6urra2tv7+/xMTErq6uu7u7srKypKSkq6ursbGxvLy8ra2tqKiot7e3n5+fVFRUs7Ozq6urr6+vqqqqmpqaqampkpKSERERSEhIKioqXFxcr6+vsbGxxsbGtbW1qqqqrq6usbGxnp6esbGxr6+v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2trax8fHz8/Pw8PDyMjIy8vLv7+/v7+/x8fHycnJwsLCycnJubm5wMDAurq6y8vLysrKycnJwcHB0NDQ09PTz8/Pzs7OycnJurq6xMTExcXFurq6xsbGzMzMz8/P8fHx19fXxsbGv7+/urq6v7+/xMTExMTEtLS0xcXFxcXFvr6+y8vLzMzMurq6vr6+qampvb29vb29srKyy8vLubm5xMTEvb29vLy8rKysx8fHwMDAvr6+tra2wsLCw8PDqampkZGRhoaGp6enurq6rKyswcHBycnJxsbGwsLCc3NziYmJsrKyuLi4vr6+vLy8srKyvLy8ubm5ubm5vb29vr6+r6+vwcHBxcXFu7u7ra2tsrKyr6+vs7Ozt7e3vLy8uLi4sLCwqKiohISEAAAAKSkppqamv7+/u7u7t7e3tbW1ra2ttLS0qKios7OzwcHBqqqqpKSkr6+vt7e3pqamjY2NBwcHCgoKAAAAFRUVVlZWODg4fX19lJSUjY2Np6enn5+fqqqqqampqqqqqqqqoaGhlJSUr6+vsrKyrKysr6+vmpqar6+vrq6usLCw////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wMDAubm5yMjIyMjIzMzM0dHRvLy8vb29wMDAuLi4xcXFwMDAx8fHyMjIvr6+xMTE0tLSzs7OwcHBt7e3vb29wcHBwsLCwsLCx8fHubm5x8fHxMTEuLi4xsbGw8PD09PTxcXFvr6+wMDAqqqqtLS0wcHBx8fHw8PDsbGxt7e3vLy8x8fH1tbWyMjIsbGxysrK5eXlubm5wsLCurq6wcHBuLi4tbW1xMTEx8fHyMjIuLi4wsLCtLS0vb29xMTEsLCwubm5wcHBp6enrKysvr6+zMzMqampyMjIu7u7w8PDsbGxvr6+wsLCt7e3uLi4tra2tra2pqamt7e3uLi4sbGxsbGxtra2u7u7srKyqKiourq6i4uLtLS0srKyuLi4o6Ojrq6uwMDAsrKyn5+fAAAAZ2dnsrKyq6urqamptbW1p6entLS0rq6umpqanp6esLCwo6Ojs7OzampqcXFxSUlJr6+vmZmZsLCwpqams7OzoqKicnJyn5+fo6OjsbGxq6urra2toaGhpKSkmZmZpqamq6uroKCgqKioxcXFsbGxnJycv7+/rq6uqKio////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zc3NxsbGyMjIx8fHzc3NycnJycnJv7+/wsLCurq6ycnJy8vL0NDQyMjIwMDAxMTEs7OzxMTEzc3Nw8PDyMjIvr6+tbW1zc3Nw8PD09PTx8fHxsbGycnJx8fHxsbGwMDAubm5w8PDt7e3vb29srKy19fXr6+vvLy8sLCwwcHBxMTEysrK0NDQ0tLS3t7ezMzMv7+/6enpqampvb29xsbGqampwsLCtLS0pqamtra2urq6vr6+s7OzwMDAubm5vb29tbW1uLi4vLy8uLi4v7+/vLy8vr6+xsbGv7+/u7u7xcXFurq6wMDAwcHBwsLCv7+/t7e3s7OzvLy8sbGxtLS0ubm5sbGxsbGxrq6up6eni4uLb29vkJCQZWVln5+fsrKyMzMzvLy8T09PIyMjAAAAGhoaHBwcsbGxq6uro6OjsLCwpaWll5eXLy8vGhoatra2s7OzuLi4srKyp6enrq6urKystbW1ra2tnZ2drq6upaWlrq6urKysq6urm5uboqKinJycpaWlmZmZoKCgoaGhra2tpKSknp6esbGxpqamtra2q6urvb29////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0dHRzMzMz8/P0NDQyMjI1dXVwcHB0NDQxMTEyMjIxcXFwMDAx8fHv7+/xsbGycnJysrKxMTEwMDAvb29u7u7qampv7+/ubm5vb29v7+/x8fHvb29xsbGyMjIvb29wcHBuLi4sbGxvr6+vb29tra2pKSkv7+/wcHBvLy8tbW1yMjIv7+/y8vLzMzM29vb1dXV7OzsysrK09PT6OjowcHBwsLCurq6vr6+xMTEtLS0wcHBycnJt7e3wsLCxcXFtra2tra2sbGxv7+/q6ursLCwra2txMTEtLS0vr6+xMTEtLS0u7u7xsbGsbGxs7OzvLy8srKyvb29w8PDsLCwtbW1np6ep6ent7e3w8PDurq6tLS0sbGxu7u7bW1tgYGBbGxsY2NjAAAAFRUVnZ2djIyMoaGhqKioo6OjpKSktLS0sbGxtbW1kpKSs7Ozs7OzqqqqsbGxpqamubm5ubm5s7Ozpqamp6enpKSkpqamr6+vqKiooqKioaGhoqKiqampq6urtra2mpqaoaGhmpqaqKiot7e3qampwMDAra2tpKSkra2ts7Ozo6Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8PDwzc3N1NTU1NTU1dXV09PTx8fHzMzMvr6+v7+/xcXFzc3NxcXFqqqqx8fHxcXFxMTEx8fHwsLCxMTExcXFyMjIvb29ycnJwsLCuLi4x8fHzMzMurq6vb29wMDAvb29zMzMu7u7vb29t7e3tbW1vr6+w8PDurq6t7e3vb29w8PDvb29x8fHxMTExMTExMTE2tra7u7uwsLCxMTEw8PDs7Ozvr6+v7+/u7u7vLy8s7Ozv7+/urq6s7OztbW1ycnJvb29tra2pqamtra2t7e3p6enr6+vu7u7vb29s7OzzMzMtra2xcXFs7Ozrq6utLS0urq6vLy8t7e3q6urt7e3wsLCuLi4paWlpKSkurq6sbGxmZmZmpqavLy8srKytbW1goKCvb29sbGxPDw8tLS0tbW1ubm5vb29tra2sbGxra2tv7+/eHh4tLS0pqamqamprq6ut7e3vb29rq6uurq6qKior6+vpKSkrq6uo6Ojp6ennJycxsbGra2tsLCwtbW1pqampKSkm5ubmpqaqqqqs7Ozqamppqamr6+voaGhq6urq6urpKSkp6en////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3Nzc1dXV0dHR0NDQzs7O29vbyMjIyMjIu7u7u7u709PTw8PDwcHBvr6+yMjIvb29s7OzuLi4ubm5wcHBycnJyMjI1NTUxcXFwMDA0dHR2dnZwcHBysrKvr6+sLCwvLy8xMTE0NDQzs7OvLy8urq6wMDAtbW1srKywMDAsrKyu7u7ubm5uLi4w8PDurq6vr6+xcXF0NDQsrKyyMjIvr6+vb29vb29v7+/zc3Nr6+vxcXFx8fHurq6srKyvb29uLi4yMjIoqKirKystLS0sbGxvLy8urq6uLi4srKyvb29tbW1rq6uvr6+tra2tbW1tbW1s7OztbW1uLi4sbGxrq6ur6+vq6urr6+vu7u7Nzc3QEBAurq6tLS0oKCgrq6ufHx8o6Ojvr6+qqqqtbW1tbW1o6Ojo6OjsrKyp6enra2tubm5u7u7p6ens7OzpaWlqqqqsbGxp6enr6+vqampt7e3q6uro6OjqqqqsLCwmZmZoaGhpaWlq6urq6urmZmZnZ2dm5ubpqammpqalZWVpKSkoqKim5ubn5+fmpqalZWVqqqqxsbGoaGhw8PD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19fX2NjY09PTz8/Pzs7O1dXV0NDQzs7OxsbGx8fHxcXF1dXV0dHRycnJxcXFzMzMxsbGw8PDs7OzxcXFsbGxxcXFycnJ09PTysrK2tra1NTUxsbGt7e3ubm5urq6tra2v7+/wcHBw8PDurq6vb29tra2v7+/r6+vu7u7vb29rKyssbGxrq6uw8PDvr6+wcHBysrKxcXFv7+/wMDAqqqqwcHBt7e3srKyvb29s7Ozvb29tbW1urq6tra2sLCwurq6ubm5u7u7vLy8sbGxubm5x8fHtLS06urq2NjYvLy8xMTEubm5t7e3urq6r6+vtLS0vLy8tbW1qKioubm5n5+fs7Ozr6+vQkJCwsLCf39/pKSksbGxrq6upKSktbW1rq6uqqqqvLy8xMTE4ODgurq6sbGxurq6tra2v7+/pKSkr6+vtLS0rq6usbGxq6urtra2qqqqubm5pqamnJycs7OznZ2drq6uq6uro6OjqKiopKSkubm5qqqqlpaWmJiYoaGhrKysqKiopKSkrq6uqKioq6urs7OzpKSkuLi4ra2tra2trq6uqamp4+Pj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ysrKyMjI4+PjwsLCzs7Oz8/P1tbW09PTzs7OycnJz8/P0dHRubm5ycnJw8PDx8fHx8fHycnJs7OzycnJyMjIycnJ0NDQzMzMz8/P7Ozs3d3dxcXFysrKwsLCzMzMxsbGo6Ojqqqqr6+vubm5s7Ozvr6+sbGxsrKyoqKivb29srKyq6urt7e3pKSkvr6+xcXFubm5vLy8yMjIv7+/v7+/wMDAwMDAxsbGyMjItLS0wsLCu7u7yMjIw8PDxMTEvr6+v7+/tra2vb29u7u7vr6+xMTEwcHBs7Ozw8PD09PTzc3NzMzMxsbGvr6+wsLCtbW1ra2tsLCwsbGxvb29ra2tDQ0NISEhvLy8l5eXsrKyurq6sbGxsbGxsLCwsLCwvb29rKysuLi4ubm5+fn5yMjIxcXFu7u7wcHBwcHBpqamrKyspKSkrKyssLCwnp6ew8PDsbGxtra2wMDApKSkpqamoaGhubm5r6+vqKioqKioqampnJycoKCgo6OjsLCwr6+vvr6+nZ2dpKSkqqqqnZ2durq6oqKipKSkrKysp6enoKCgrKysxsbG////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zs7Ow8PDz8/P2tra7+/v1tbW1tbWw8PDzc3N0dHR0tLSzs7OyMjIycnJtbW1w8PDz8/Py8vLzMzMycnJycnJwsLC0tLS2tratra2zs7OxcXFsrKytra2xsbGwMDAxMTEtbW1tbW1r6+vt7e3tLS0q6urtLS0sLCwuLi4v7+/sbGxr6+vsrKyxsbGvr6+0dHRt7e3wcHBuLi4vr6+s7OzqKiotLS0wMDAv7+/wsLCyMjIwMDAxcXFvLy8xMTExsbGubm5v7+/v7+/v7+/wsLCubm5wMDAubm5yMjI2travLy8tra2vr6+zc3Nw8PDwsLCvLy8srKyvLy8r6+vo6OjwsLCqKiopKSkra2tpKSkpaWlt7e3pKSktra2ra2tvLy8vr6+tra2tra2sLCwtra2tbW1pKSkpKSkwcHBvb29qqqquLi4sbGxq6ur2NjY2dnZvLy8srKyp6enp6enp6envb29r6+vsbGxpaWlrq6usLCwr6+vvb29s7Ozt7e3ubm5oaGhq6url5eXwcHBsLCwrq6ulpaWqKioh4eHra2tqqqqrKyslJSU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1tbW2dnZzMzM1NTU0NDQxcXF0dHRvr6+y8vL0dHRy8vLy8vL09PTzs7OycnJycnJxcXFzMzMzc3Nz8/P0tLSycnJ0NDQ1NTUysrKycnJlJSUvb29xsbGwcHB0NDQwcHBwsLCubm5wcHBv7+/ubm5tbW1ra2tsLCwr6+vs7OzsrKyr6+vw8PDt7e3tLS0pKSkvb29tra2urq6sLCwsLCwsLCwvb29w8PDtra2vLy8u7u7v7+/vLy8ubm5xsbGvLy8sbGxt7e3rKysvb29vr6+sbGxxcXFvb29xMTEyMjIv7+/u7u7xMTEwsLCwsLCw8PDtra2sLCwrKysvLy8t7e3tbW1ubm5p6entra2ra2tra2tsrKyr6+vtbW1srKysLCwnp6ep6enuLi4vr6+s7OztbW1r6+vuLi4ra2tr6+vt7e3rq6uurq6ycnJr6+vrKysurq6s7OzoKCgqampsrKyvr6+rq6uqKiotbW1tra2pqamqampoqKis7Oz0tLSra2tvLy8oKCgtLS0qqqqt7e3tra2o6Ojr6+vrKysn5+fo6Ojm5ubmJiY9fX1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////y8vLycnJ0NDQ2NjY0tLSy8vLzs7OyMjI0dHRz8/P1NTUzs7Oy8vLy8vL0dHR0tLS0NDQxsbGz8/P4+Pj0tLS0NDQ0NDQzc3NwMDAzc3NyMjIzc3Nx8fHwsLCwcHBx8fH09PTwsLCvb29w8PDuLi4s7Ozr6+vvr6+u7u7wsLCurq6w8PDysrKsrKyvb29pqamysrKzMzMx8fHvr6+qqqqw8PDt7e3srKyt7e3xMTEv7+/yMjIxMTEv7+/qqqqubm5t7e3vr6+tLS0vLy8ubm5urq6vr6+vb29w8PDyMjIyMjIvb29tbW1tLS0sbGxuLi4vr6+ubm5vLy8u7u7sLCwubm5qKiorKysr6+vt7e3s7OzsbGxsbGxra2tpqamnZ2doKCgqKioqamptra2r6+vq6uruLi4pKSkvLy8nZ2dsLCwpKSkqampo6OjpqamoaGhpqamtLS0qampqqqqtbW1wcHBxsbGtbW1rKysqamppaWlo6OjsbGxtra2xsbGurq6pqamuLi4qKioqampra2tmpqaqKiolJSUrKyspqammJiYl5eXmZmZ9vb2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zs7O3Nzc09PT09PT1dXV0NDQyMjIysrKzc3NyMjI1NTU0tLSysrK09PTxcXFzs7Ozs7Ora2turq6z8/Pz8/PxMTEvb29yMjIw8PD09PTw8PDwcHBr6+vzs7Ozs7OxsbGvb29w8PDvLy8sbGxsrKys7OztLS0n5+fxsbGvLy8qampq6urv7+/qqqqrKysp6enxcXFu7u7t7e3oqKiubm5ycnJsrKyurq6uLi4wsLCuLi4xsbGra2tubm5wcHBv7+/wsLCtra2vr6+t7e3wcHBubm5uLi4tLS0vr6+uLi4uLi4urq6tLS04ODgsrKyt7e3ubm5zMzMu7u7vr6+vr6+t7e3srKysrKytbW1sbGxpaWltbW1rq6ut7e3srKyt7e3vb29qqqqtLS0qamptLS0tLS0pqamt7e3tbW1vr6+sbGxubm5ubm5s7OzsrKyuLi4vb29u7u7ubm5tbW1pqamsbGxtLS0u7u7paWlqqqqn5+frq6uoqKio6OjpqamqKiojo6Otra2pKSktbW1n5+fk5OToqKij4+PoqKinZ2doKCgoaGhra2t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6urqyMjI0dHRy8vL1NTU1tbW1tbWzs7Oz8/Px8fHwsLCx8fHysrKwcHBy8vLyMjIzc3Nvr6+1tbWzc3NzMzMy8vLsLCwv7+/zMzMx8fHuLi4y8vLzc3Nqampy8vLwcHBv7+/ycnJvLy8zc3Ny8vLysrKvr6+tLS0vr6+sLCws7Ozr6+vrKysvb29vb29oKCgtLS0ubm529vbsbGxt7e3u7u7qqqqtLS0tbW1v7+/xMTEt7e3vLy8s7Oztra2wsLCwcHBsrKywMDAvb29vr6+xsbGurq6yMjIwsLCtLS0s7Ozt7e3vb29srKyxcXFxcXFwcHB6urqt7e3vLy8uLi4ubm5wMDAxMTEtLS0sLCwqqqqsLCwqKiot7e3pqamp6env7+/paWlq6ursLCww8PDt7e3pqamuLi4qampu7u70NDQubm5xcXFuLi4qampuLi4rq6urKystbW1o6Ojo6Ojr6+vtra2pqamwcHBra2tt7e3sbGxqampsbGxpqamoaGhp6enpaWlpaWls7OzmpqapaWlnJycmJiYq6urnJycjY2Nm5ubn5+fkJCQ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wcHBycnJwMDAysrKxMTE0tLSz8/P29vbysrK1NTUxsbGycnJz8/PzMzM1NTUx8fHq6urmpqa1dXVy8vLysrK0dHRx8fHysrKsrKywcHBx8fHysrK1dXV1dXV09PTw8PDwMDAyMjIubm5srKyx8fHxcXFzc3Nurq6ubm5urq6u7u7srKyubm5oaGhr6+vrq6uyMjIvLy8xMTEwcHBtLS0sbGxvb29urq6vLy8vr6+tbW1ubm5qqqqubm5wcHBvLy8w8PDw8PDxMTEt7e3wMDAt7e3vr6+r6+vvb29wMDAra2turq6sbGxrKyssbGxvLy8ubm5v7+/u7u7vr6+u7u7urq6uLi4sbGxu7u7rKysqKiourq6ubm5tra2pKSknp6evLy8urq6vb29qqqqra2twsLCsrKyqqqqtra2srKyv7+/paWls7Ozs7Ozr6+vubm5qqqqqqqqtbW1qampra2toKCgr6+vr6+vr6+vpqamsLCwt7e3pqamn5+fqampm5ubm5ubtbW1s7Ozn5+fu7u7nJycn5+fq6urkpKSkZGRkpKSmZmZn5+f8/Pz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wMDA19fXxcXFurq6yMjIycnJxcXFxcXFzs7Oz8/P1NTUz8/P0tLSzMzM0tLS0dHRzc3N0NDQxcXF0dHRzMzM0dHR0tLSy8vLx8fHycnJurq6u7u7wcHBvr6+ycnJvLy8xcXFvLy8u7u7w8PDxMTEu7u7sbGxxMTEsrKyurq6tbW1tbW1urq6sLCwrq6utra2srKyt7e3uLi4ysrKtra2p6ensrKyubm5sbGxv7+/wMDAu7u7ubm5urq6sbGxurq6u7u7rKysw8PDwMDAvLy8urq6wMDAuLi4rq6ux8fHt7e3sLCwu7u7urq6tra2vb29sbGxw8PDtra2ubm5qampvb29pqamrq6uvr6+rq6urq6uqKios7Ozp6enqKiopKSkoqKiqKioqampq6urqKioq6urs7OzsbGxsrKypqamsbGxsrKyt7e3qampqKiosbGxubm5qqqqsrKyt7e3tLS0srKyrq6uwcHBrq6umpqara2tqqqqoKCgsbGxra2tpqamrKyssbGxpaWlr6+vnJycsLCwq6urmpqarKyspqampaWlqamprKys9fX1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3NzcxMTE09PTxMTEwMDAxcXFxsbGzs7OwMDAxMTEzc3NzMzM2NjY2NjYxMTE0tLSzMzMycnJycnJy8vLysrK1tbWz8/Pzc3N09PTy8vL09PT0tLSzMzMyMjIu7u7z8/Pubm51tbWubm5t7e3xcXFtbW1tbW1vLy8wMDAv7+/qqqqq6urs7Ozo6OjqqqqwsLCu7u7uLi4t7e3p6entra2v7+/vb29w8PDubm5tLS0pqamuLi4xMTEuLi4sbGxt7e3rq6uyMjIy8vLvLy8xcXFuLi4u7u7wMDAsrKysrKyxMTEsbGxs7Ozt7e3tra2tra2qampubm5w8PDtra2tra2srKyr6+vr6+vwcHBqqqqsbGxqqqqqqqqsLCwwMDAn5+fmJiYq6urs7Ozpqamtra2wsLCxsbGt7e3vb29wcHBwcHBu7u7vr6+oaGhuLi4qampqqqqsrKywMDArKysq6urqKioqqqqubm5rKysurq6m5ubp6entLS0oKCgp6ent7e3sLCwq6urnp6ep6enpKSkmpqapKSkqqqqrKysqqqqn5+fpaWln5+fsbGx////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2dnZyMjIyMjIzMzMw8PDwcHB1NTUu7u7vLy8zMzMx8fHx8fHy8vL3d3d19fXzs7Ozc3N0tLSwcHBycnJyMjIzs7OycnJxcXFxcXFzc3NxcXF1NTUw8PDxcXFqqqquLi4vLy8xsbGw8PDxMTEuLi4wMDAs7Ozubm5wsLCuLi4y8vLwMDAqampurq6wsLCsLCwpKSkra2tnp6etra2qKiowMDAu7u7sbGxra2tt7e3rq6uqqqqsbGxwsLCtLS0vLy8ubm5tbW1urq6w8PDr6+vvb29sbGxt7e3uLi4wcHBurq6xcXFs7OzsrKyxMTEsrKywMDAqamprq6uqampv7+/vb29p6enrKysr6+vu7u7tLS0u7u7tbW1urq6sbGxs7OzsLCwt7e3sbGxuLi4ubm5wcHBvb29qampsLCwt7e3s7OzsrKyzc3Nvr6+tra2t7e3rq6um5uburq6s7Ozo6OjrKyspaWlrKysrKysra2ttLS0s7OztLS0rq6usbGxpqamlpaWoaGhnZ2dnZ2dr6+vr6+vs7Oztra2m5ubnJycmZmZkJCQoKCgnJyc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////sLCwyMjIurq6vr6+xcXFu7u7q6uryMjIxMTEzc3Ny8vLv7+/x8fHvr6+ycnJ0tLS0tLS0dHR0tLS09PTyMjIzc3N0tLSx8fH0tLSysrKyMjIu7u7urq6xMTEtLS0tbW13NzcxsbGw8PDu7u7urq6x8fHvr6+v7+/wsLCu7u7urq6vLy8urq6vb29t7e3uLi4r6+vtbW1s7Ozubm5q6urzc3NsLCwqampp6entbW1vb29uLi4v7+/u7u7zc3NxMTEvr6+tbW1srKyu7u7tra2sLCwtra2tra2vr6+ubm5wMDAtra2vr6+vb29tbW1wMDAsrKyv7+/wMDAoKCgxcXFsrKyrKysrKysv7+/vb29s7OzxMTEra2tt7e3sLCwqamprq6uqqqqvb29urq6tra2ubm5sLCwpKSkqampqqqqr6+vvLy8pqamtra2s7Ozvr6+r6+vpKSkr6+vpqamtbW1tra2oaGhra2tra2trq6uq6urqamppaWlrKysnZ2dnZ2dp6ensrKyqKiom5ubqqqqsrKytra2paWlsrKyrq6upqampqamra2twsLC////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+vr6ysrKu7u7xsbGwcHBxMTExcXFtbW1xsbGzMzMvb29zMzMxcXFyMjIxcXFx8fHz8/P0dHRxMTEwsLCvr6+0tLSzs7Ow8PDw8PDx8fHzMzMwMDAyMjIxcXFxcXFycnJvb29v7+/wcHBubm5vr6+2dnZtra2wsLCvr6+u7u7qampsLCwwcHBt7e3s7OzwcHBwcHBwsLCvLy8uLi4r6+vvr6+vLy8srKysLCwrKyssrKyq6ursrKysLCwqqqqr6+vpqamsrKyp6enw8PDw8PDv7+/uLi4n5+fxcXFwMDAurq6wsLCu7u7u7u7vLy8sbGxra2ttra2vr6+sbGxwsLCu7u7xsbGxsbGpqamyMjIvr6+vr6+uLi4srKyoaGhwMDAsrKyubm5urq6sLCwr6+vr6+voaGhtbW1vb29wsLCsLCwrKysqKiourq6tbW1ubm5sLCwvb29s7OzsrKyrKystbW1lZWVqqqqsrKyp6enwsLCt7e3ra2tsrKyv7+/xsbGv7+/qqqqqqqqpqamoqKisrKyrq6uqKiorKyspqamnJycl5eXmJiYpKSk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8fHwsLCwsLCyMjIyMjIysrKu7u7v7+/w8PDsrKyyMjI1tbWvLy8sbGxyMjIx8fHysrKy8vLw8PDycnJvr6+vLy80NDQysrKwMDAysrK09PTx8fH2tray8vL0tLSx8fHtra2vb29t7e3t7e3u7u7s7OzvLy8tra2np6es7Ozra2tzc3NyMjIwsLCx8fHwsLCxcXFv7+/r6+vr6+vtra2t7e3vr6+ra2tqamprKysubm5urq6r6+vt7e3paWlrq6utbW1q6urqqqqsbGxwcHBsrKy2NjYra2trKysvLy8s7OzsrKyqqqqu7u7n5+fw8PDvb29rq6uqKioo6Ojw8PDxsbGwcHBsbGxo6OjysrKwMDArq6uxcXFoqKioqKirKyspaWluLi4vr6+ubm5qqqqs7OzqamptbW1vLy8vb29u7u7sbGxo6OjtLS0u7u7qqqqsLCwr6+vt7e3sLCwuLi4ubm5vr6+qKios7Ozn5+fpqamt7e3uLi4s7OzsLCwpaWlt7e3tbW1rKyspaWlrq6ufX19tbW1pqamnp6esbGxnJycqKioo6Ojq6ur////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ycnJx8fHv7+/y8vLxsbGvLy8y8vLxsbGysrKwcHBvb29u7u7xMTEubm5vLy8vr6+w8PDwcHBz8/PxsbGysrK0tLSwMDAwsLCwcHBx8fHwcHBwMDA09PTx8fHwsLCx8fHsbGxw8PDvLy8ycnJsbGxt7e3vLy8wsLCtLS0ZGRkn5+fpaWlt7e3xsbGw8PDq6ury8vLr6+vv7+/u7u7ubm5w8PDwcHBs7Oztra2rq6uq6urxMTEr6+vtra2ubm5s7Ozs7OztLS0tLS0tbW1v7+/wcHBtra2x8fHurq6ra2twsLCvb29vb29wMDAxsbGubm5uLi4tra2wcHBwcHBtLS0rq6utbW1p6enp6enmpqavb29tra2w8PDtra2tLS0vr6+sLCwvLy8ubm5wsLCrKysuLi4oKCgrq6utLS0u7u7wsLCubm5w8PDu7u7s7OzuLi4ubm5np6evLy8q6urvb29u7u7tLS0oKCgpKSkuLi4oKCgs7Ozo6Ojp6ent7e3rq6ur6+vr6+vn5+fpqamqKiompqarq6up6enm5ubp6enqampmpqam5uboqKi//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + + MatchVariable + + MatchVariable + + 1 + false + + + + UnionDimension + + UnionDimension + + 0 + false + + + + + \ No newline at end of file From fbdbd1013cfe9a1ede1fd9243818e3e1661fba80 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 18 Oct 2023 16:19:35 -0800 Subject: [PATCH 009/193] shorten line to under 120 characters --- image_services/opera/make_opera_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 7bf74081..276c2049 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -228,8 +228,8 @@ def main(): cell_size_tolerance=1.8, cell_size=3, metadata_level='BASIC', - transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;ZOrder;Dataset_ID;CenterX;CenterY;' - 'Tag;ProductName;GroupName;DownloadURL', + transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;ZOrder;Dataset_ID;CenterX;' + 'CenterY;Tag;ProductName;GroupName;DownloadURL', use_time='DISABLED', start_time_field='StartDate', end_time_field='EndDate', From 8482a6e7be427606c7406cf99a3010464e9d602b Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 18 Oct 2023 16:24:05 -0800 Subject: [PATCH 010/193] remove erroneous comma --- image_services/opera/config/rtc_vv.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index 79d2ff52..ced8e995 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -4,10 +4,7 @@ "s3_suffix": "_VV.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_Power.rft.xml", - "Sentinel1_RTC_Amplitude.rft.xml", - "Sentinel1_RTC_dB.rft.xml", "Sentinel1_RTC_dB_Stretch.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml" } From 5f284047d5a35d088d604a8c4aeccdc4b0f80d65 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 18 Oct 2023 17:20:42 -0800 Subject: [PATCH 011/193] Get newest updates to run --- image_services/opera/config/rtc_hh.json | 5 +- image_services/opera/config/rtc_hv.json | 5 +- image_services/opera/config/rtc_vh.json | 5 +- image_services/opera/config/rtc_vv.json | 3 +- image_services/opera/make_opera_services.py | 2 +- .../Sentinel1_RTC_Power.rft.xml | 115 ++++++++++++++++++ 6 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 image_services/opera/raster_function_templates/Sentinel1_RTC_Power.rft.xml diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index 3184d4e3..bcc32211 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -4,7 +4,8 @@ "s3_suffix": "_HH.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_dB_Stretch.rft.xml" + "Sentinel1_RTC_dB_Stretch.rft.xml", + "Sentinel1_RTC_Power.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml" + "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml" } diff --git a/image_services/opera/config/rtc_hv.json b/image_services/opera/config/rtc_hv.json index 50fe9ce4..d987ded9 100644 --- a/image_services/opera/config/rtc_hv.json +++ b/image_services/opera/config/rtc_hv.json @@ -4,7 +4,8 @@ "s3_suffix": "_HV.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_dB_Stretch.rft.xml" + "Sentinel1_RTC_dB_Stretch.rft.xml", + "Sentinel1_RTC_Power.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml" + "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml" } diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 1e17e268..5b8ce93b 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -4,7 +4,8 @@ "s3_suffix": "_VH.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_dB_Stretch.rft.xml" + "Sentinel1_RTC_dB_Stretch.rft.xml", + "Sentinel1_RTC_Power.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml" + "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml" } diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index ced8e995..b16374f7 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -4,7 +4,8 @@ "s3_suffix": "_VV.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_dB_Stretch.rft.xml" + "Sentinel1_RTC_dB_Stretch.rft.xml", + "Sentinel1_RTC_Power.rft.xml" ], "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml" } diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 276c2049..2a507390 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -133,7 +133,7 @@ def main(): args = parser.parse_args() bucket = 'hyp3-testing' - overview_path = '/vsis3/asf-gis-services/public/OPERA/' + overview_path = '/vsis3/hyp3-testing/opera-rtc-image-service-prototype/overviews/' template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' diff --git a/image_services/opera/raster_function_templates/Sentinel1_RTC_Power.rft.xml b/image_services/opera/raster_function_templates/Sentinel1_RTC_Power.rft.xml new file mode 100644 index 00000000..7a7d3087 --- /dev/null +++ b/image_services/opera/raster_function_templates/Sentinel1_RTC_Power.rft.xml @@ -0,0 +1,115 @@ + + Sentinel-1 RTC Power + Sentinel-1 RTC data in Power scale + + Calculator + Computes a raster from a raster based mathematical expression. + UNKNOWN + + + + Rasters + InputNames + Expression + CellsizeType + ExtentType + + + + Rasters + + + + Raster + + + true + + + + __IsRasterArray__ + + false + + + InputNames + + + in + + false + + + Expression + + in*1 + false + + + CellsizeType + + 2 + false + + + ExtentType + + 1 + false + + + + Displays original pixel values in Power scale. + 0 + C:\Users\hjkristenson\Documents\ImageServer\Thumbnails\RTC_Power.PNG + + + + + data:image/bmp;base64,Qk3uNwEAAAAAADYAAAAoAAAAyAAAAIUAAAABABgAAAAAALg3AQAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRUV////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////srKyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYW////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0dHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVV////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKioq////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoaGh////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAurq6////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKioqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0N////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////srKyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////hoaGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAExMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeXl5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2Nj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoa////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoa////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoa////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////srKyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2dnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Dg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0tLS////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRUV////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoa////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAISEhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhoaG////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwcHAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFAAAAAAAAAAAADg4O////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwsLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2NjY////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy8vAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMjI////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSkpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////HBwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAGBgY////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////srKyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoa////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////srKyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////srKyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eXlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2NjYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eXl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CwsLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + + MatchVariable + + MatchVariable + + 1 + false + + + + UnionDimension + + UnionDimension + + 0 + false + + + + + \ No newline at end of file From de4c415505e4bab089f2253002917ef318917ce2 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 19 Oct 2023 10:41:02 -0800 Subject: [PATCH 012/193] remove hyp3 profile --- image_services/opera/make_opera_services.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 2a507390..93b88167 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -151,7 +151,6 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' - os.environ['AWS_PROFILE'] = 'hyp3' rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) update_csv(csv_file, rasters) @@ -266,7 +265,6 @@ def main(): out_rasterdataset=local_overview, ) - os.environ['AWS_PROFILE'] = 'hyp3' logging.info(f'Moving CRF to {s3_overview}') subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) From c8f0c64b6c3dc87c3302a928916d76def89d7bd2 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 19 Oct 2023 11:54:25 -0800 Subject: [PATCH 013/193] update s3 bucket path --- image_services/opera/make_opera_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 93b88167..bd7f6d58 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -133,7 +133,7 @@ def main(): args = parser.parse_args() bucket = 'hyp3-testing' - overview_path = '/vsis3/hyp3-testing/opera-rtc-image-service-prototype/overviews/' + overview_path = '/vsis3/asf-gis-services/public/OPERA/' template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' @@ -229,7 +229,7 @@ def main(): metadata_level='BASIC', transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;ZOrder;Dataset_ID;CenterX;' 'CenterY;Tag;ProductName;GroupName;DownloadURL', - use_time='DISABLED', + use_time='ENABLED', start_time_field='StartDate', end_time_field='EndDate', max_num_of_download_items=50, From 26afefdfcae23486bc1c8ce6fd3fb15d949a8222 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 19 Oct 2023 14:16:25 -0800 Subject: [PATCH 014/193] Update cf permissions --- image_server/cloudformation.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/image_server/cloudformation.yml b/image_server/cloudformation.yml index 76000732..66bca64c 100644 --- a/image_server/cloudformation.yml +++ b/image_server/cloudformation.yml @@ -158,12 +158,14 @@ Resources: Action: - s3:ListBucket - s3:GetBucketAcl + - s3:GetBucketLocataion Resource: - arn:aws:s3:::* - Effect: Allow Action: - s3:GetObject - s3:GetObjectVersion + - s3:GetObjectTagging Resource: - arn:aws:s3:::*/* - Effect: Allow From 7ee5c9017dd3acd774b8f659fba4c6a2b61dd329 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 14:46:17 -0800 Subject: [PATCH 015/193] add time to start and end date --- image_services/opera/make_opera_services.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index bd7f6d58..f3b4f068 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -49,7 +49,7 @@ def get_raster_metadata(raster_path: str) -> dict: assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/VV/') key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' - + acquisition_date = name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47], name = Path(raster_path).stem info = gdal.Info(raster_path, format='json') return { @@ -65,8 +65,8 @@ def get_raster_metadata(raster_path: str) -> dict: 'PixelType': get_pixel_type(info['bands'][0]['type']), 'SRS': get_projection(info['coordinateSystem']['wkt']), 'DownloadURL': download_url, - 'StartDate': name[36:38] + '/' + name[38:40] + '/' + name[32:36], - 'EndDate': name[36:38] + '/' + name[38:40] + '/' + name[32:36] + 'StartDate': acquisition_date, + 'EndDate': acquisition_date, } @@ -133,7 +133,7 @@ def main(): args = parser.parse_args() bucket = 'hyp3-testing' - overview_path = '/vsis3/asf-gis-services/public/OPERA/' + overview_path = '/vsis3/hyp3-nasa-disasters/overviews/' template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' From 0213da35eed8cde8dbeb954086bae74bee75ee73 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 14:55:40 -0800 Subject: [PATCH 016/193] populate overview attribute fields --- image_services/opera/make_opera_services.py | 30 +++++++++++++++------ 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index f3b4f068..9b116f9a 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -98,8 +98,21 @@ def calculate_overview_fields(mosaic_dataset, local_path): print('Calculating field values for overview record') ds = os.path.join(local_path, mosaic_dataset) ds_cursor = arcpy.da.UpdateCursor(ds, ['Tag', 'MinPS', 'Category', 'StartDate', 'EndDate', 'GroupName', - 'Name', 'ProductType', 'Polarization', 'Tile', 'DownloadURL', + 'Name', 'ProductType', 'Polarization', 'DownloadURL', 'URLDisplay']) + + logging.info('Calculating Overview Start and End Dates') + start_dates = [row[1] for row in arcpy.da.SearchCursor(mosaic_dataset, ['Tag', 'StartDate']) if row[0] != 'Dataset'] + overview_start_date = min(start_dates).replace(microsecond=0) + datetime.timedelta(hours=-8) + overview_end_date = max(start_dates).replace(microsecond=0) + datetime.timedelta(hours=8) + + logging.info('Calculating custom fields for overview record') + selection = arcpy.management.SelectLayerByAttribute( + in_layer_or_view=mosaic_dataset, + selection_type='NEW_SELECTION', + where_clause=f"Name = '{overview_name}'", + ) + if ds_cursor is not None: print('Updating Overview Field Values') for row in ds_cursor: @@ -110,14 +123,15 @@ def calculate_overview_fields(mosaic_dataset, local_path): DLOvField = 'Zoom in further to access download link' row[0] = f'{ProdTypeOvField}_{PolOvField}__Overview' - row[1] = 900 + row[1] = 600 row[2] = 2 + row[3] = overview_start_date + row[4] = overview_end_date row[5] = f'{ProdTypeOvField}_{PolOvField} Mosaic Overview' row[7] = ProdTypeOvField - row[9] = PolOvField - row[10] = TileOvField - row[11] = DLOvField - row[12] = DLOvField + row[8] = PolOvField + row[9] = DLOvField + row[10] = DLOvField ds_cursor.updateRow(row) print('Overview fields updated') @@ -252,14 +266,14 @@ def main(): arcpy.management.CalculateFields( in_table=mosaic_dataset, fields=[ - ['MaxPS', '910'], + ['MaxPS', '610'], ], ) local_overview = os.path.join(os.getcwd(), local_overview_filename) logging.info(f'Generating {local_overview}') - with arcpy.EnvManager(cellSize=900): + with arcpy.EnvManager(cellSize=600): arcpy.management.CopyRaster( in_raster=mosaic_dataset, out_rasterdataset=local_overview, From 85548077415b9e8aa11946992bab5ce3313b8563 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 15:19:27 -0800 Subject: [PATCH 017/193] add publishing workflow --- image_services/opera/make_opera_services.py | 146 +++++++++++++++----- 1 file changed, 115 insertions(+), 31 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 9b116f9a..9e0ccc5d 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -5,15 +5,16 @@ import logging import os import subprocess +import tempfile from pathlib import Path from typing import List import arcpy import boto3 +from arcgis.gis.server import Server +from lxml import etree from osgeo import gdal, osr - -gdal.UseExceptions() -gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'EMPTY_DIR') +from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: @@ -138,6 +139,49 @@ def calculate_overview_fields(mosaic_dataset, local_path): del ds_cursor +def add_property(property_set: etree.Element, property_key: str, property_value: str) -> None: + xsi_type = etree.QName('http://www.w3.org/2001/XMLSchema-instance', 'type') + prop = etree.SubElement(property_set, 'PropertySetProperty', {xsi_type: 'typens:PropertySetProperty'}) + etree.SubElement(prop, 'Key').text = property_key + etree.SubElement(prop, 'Value', {xsi_type: 'xs:string'}).text = property_value + + +def build_wms_extension() -> etree.Element: + xsi_type = etree.QName("http://www.w3.org/2001/XMLSchema-instance", "type") + + svc_extension = etree.Element('SVCExtension', {xsi_type: 'typens:SVCExtension'}) + + etree.SubElement(svc_extension, 'Enabled').text = 'true' + etree.SubElement(svc_extension, 'TypeName').text = 'WMSServer' + + property_set = etree.SubElement(svc_extension, 'Props', {xsi_type: 'typens:PropertySet'}) + property_array = etree.SubElement(property_set, 'PropertyArray', {xsi_type: 'typens:ArrayOfPropertySetProperty'}) + add_property(property_array, 'name', 'WMS') + add_property(property_array, 'contactOrganization', 'Alaska Satellite Facility') + add_property(property_array, 'address', '2156 Koyukuk Drive') + add_property(property_array, 'addressType', 'physical') + add_property(property_array, 'city', 'Fairbanks') + add_property(property_array, 'stateOrProvince', 'Alaska') + add_property(property_array, 'country', 'US') + add_property(property_array, 'contactVoiceTelephone', '907-474-5041') + add_property(property_array, 'contactElectronicMailAddress', 'uso@asf.alaska.edu') + add_property(property_array, 'accessConstraints', + 'There are no restrictions on the use of this data, but it must be acknowledged or ' + 'cited as follows: "This imagery was generated by ASF DAAC HyP3 using GAMMA software. ' + 'Contains modified Copernicus Sentinel data, processed by ESA."') + add_property(property_array, 'title', '') + add_property(property_array, 'abstract', '') + + info_property_set = etree.SubElement(svc_extension, 'Info', {xsi_type: 'typens:PropertySet'}) + info_property_array = etree.SubElement(info_property_set, 'PropertyArray', + {xsi_type: 'typens:ArrayOfPropertySetProperty'}) + add_property(info_property_array, 'WebEnabled', 'true') + add_property(info_property_array, 'WebCapabilities', + 'GetCapabilities,GetMap,GetFeatureInfo,GetStyles,GetLegendGraphic,GetSchemaExtension') + + return svc_extension + + def main(): logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s') @@ -165,35 +209,39 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' - rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) - update_csv(csv_file, rasters) - - today = datetime.datetime.now(datetime.timezone.utc).strftime('%y%m%d_%H%M') - output_name = f'{config["project_name"]}_{config["dataset_name"]}_{today}' - overview_name = f'{output_name}_overview' - local_overview_filename = f'{overview_name}.crf' - s3_overview = f'{overview_path}{overview_name}.crf' - try: - logging.info('Creating geodatabase') - geodatabase = arcpy.management.CreateFileGDB( - out_folder_path=args.working_directory, - out_name=f'{output_name}.gdb', - ) - - logging.info('Creating mosaic dataset') - mosaic_dataset = str(arcpy.management.CreateMosaicDataset( - in_workspace=geodatabase, - in_mosaicdataset_name=config['dataset_name'], - coordinate_system=3857, - )) - - logging.info(f'Adding source rasters to {mosaic_dataset}') - arcpy.management.AddRastersToMosaicDataset( - in_mosaic_dataset=mosaic_dataset, - raster_type='Table', - input_path=csv_file, - ) + rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) + update_csv(csv_file, rasters) + + for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, + before_sleep=before_sleep_log(logging, logging.WARNING)): + with attempt: + today = datetime.datetime.now(datetime.timezone.utc).strftime('%y%m%d_%H%M') + output_name = f'{config["project_name"]}_{config["dataset_name"]}_{today}' + overview_name = f'{output_name}_overview' + local_overview_filename = f'{overview_name}.crf' + s3_overview = f'{overview_path}{overview_name}.crf' + service_definition = os.path.join(args.working_directory, f'{output_name}.sd') + + logging.info('Creating geodatabase') + geodatabase = arcpy.management.CreateFileGDB( + out_folder_path=args.working_directory, + out_name=f'{output_name}.gdb', + ) + + logging.info('Creating mosaic dataset') + mosaic_dataset = str(arcpy.management.CreateMosaicDataset( + in_workspace=geodatabase, + in_mosaicdataset_name=config['dataset_name'], + coordinate_system=3857, + )) + + logging.info(f'Adding source rasters to {mosaic_dataset}') + arcpy.management.AddRastersToMosaicDataset( + in_mosaic_dataset=mosaic_dataset, + raster_type='Table', + input_path=csv_file, + ) logging.info(f'Building raster footprints for {mosaic_dataset}') arcpy.management.BuildFootprints( @@ -289,6 +337,42 @@ def main(): input_path=s3_overview, ) + with tempfile.NamedTemporaryFile(suffix='.sddraft') as service_definition_draft: + logging.info(f'Creating draft service definition {service_definition_draft.name}') + arcpy.CreateImageSDDraft( + raster_or_mosaic_layer=mosaic_dataset, + out_sddraft=service_definition_draft.name, + service_name=config['service_name'], + ) + + tree = etree.parse(service_definition_draft.name) + + logging.info(f'Enabling WMS in {service_definition_draft.name}') + extensions = tree.find('/Configurations/SVCConfiguration/Definition/Extensions') + extensions.append(build_wms_extension()) + + logging.info(f'Editing service definition overrides for {service_definition_draft.name}') + for key, value in config['service_definition_overrides'].items(): + tree.find(key).text = value + + tree.write(service_definition_draft.name) + + logging.info(f'Creating service definition {service_definition}') + arcpy.server.StageService( + in_service_definition_draft=service_definition_draft.name, + out_service_definition=service_definition, + ) + + with open(args.server_connection_file) as f: + server_connection = json.load(f) + + for attempt in Retrying(stop=stop_after_attempt(3), reraise=True, + before_sleep=before_sleep_log(logging, logging.WARNING)): + with attempt: + logging.info(f'Publishing {service_definition}') + server = Server(**server_connection) + server.publish_sd(service_definition, folder=config['service_folder']) + except arcpy.ExecuteError: logging.error(arcpy.GetMessages()) raise From 3646481d44213b1d3c58cab8c86bdabd2f9fa87e Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 15:22:33 -0800 Subject: [PATCH 018/193] reorder date variable --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 9e0ccc5d..322fae9e 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -50,8 +50,8 @@ def get_raster_metadata(raster_path: str) -> dict: assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/VV/') key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' - acquisition_date = name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47], name = Path(raster_path).stem + acquisition_date = name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] info = gdal.Info(raster_path, format='json') return { 'Raster': info['description'], From ebd46295742ad65c73a5a98572b2046ea226b8af Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 15:32:21 -0800 Subject: [PATCH 019/193] clean up overview field calculation code --- image_services/opera/make_opera_services.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 322fae9e..e325a8df 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -107,20 +107,12 @@ def calculate_overview_fields(mosaic_dataset, local_path): overview_start_date = min(start_dates).replace(microsecond=0) + datetime.timedelta(hours=-8) overview_end_date = max(start_dates).replace(microsecond=0) + datetime.timedelta(hours=8) - logging.info('Calculating custom fields for overview record') - selection = arcpy.management.SelectLayerByAttribute( - in_layer_or_view=mosaic_dataset, - selection_type='NEW_SELECTION', - where_clause=f"Name = '{overview_name}'", - ) - if ds_cursor is not None: print('Updating Overview Field Values') for row in ds_cursor: if row[0] == 'Dataset': _, ProdTypeOvField, PolOvField, _, _, _ = row[6].split('_') - TileOvField = 'Zoom in further to see specific tile information' DLOvField = 'Zoom in further to access download link' row[0] = f'{ProdTypeOvField}_{PolOvField}__Overview' @@ -337,6 +329,9 @@ def main(): input_path=s3_overview, ) + logging.info('Populate overview attributes') + calculate_overview_fields(mosaic_dataset, args.working_directory) + with tempfile.NamedTemporaryFile(suffix='.sddraft') as service_definition_draft: logging.info(f'Creating draft service definition {service_definition_draft.name}') arcpy.CreateImageSDDraft( From 8096c95f424695572965e6ce4d3d8ce331f09d10 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 15:41:15 -0800 Subject: [PATCH 020/193] update OPERA VV config file --- image_services/opera/config/rtc_vv.json | 34 +++++- .../Sentinel1_RTC_Amplitude.rft.xml | 100 +++++++++++++++ .../Sentinel1_RTC_dB.rft.xml | 115 ++++++++++++++++++ 3 files changed, 246 insertions(+), 3 deletions(-) create mode 100644 image_services/opera/raster_function_templates/Sentinel1_RTC_Amplitude.rft.xml create mode 100644 image_services/opera/raster_function_templates/Sentinel1_RTC_dB.rft.xml diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index b16374f7..cdc34ef5 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -4,8 +4,36 @@ "s3_suffix": "_VV.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_dB_Stretch.rft.xml", - "Sentinel1_RTC_Power.rft.xml" + "Sentinel1_RTC_Power.rft.xml", + "Sentinel1_RTC_Amplitude.rft.xml", + "Sentinel1_RTC_dB.rft.xml", + "Sentinel1_RTC_dB_Stretch.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml" + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", + "service_folder": "OPERA", + "service_name": "OPERA_RTC_VV", + "service_definition_overrides": { + "Type": "esriServiceDefinitionType_Replacement", + "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='usageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='waitTimeout']/Value": "120", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='IdleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='keepAliveInterval']/Value": "600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MinInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MaxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='UsageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='WaitTimeout']/Value": "120", + "ItemInfo/Title": "OPERA RTC VV", + "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "ItemInfo/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "ItemInfo/Snippet": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_VV_WMS", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='abstract']/Value": "WMS service for Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL)." + } } + diff --git a/image_services/opera/raster_function_templates/Sentinel1_RTC_Amplitude.rft.xml b/image_services/opera/raster_function_templates/Sentinel1_RTC_Amplitude.rft.xml new file mode 100644 index 00000000..a9f4bd05 --- /dev/null +++ b/image_services/opera/raster_function_templates/Sentinel1_RTC_Amplitude.rft.xml @@ -0,0 +1,100 @@ + + Sentinel-1 RTC Amplitude + Sentinel-1 RTC data in Amplitude scale + + Square Root + Calculates the square root of the cell values in a raster. + UNKNOWN + + + + Rasters + ExtentType + Operation + CellsizeType + + + + _Rasters + + + + Raster + + + true + + + false + + + ExtentType + + 1 + false + + + Operation + + 4 + false + + + CellsizeType + + 2 + false + + + + Converts pixel values from power to amplitude scale by taking the square root of the power values. + 0 + C:\Users\hjkristenson\Documents\ImageServer\Thumbnails\RTC_Amplitude.PNG + + + + + data:image/bmp;base64,Qk3uNwEAAAAAADYAAAAoAAAAyAAAAIUAAAABABgAAAAAALg3AQAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////jY2NioqKf39/jo6OpKSknZ2dlZWVfX19pKSkubm5f39/fn5+rq6ugoKCiIiIfHx8enp6fX19gYGBcnJyeXl5hYWFdnZ2f39/fX19rq6u9vb2ZmZmurq6qamp1tbWn5+foKCgsbGxKSkpLS0tLi4uSUlJRUVFODg4Ozs7PDw8NTU1MDAwLi4uLi4uMDAwLi4uNDQ0MDAwNjY2NDQ0Nzc3OTk5NjY2Ojo6ODg4Ozs7ODg4NTU1PDw8RERERUVFQ0NDUFBQS0tLUFBQT09PT09PU1NTW1tbXFxcWVlZU1NTWFhYWVlZV1dXUlJSU1NTTU1NTU1NUlJSTU1NT09PTU1NSEhIRkZGSkpKQ0NDRUVFQ0NDR0dHQkJCRkZGQUFBRUVFTU1NSUlJR0dHTU1NSUlJUlJSRERES0tLSUlJQUFBRkZGODg4QUFBOzs7PDw8Ozs7ODg4Ozs7OTk5MjIyLi4uLi4uLCwsLy8vMTExMzMzLy8vMDAwMzMzLCwsNzc3KCgoMDAwICAgJCQkJSUlJCQkJCQkJiYmJCQk6Ojo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3NzchoaGfX19dXV1eHh4c3NzhISEm5ubhISEfHx8i4uLkpKSc3NziYmJhoaGhISEc3NzfX19o6Ojenp6kZGRhISEg4ODf39/jo6OjY2NwsLC+fn5Z2dnxsbGqampkpKSjY2NlJSUioqKmZmZIyMjLCwsKysrPj4+Pj4+Ozs7ODg4NTU1NjY2Li4uMDAwLCwsLy8vLi4uNDQ0Ly8vMTExOTk5NTU1Li4uMTExOTk5PDw8PDw8NjY2Ojo6Ozs7PDw8Q0NDRkZGR0dHS0tLS0tLS0tLUlJSVFRUVVVVVVVVVlZWXV1dU1NTWFhYV1dXTU1NS0tLTU1NT09PTU1NTU1NS0tLRERERUVFSkpKS0tLRkZGRUVFRkZGQUFBQ0NDRUVFRkZGRkZGUFBQU1NTQEBASEhISUlJR0dHS0tLREREPj4+PT09Pj4+PDw8PDw8PT09Ozs7MjIyPDw8MzMzNDQ0MDAwMzMzLy8vMDAwNTU1MDAwODg4MzMzOTk5NDQ0MDAwLS0tMjIyJycnKCgoLy8vJSUlJSUlJCQkJCQk6enp////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////qqqqra2td3d3iIiIe3t7nZ2djY2NjY2NfX19nJycf39/x8fHjY2NjY2Nj4+Pj4+PmpqaiIiIlpaWjIyMo6Ojh4eHr6+vmJiYjIyMeHh44uLi7u7uSEhImpqa1dXVm5ubkJCQl5eXoqKilpaWjY2NSkpKIiIiJCQkODg4Nzc3Ly8vNDQ0MTExMTExLS0tLi4uKioqJiYmMzMzMjIyLS0tLCwsMTExMjIyNTU1MTExMTExMzMzPT09OTk5ODg4Pj4+QkJCREREQ0NDTk5OTk5OS0tLRERETExMTU1NXFxcTU1NUVFRTExMTU1NTk5OS0tLTk5OSkpKSkpKS0tLR0dHTU1NS0tLSkpKSkpKSkpKRERESEhIRUVFQ0NDQ0NDRkZGRUVFSUlJPz8/RUVFRERER0dHQ0NDQ0NDRkZGSEhIPz8/Pj4+Ozs7Ojo6Ozs7OTk5PT09Ly8vPDw8NjY2LCwsLS0tMTExLS0tNDQ0ODg4NTU1MTExNjY2Nzc3NDQ0NDQ0NTU1KioqIyMjKysrJCQkKysrKioqKysrJiYm////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////mJiYpqamlZWVlpaWsbGxjIyMi4uLiYmJi4uLtbW1g4ODnJycf39/h4eHjY2Ni4uLcnJygYGBhYWFnp6edHR0goKChYWFhYWFiIiI/f39v7+/p6enh4eHu7u7ubm5j4+Pfn5+mZmZoqKijo6Om5ub4ODg3d3dHR0dMzMzODg4MjIyJycnMDAwLy8vKSkpKioqKSkpISEhLCwsLy8vKSkpLS0tLi4uNTU1OTk5Ly8vLy8vLy8vPz8/Pj4+NTU1Ozs7QkJCQ0NDRUVFSUlJTU1NRERERkZGRUVFRERES0tLUFBQQkJCRUVFQ0NDRUVFUFBQTExMR0dHSUlJRERETU1NRUVFRkZGR0dHSEhIQkJCRkZGRkZGSUlJSUlJR0dHQkJCRUVFQ0NDQkJCSUlJQkJCQUFBSUlJRUVFQUFBPz8/RUVFQEBAOzs7PT09NDQ0Ozs7MzMzNjY2MDAwMjIyNTU1Ly8vLCwsKysrNzc3MjIyKysrLy8vKioqLi4uNTU1NDQ0KysrLy8vLy8vLS0tKCgoLy8vJiYmICAgJSUl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/fjY2Nk5OTnp6elJSUhISElZWVj4+Pz8/PdXV1h4eHi4uLmpqak5OTra2tenp6lJSUjY2NkpKSjIyMhYWFoaGhh4eHwMDAwcHBwMDA1tbWiIiIiIiIiYmJ+fn53t7ep6enkpKSm5ubtbW1ra2tt7e3zs7OqampsLCwcnJyHx8fLS0tLCwsJSUlKSkpKSkpKSkpKCgoKSkpKCgoJiYmKCgoJiYmMDAwMDAwMDAwLi4uLi4uMzMzKysrODg4Nzc3QEBAPz8/PT09Pz8/QkJCR0dHRkZGRUVFQkJCRUVFQUFBRERERUVFRUVFRkZGPj4+QUFBQ0NDRkZGSUlJSUlJRUVFSEhIR0dHTExMRUVFRkZGPz8/Q0NDPj4+QUFBRUVFRUVFQEBAQ0NDREREREREQEBAPDw8OTk5Pj4+PT09RUVFOTk5OTk5Pj4+QEBAODg4MjIyOzs7NjY2NDQ0Ly8vMTExLCwsNTU1MjIyNDQ0NTU1Ly8vLi4uKysrKioqLy8vLS0tLCwsJycnMjIyKioqMjIyKCgoJSUlKysrsLCw////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////hoaGra2tgoKCjo6Otra2h4eHhoaGlZWVj4+Pi4uLo6OjsLCwoKCgkpKScnJyf39/kpKSenp6kJCQnp6ef39/t7e3vb29iYmJd3d3xMTEtra2j4+PfHx8fX19kZGRjIyMlZWVtra2cHBwgoKCkJCQp6en6OjogYGBnJycrKysmpqaHBwcJycnJSUlHR0dKysrJiYmKCgoLy8vJiYmJSUlICAgKSkpKSkpLCwsMjIyLS0tLi4uMjIyMTExLS0tNjY2Ojo6Pj4+QEBAQkJCRUVFRUVFRUVFPz8/PT09Pj4+Q0NDRkZGQ0NDS0tLQkJCQ0NDR0dHPT09RUVFR0dHRUVFSEhIPz8/QEBAODg4PT09PT09QEBAOzs7PDw8ODg4QUFBRUVFOTk5QUFBQkJCOzs7QEBAOjo6Nzc3OTk5NjY2ODg4MzMzOjo6PDw8OTk5Nzc3MzMzOzs7Nzc3Ojo6Li4uLy8vLy8vKioqLi4uLy8vLS0tLi4uLi4uMDAwMjIyLCwsNDQ0LS0tNDQ0Ly8vLCwsJycnLy8vJSUlIyMj6enp////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l5eXmJiYkJCQgYGBiYmJrKysj4+Pd3d3kpKSh4eHj4+Pn5+fhoaGurq6h4eHk5OTh4eHq6urh4eHgICAfHx8lpaWeXl5nJyc0NDQra2tjY2Nfn5+i4uLgoKCjo6Ok5OT4ODg7OzslpaWdnZ2cnJylJSUfX19kZGRj4+PkpKSfHx8qampra2tLS0tHx8fGxsbHBwcIiIiKSkpMDAwJCQkISEhIiIiJCQkHR0dKSkpLy8vKCgoKSkpLS0tMDAwLCwsKSkpNzc3Nzc3Ozs7Pj4+PDw8Ozs7PDw8PT09Pz8/RkZGRUVFQkJCR0dHTU1NPT09QEBARUVFPj4+RkZGPz8/Pz8/Pz8/PT09PDw8OTk5NjY2QEBAOjo6PDw8PT09Ojo6QEBAQEBAQkJCPDw8QEBAPDw8Ozs7PT09QUFBOzs7NTU1Ojo6NDQ0MTExQkJCMTExMjIyOzs7Nzc3MDAwNDQ0MjIyMzMzKysrLS0tLCwsMzMzKysrKysrMzMzMDAwNTU1KioqJCQkLi4uLy8vLi4uLS0tJiYmKioqLi4u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ioqKq6ureHh4kpKSjo6OlJSUk5OTjY2NlpaWo6OjkpKSkJCQk5OTmJiYlJSUhoaGkpKSi4uLgoKCgoKC2NjYkJCQfX19wcHBkZGRlpaWk5OThYWFhoaGgICAfn5+jY2Nx8fHurq6m5ubh4eHi4uLkZGRhYWFoaGhg4ODhYWFfn5+eHh4g4ODlZWVf39/GhoaGxsbGBgYHR0dIyMjJiYmIyMjHx8fHBwcGxsbGxsbIyMjKCgoJSUlJCQkJycnKioqKysrKCgoMjIyODg4OTk5Nzc3Nzc3Nzc3NTU1Nzc3MzMzQUFBRkZGTExMlZWVR0dHQUFBREREREREQkJCPz8/PDw8ODg4NjY2Ojo6Nzc3OTk5NjY2OTk5MzMzOzs7Ojo6QEBAODg4QUFBPj4+ODg4Nzc3NjY2Ozs7MTExPDw8NTU1MzMzOjo6OTk5MzMzPT09OTk5MzMzODg4MDAwNjY2NjY2NDQ0MTExNjY2Li4uKCgoMDAwKSkpMjIyLCwsLi4uLi4uMDAwKysrKCgoKysrLi4uKCgoJSUlSEhI////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////nZ2diYmJiYmJnp6ejIyMhYWFsLCwkpKSiIiIkpKSenp6np6egoKCfHx8gYGBp6enmpqaj4+PpqamxMTEx8fHwcHBnp6evb291tbWlJSUqamplJSUe3t7j4+Ph4eHkJCQn5+fv7+/i4uL1tbWu7u7dnZ2j4+PeHh4e3t7g4ODdXV1e3t7fn5+a2trZmZmhoaGjo6OpKSkUVFRFBQUFBQUIiIiJCQkICAgICAgFxcXFxcXHx8fIiIiIiIiIiIiJycnKysrLCwsMDAwJSUlJSUlMzMzMjIyMjIyMzMzKioqLi4uMTExMDAwNzc3R0dHR0dHRUVFPj4+ODg4QUFBNzc3Pz8/Pz8/Ojo6Ojo6NTU1Nzc3MTExNzc3NDQ0MzMzNjY2NDQ0NjY2QEBAPj4+PT09PDw8Nzc3QUFBODg4OTk5PDw8NDQ0NTU1MjIyNzc3MjIyMDAwNDQ0MTExMDAwNzc3Nzc3MDAwMTExMDAwMjIyLi4uNTU1JiYmKioqKioqKSkpLS0tLCwsJSUlLi4uLS0tJycnKioqKCgoKysraGho////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////lZWVg4ODd3d3mpqah4eHsbGxrq6unZ2dsbGxqKioh4eHgoKCjo6OjY2Nk5OTgoKCl5eXz8/Px8fHz8/Purq6oqKilJSUxcXFubm5m5ubhYWFcXFxjY2Nj4+PlpaWiYmJjY2NbGxsurq6rKyskpKSk5OTkJCQi4uLf39/k5OTf39/dXV1cnJybGxsgYGBdHR0j4+PhoaGf39/paWlmZmZOjo6ISEhICAgHBwcHh4eFhYWExMTGhoaKCgoISEhHBwcKCgoKCgoKSkpNTU1LCwsKioqKSkpMzMzLi4uLy8vMzMzMDAwLCwsMDAwODg4RUVFPz8/QEBAPT09MzMzLCwsMzMzMDAwOTk5Ozs7QEBAPDw8MjIyNzc3Li4uNjY2NTU1Li4uNjY2Ojo6Pj4+NDQ0QEBANjY2Ozs7NjY2MjIyOjo6NjY2MTExNzc3LS0tLy8vODg4MjIyNjY2Nzc3NjY2NDQ0LCwsNTU1KioqLCwsLCwsLS0tLCwsJycnMjIyLi4uKCgoJSUlKCgoIyMjIiIiJSUlJSUlIiIiKCgo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9fX1lJSUmpqakpKSoqKipaWlgICAlpaWjIyMp6enqKiolZWVqqqqhoaGdXV1m5ubcHBwlJSUp6enxMTEuLi4t7e3gICAi4uLxcXF09PToaGhlJSUeXl5iYmJjIyMqampg4ODmJiYl5eXwcHBmpqaoKCgkZGRmpqai4uLrKyseXl5ZmZmmpqanJycycnJe3t7jo6OjIyMdnZ2h4eHnJycmpqam5ubkZGRl5eXeHh4hoaGGxsbFxcXDg4OFBQUGxsbGhoaHx8fGhoaJSUlJCQkIiIiKSkpJiYmJSUlKioqMjIyLCwsLS0tJiYmJSUlLy8vMTExPDw8QUFBPj4+PDw8OTk5JSUlZ2dnmZmZMDAwNjY2Ly8vNDQ0MDAwLi4uNjY2MDAwLCwsMDAwLi4uNDQ0MjIyOzs7ODg4Nzc3PDw8MjIyOjo6NDQ0Ozs7NDQ0MTExLS0tMjIyODg4NTU1MTExNTU1Li4uMTExLi4uNTU1Nzc3Li4uKioqKSkpJycnMjIyJSUlLCwsKysrISEhJiYmJycnJycnKysrKSkpKysr////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////pKSkdHR0mJiYioqKlJSUg4ODvr6+kpKSgoKCioqKpaWlcHBwbm5uioqKiIiIiIiIhYWFnZ2dtra2oKCglJSUjIyMm5ubr6+vw8PDk5OTk5OTm5ubsbGxlJSUkpKSiYmJqKiojIyMkpKSkpKSmJiYnJycgYGBhISEgoKCq6urpaWljIyMmZmZkZGRpKSkl5eXlZWVqqqqjIyMmZmZoaGhhYWFa2trk5OTm5ubmZmZgYGBg4ODfHx8fX19np6eiIiIGxsbFhYWHx8fFxcXFBQUJSUlICAgLCwsJCQkICAgHx8fJiYmJCQkIiIiISEhISEhJCQkLy8vLi4uNjY2MzMzMTExMDAwsLCwurq6MzMzJycnLCwsLi4uNzc3KSkpLS0tLi4uMDAwLCwsKysrMDAwMDAwKSkpLCwsNDQ0LS0tOzs7NjY2NDQ0NTU1Ozs7NTU1NDQ0Li4uLy8vLi4uMDAwMjIyLy8vMjIyLy8vLy8vLi4uMjIyKioqKysrLi4uKioqLi4uKysrJiYmJSUlJSUlKSkpJiYmJiYmICAgJCQk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////gICAiYmJlpaWmJiYmJiYoKCghYWFjY2Ne3t7e3t7p6enlJSUgoKCf39/kJCQmZmZ2dnZiIiIg4ODcHBwiIiIjo6Oo6OjoaGhpaWlhISEmpqam5ublpaWmZmZi4uLh4eHc3NzioqKlpaWlJSUhISEcHBwurq6vr6+i4uLjY2NeXl5ioqKhYWFh4eHnJycurq6fX19nZ2dnZ2dpaWliYmJxsbGj4+PkZGRhoaGg4ODlZWVZWVld3d3eHh4kpKSkZGRoaGhm5ub4ODgcHBwdnZ2eHh4Nzc3GBgYHh4eGRkZGBgYFxcXGBgYFxcXGxsbFhYWERERJCQkWVlZcXFxjY2NNzc3MzMzKioqgYGBLCwsKioqLy8vJycnKCgoLi4uNjY2LCwsLi4uLy8vKSkpKysrLy8vKioqMDAwLy8vPDw8MDAwOTk5NDQ0LS0tNDQ0ODg4Ly8vNjY2Nzc3Nzc3Nzc3Nzc3Ozs7NDQ0OTk5NTU1MTExLS0tLS0tLi4uLS0tKCgoJSUlIiIiKysrKioqKysrJSUlKioqKSkpKysrvb29////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////kpKSk5OTkpKSlJSUoqKidnZ2hYWFj4+PkZGRmZmZfX19fHx8e3t7fn5+ycnJoaGhiYmJf39/mpqagYGBi4uLxMTEmJiYj4+PfX19j4+PgoKCh4eHk5OTcHBwhoaGh4eHgYGBj4+Pjo6OgICAkJCQiIiIjo6Oj4+PvLy8fn5+iYmJbW1tdnZ2iYmJnp6ef39/l5eXmJiYhISEp6eno6OjyMjIu7u7np6elJSUhoaGj4+Pk5OTi4uLjIyMaWlpfn5+fn5+fn5+goKCfX19iIiIjo6OkZGRlZWVoqKimZmZkJCQlJSUaWlpgoKChYWFeHh4vr6+oaGhcnJykJCQjY2NrKysjo6OPDw8ISEhcHBwLCwsMDAwLCwsJycnIyMjLS0tLy8vJycnKCgoJycnKCgoIyMjKioqKioqKCgoNTU1NTU1MTExMzMzLy8vMDAwLy8vMTExLS0tMzMzLy8vNDQ0NjY2MTExMzMzOzs7KysrNDQ0MTExMzMzNTU1KysrKioqLi4uKCgoKioqKysrKCgoKysrKysrLCwsJSUl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////09PTmJiYj4+PlJSUvLy8pKSkd3d3jo6Oh4eHjY2NlpaWnJycfn5+np6eu7u7wsLCioqKmpqampqahYWFiYmJmpqatbW1kZGRh4eHqqqqlZWVioqKiIiIfHx8jo6Oi4uLf39/cHBwhYWFj4+PmpqaoKCgn5+fiYmJh4eHpKSkeXl5i4uLkpKSfHx8kZGRg4ODkpKSlJSUg4ODk5OTlZWVsbGxsLCwtra2zs7OwsLCioqKgoKCjIyMbm5udXV1g4ODhoaGlJSUnJyclJSUeXl5iYmJfn5+hoaGj4+PioqKfX19lJSUlpaWgoKCb29vb29vfX19o6Ojp6enlpaWiYmJenp6mZmZoqKieHh4SUlJHBwcNDQ0KysrLCwsLS0tKCgoJSUlLi4uKCgoJycnKCgoHx8fISEhISEhJCQkHR0dLy8vKCgoIyMjKioqLy8vMDAwLi4uLy8vLS0tMjIyLy8vLy8vMTExKCgoMDAwMDAwLi4uMDAwNTU1LCwsKysrMzMzJiYmKSkpKioqKCgoJCQkKSkpLS0tJycnKSkpJiYm////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ioqKiYmJmpqajY2NnJycioqKjIyM0dHRf39/mpqak5OTfn5+eXl52NjYxMTEzs7OwsLCfX19uLi4g4ODg4ODnp6eqampqKioxsbGmZmZeHh4jIyMjIyMgoKCd3d3kJCQlZWVc3NzcXFxe3t7eXl5kZGRh4eHdnZ2jY2Ne3t7h4eHi4uLfHx8g4ODiIiIlJSUjY2NhISEjIyMi4uLf39/enp6dnZ2q6urpaWlvb29mZmZi4uLh4eHioqKhYWFg4ODkZGRgYGBfHx8goKCpqampaWllJSUf39/iYmJf39/mZmZkZGRvr6+fX19gICAb29vgYGBeHh4f39/gICAh4eHgYGBeHh4fHx8mJiYYmJiGRkZCQkJJSUlJSUlLS0tKioqICAgJCQkICAgIyMjJSUlIiIiLCwsICAgJCQkISEhKioqKysrJiYmKCgoJiYmIiIiKCgoMzMzKioqLi4uMTExLi4uMDAwMDAwJiYmKCgoMzMzLS0tLy8vMDAwMDAwLy8vJycnKioqLCwsJycnJSUlKSkpKCgoLy8vKysrJiYm////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////lJSUkpKSg4ODs7OzhYWFe3t7cXFxc3Nzi4uLo6OjmJiYnZ2dp6ens7Oz3t7eoaGhmZmZjIyMjo6Oi4uLkZGRh4eHsLCwurq6nJyclZWVkpKSfn5+dHR0hISEfHx8mJiYdXV1c3NzcnJyeHh4fHx8cHBwcXFxfX19iIiIhYWFZmZmenp6fHx8fHx8jY2NkJCQhYWFgoKCf39/kZGReHh4dnZ2d3d3h4eHkpKSoqKiqqqqf39/jY2NhYWFdnZ2cnJyiIiIiYmJbW1ttbW1g4ODdHR0b29vdHR0jo6OjIyMi4uLlpaWp6enfX19g4ODgoKCnJychYWFgoKCc3NzdnZ2iYmJd3d3b29vcXFxdXV1FhYWDw8PhISEHx8fJCQkJycnLi4uISEhIyMjISEhJCQkIyMjIyMjKysrIiIiIiIiKysrKysrKysrKSkpJycnICAgJCQkICAgKioqJiYmKysrMTExLS0tLi4uLCwsKSkpLS0tLy8vLi4uMDAwKysrJycnKSkpKysrKSkpJSUlLCwsJSUlJiYmJSUlJCQk5OTk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////kZGRkZGRfn5+goKCeHh4fHx8h4eHg4ODioqKenp6h4eHfn5+o6Ojx8fH3t7egICAiYmJhYWFh4eHe3t7kJCQtbW1jIyM+fn5ysrKh4eHjIyMgYGBj4+PioqKhISEkZGRdnZ2fX19gYGBfHx8iIiIfHx8aGhoeXl5hISEdHR0j4+PgICAgICAenp6h4eHfHx8j4+Pi4uLjIyMjo6OdXV1eXl5lZWViIiIq6uriYmJkJCQra2tc3NzfX19qampl5eXioqKenp6c3NzZGRkaWlpampqe3t7fHx8i4uLlJSUlJSUrKysjY2NjY2Ne3t7jY2Nenp6dXV1kpKSfn5+d3d3bW1tXl5ebm5uYGBgY2NjeXl5BAQEc3NzPj4+Hx8fHR0dJycnJCQkIyMjHx8fHBwcHR0dGhoaICAgJCQkJycnIiIiISEhIiIiJSUlHR0dJCQkHx8fISEhHR0dJiYmJiYmLS0tKSkpKSkpMTExLi4uJCQkKSkpMjIyKCgoJiYmLi4uLS0tJSUlLi4uLi4uLS0tLi4uKSkpJiYmJiYm////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////n5+fsrKyj4+Ph4eHjIyMlpaWkpKSmZmZeHh4fHx8f39/jIyMjo6Ovb29uLi4iYmJmJiYjY2Ne3t7nJycp6engoKCj4+PcnJypqamk5OTwcHBj4+PdXV1nJyckZGRnJychISEhYWFiIiIhYWFg4ODfHx8i4uLg4ODcXFxjY2Nf39/hYWFeHh4gICAgYGBk5OToqKijo6Ofn5+i4uLfn5+gICAfX19w8PDr6+vhISEhYWFiIiIsbGxt7e3fHx8fX19gICAd3d3fHx8dXV1a2trdnZ2a2treXl5l5eXenp6d3d3dnZ2cnJycHBwe3t7ioqKo6Ojm5ubgICAiIiIdXV1fn5+enp6ZWVlVFRUUVFRY2NjWVlZKSkpdnZ2c3NzICAgIiIiHx8fIyMjJSUlJSUlHh4eGRkZHR0dGhoaGhoaISEhHBwcJCQkHh4eISEhGBgYGxsbKSkpHx8fICAgJycnKSkpKCgoLi4uKioqMjIyNTU1NTU1Ly8vKysrLCwsKSkpJCQkKioqKysrKCgoKysrKioqLi4uKioqKSkpJSUl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////enp6kJCQioqKj4+PkJCQnp6ei4uLyMjIjY2Ng4ODfn5+p6enlpaWy8vLgYGBv7+/ysrKv7+/dnZ2i4uLj4+PiIiIfn5+iIiIdnZ2lJSUmZmZzs7O0tLSxcXFnp6eycnJpKSkycnJsLCwfX19iYmJp6enoKCgh4eHgYGBlpaWg4ODeXl5ioqKmJiYdnZ2lpaWoKCglJSUenp6qampgICA1dXVm5ubgICAgICAg4ODsbGxioqKkZGRf39/hISEenp6iYmJgoKCdHR0cnJyc3NzoaGhlZWVjo6OhoaGgoKCjIyMgoKCgYGBcHBwfX19fHx8iIiIeHh4ioqKgYGBfHx8fn5+g4ODgYGBaWlpWlpaenp6gYGBYWFhlZWVdXV1Ly8vISEhHBwcHR0dHx8fICAgJCQkHx8fHx8fHx8fJCQkHR0dGhoaHx8fGxsbGxsbHBwcICAgKCgoISEhHBwcIiIiJiYmJCQkICAgKSkpKSkpKysrLS0tLS0tKSkpLS0tJycnJycnKCgoJycnKCgoKysrKioqJycnKCgoIiIiWVlZ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////jo6OjY2NeHh4gYGBf39/fHx8iIiIioqKjY2NkJCQqKiogYGBLS0tu7u7rq6uysrKjo6Oe3t7w8PDtLS0iYmJeXl5b29vioqKfX19oaGhgoKCjo6OuLi4goKChYWFdnZ2jo6Od3d3c3NzfX19jIyMlJSUj4+Ph4eHoaGhenp6gYGBhISEh4eHc3NzgYGBhYWFiYmJiYmJn5+fnZ2dl5eXkpKSi4uLjo6Oh4eHm5ubjY2NgICAeHh4mJiYdnZ2cnJyb29vhoaGhISEfHx8eHh4sbGxgYGBbGxscXFxj4+Ph4eHmJiYj4+PgoKCkJCQaWlpg4ODnJycgoKChYWFjo6Oj4+PgICAeXl5c3NzZGRkWFhYUFBQ3d3dnJycmZmZQUFBJCQkGRkZGhoaGxsbGBgYFxcXIiIiHx8fKCgoJiYmGBgYISEhHx8fGxsbICAgFxcXICAgHx8fJiYmHx8fICAgKCgoJycnJSUlJSUlKCgoJycnJiYmJiYmKSkpJSUlKSkpKSkpKCgoLCwsJiYmLi4uMTExLi4uLS0tKCgo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////pqampqamp6engoKCgICAkpKSmZmZpqamrKysmZmZfX19kZGRycnJ1dXVl5eXwsLClZWVgICAlZWVjIyMfn5+fX19g4ODjIyMhYWFf39/lZWVqKioy8vLoKCgj4+Penp6enp6g4ODiIiIgICAnp6ekZGRk5OTmpqai4uLlpaWhoaGra2tfHx8lZWVi4uLlZWVnZ2doKCgmJiYkpKSiYmJi4uLhYWFj4+PgICAbm5unZ2dlJSUlJSUo6Oja2tri4uLenp6ubm5qqqq2dnZsbGxrq6ud3d3iIiInJycjY2NgYGBm5ubgYGBe3t7gYGBd3d3aWlphoaGioqKf39/g4ODqampa2trlpaWjIyMiYmJf39/IiIiZGRkmpqaiYmJjIyMe3t7EBAQGBgYFxcXFhYWFBQUFxcXJCQkGBgYGBgYISEhJCQkIyMjISEhISEhJiYmFhYWGxsbHx8fHBwcHx8fHx8fIiIiGxsbJSUlJycnJCQkHx8fJycnJCQkKCgoICAgJycnISEhJycnLCwsMDAwMTExLCwsLy8vKysr////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vr6+lpaWra2toqKimpqapqamjo6OcXFxgoKCiYmJlpaWkpKSoaGhxMTEo6OjsrKyo6Ojl5eXjIyMqKiompqag4ODZ2dnj4+Po6OjgoKCe3t7mZmZd3d3rq6ur6+vxcXFl5eXrKysf39/d3d3d3d3iYmJg4ODh4eHa2trc3NzhYWFgICAi4uLfn5+f39/fn5+h4eHk5OTf39/fn5+iIiIj4+PeXl5oaGhfn5+kZGRg4ODenp6hoaGrq6uenp6e3t7sLCwzc3NsbGxenp6eHh4oKCgpqamdHR0eXl5cHBwenp6eHh4o6Ojb29vb29venp6hISElJSUjY2NkpKSiIiIkZGRmpqajIyMiYmJc3Nzl5eXTU1N3t7ejo6OkZGRmJiYkpKSWVlZODg4ExMTGBgYFRUVFBQUFxcXFhYWHBwcGxsbFxcXHh4eISEhISEhIiIiICAgHx8fIyMjGxsbHR0dGBgYIyMjISEhJSUlHh4eISEhJSUlJSUlJCQkJycnHx8fJSUlIiIiJSUlIyMjKCgoKysrKysrKysrKSkpJycn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tbW14uLi+fn5ycnJfn5+/f39ioqKfX19kZGRcXFxgYGBhoaGqampwcHBhoaGhYWFk5OTe3t7enp6gYGBf39/enp6g4ODnZ2dg4ODhISEjY2N6urqf39/ioqKgICAcXFxoKCgmJiYcXFxjIyMeHh4goKCgoKCdnZ2i4uLn5+ffn5+enp6eXl5i4uLenp6gICAfn5+goKCiIiIjIyMgoKCfX19u7u7mpqajY2Nc3Nze3t7fn5+uLi41tbWhISEe3t7gYGBh4eHdXV1jY2Nenp6e3t7bm5ug4ODj4+Pf39/bm5ubGxsdHR0cHBwcnJyenp6eHh4cHBwg4ODgICAhYWFiIiIg4ODkpKSgoKCe3t7kpKSbm5u3t7ei4uLjY2NkpKSlZWVl5eXcXFxW1tbDw8PExMTEhISFhYWFxcXEBAQGBgYGRkZICAgHBwcGBgYFxcXGhoaFBQUJCQkGBgYGxsbFRUVHx8fGRkZIyMjGxsbIyMjISEhISEhKSkpISEhJycnHR0dICAgJycnJSUlJycnIyMjICAgKioqKioqbW1t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4eHhjo6Onp6eioqKkZGRh4eHlpaWmZmZgYGBiIiIhoaGvLy8q6urjY2NbW1tkJCQhYWFioqKdnZ2d3d3f39/n5+fpaWlgoKCTU1NW1tbjIyMkZGRvLy8fHx8h4eHf39/kJCQd3d3jo6Oe3t7cnJye3t7d3d3g4ODfn5+hISEfHx8nJycenp6Z2dnl5eXhYWFe3t7eHh4hISEfn5+j4+PdnZ2l5eXf39/i4uLfn5+fn5+fHx8goKC+/v79vb2goKCgoKCf39/fX19hISEdnZ2fHx8fHx8e3t7fn5+e3t7cHBwcnJydXV1bm5ue3t7enp6lpaWeHh4d3d3eHh4eXl5cHBwfX19jo6OioqKlJSUn5+fmZmZbGxs4+Pjubm5j4+Ppqamvr6+mJiYr6+vhoaGdXV1ExMTEBAQExMTFBQUEBAQFBQUFxcXHBwcHR0dGxsbGhoaGhoaFBQUFhYWGxsbISEhGBgYGxsbGxsbFBQUFxcXHR0dHBwcICAgIiIiISEhHBwcIyMjHBwcLCwsGhoaHh4eJycnJCQkJSUlKSkp////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////kJCQlpaWubm5oqKikJCQkpKSgYGBjo6Ofn5+j4+PgICAh4eHvLy8x8fHiYmJhoaGiIiIfHx8hoaGmJiYiYmJeHh4gICAW1tbeXl5dnZ2eXl5cnJyfHx8hISEo6Ojp6endXV1mpqaqamphYWFlZWVfn5+jo6OgYGBfn5+gICAYGBgfHx8cXFxdXV1b29vw8PDc3NzhISEi4uLjo6OjY2NmpqafX19hoaGhoaGkpKS5+fn/v7+9vb21dXVwcHB4uLisLCwfHx8jIyMh4eHd3d3tbW1eHh4cnJyc3NzcXFxeXl5eHh4fn5+ubm5g4ODfn5+gICAlpaWbm5uioqKiYmJa2trfn5+m5ubkZGRkpKSkJCQiIiId3d3wMDA0NDQmpqawMDA////iIiIoqKibW1tfn5+Xl5eFRUVFRUVGhoaFxcXHBwcGRkZJSUlJCQkICAgHBwcFxcXGRkZHx8fGRkZGxsbIiIiGxsbJSUlGRkZERERHh4eFhYWHx8fISEhJCQkHh4eISEhICAgJiYmIyMjJycnHx8fIyMjKioqKSkp////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////iYmJkZGRlZWVe3t7cXFxjY2NcHBwh4eHgYGBtbW1p6enzs7OpaWli4uLiYmJgICAlZWVfHx8fHx8i4uLaWlpe3t7iIiIdXV1f39/gICAmZmZq6urgYGBe3t7pqamioqKfHx8h4eHlpaWqqqqn5+ffX19jY2NfHx8fX19fX19dXV1fX19e3t7f39/ioqKf39/nZ2ddHR0i4uLfn5+lJSUgICAgICAenp6ioqK////e3t7f39/mZmZiYmJnp6eoqKiXV1dHx8fGBgYS0tLhoaGdXV1hoaGhISEc3NzcHBweXl5iYmJkJCQjo6Oenp6eHh4eHh4mpqadXV1f39/qKioi4uLioqKgYGBioqKgoKCpaWlnJycz8/PhYWFn5+fWFhYoKCgnJyckpKSgICAlpaWh4eHgICAkpKSCgoKDg4ODw8PGxsbHBwcGxsbHh4eHBwcHBwcFxcXGRkZFxcXGxsbEhISIiIiHx8fIyMjKCgoGhoaFRUVEBAQFxcXIiIiHBwcISEhIyMjIiIiKCgoJSUlJSUlGxsbIyMjJCQkJSUl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l5eXm5ubenp6hYWFkpKSeXl5jo6OlZWVj4+Pnp6epqammJiYnp6ekJCQgICAt7e3goKChISEiYmJenp6enp6fHx8lpaWgYGBiIiIxcXFgYGBg4ODgICAf39/oqKieHh4l5eXhoaGkZGRh4eHnJycsLCwg4ODjY2NcXFxgYGBfn5+dXV1gICAeHh4cXFxi4uLh4eHcXFxhoaGhoaGl5eXoqKiiYmJoKCgsLCw+/v7fn5+hYWFgoKCnZ2diYmJiYmJGRkZFBQULCws4eHhsrKysLCwf39/gYGBhISEgYGBenp6i4uLhYWFgoKCbm5uj4+PioqKcHBwd3d3gYGBfX19np6ecXFxfX19gICAsbGxNzc3Pj4+f39/np6ep6enn5+fioqKc3NzlJSUcHBwhYWF4+PjoaGhcXFxc3NzJSUlCAgICAgIBwcHERERFxcXGBgYExMTFBQUFBQUGBgYExMTEhISGBgYExMTFBQUFBQUHh4eGBgYGBgYFRUVHBwcHx8fICAgIiIiKysrHx8fKSkpJSUlHBwcJSUlISEhy8vL////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tbW1oKCghYWFmJiYk5OTgoKCq6urjo6Oq6urkJCQj4+Pe3t7e3t7l5eXh4eHh4eHhISEe3t7g4ODjo6OmJiYiYmJsLCwdXV1gYGBiIiIm5uburq6jY2NgoKCfX19fn5+g4ODfn5+i4uLj4+P1tbWubm5paWlj4+Ps7OziYmJgoKCgoKCg4ODgICAqKiodnZ2gYGBgoKCjIyMo6Ojk5OTnJychoaGhoaGnJycn5+f7e3tkpKSeXl5hISEkJCQiIiIdnZ2fn5+hISEgYGB6OjoyMjIe3t7jo6OioqKdHR0eXl5n5+ffn5+hISEgoKCfHx8kZGRwsLCjY2NbW1teXl5iYmJiIiIbGxsiYmJfHx8r6+vg4ODhoaGc3Nzk5OTm5ubysrKiIiIiYmJhYWFgICAe3t7eXl5gYGBg4ODioqKlpaWT09PDAwMBgYGCAgIBwcHFBQUDg4OCwsLDw8PDQ0NEhISEBAQDQ0NExMTFBQUERERFRUVFxcXExMTFBQUFxcXHBwcExMTHR0dIyMjGhoaISEhICAgHx8fHR0dIiIi6Ojo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////eHh4goKCiYmJkpKSrq6uhYWFqqqqlJSUjo6O09PTurq6fn5+oaGhh4eHenp6eHh4g4ODf39/g4ODiIiIiYmJvb29hYWFnJycl5eXtra2cXFxjo6Og4ODenp6fX19kpKSf39/oaGhm5ubhYWFe3t7fX190dHRtLS0e3t7s7OzioqKwMDAenp6mpqah4eHiYmJhISEgICAiYmJhoaGi4uLlZWViYmJioqKjo6OiIiI1dXVhISEfn5+fHx8eXl5goKCiIiIbm5uioqKqKioYmJiy8vLo6OjiYmJf39/jIyMdnZ2e3t7f39/f39/eHh4fX19g4OD2dnZnJychoaGfn5+cnJynZ2dxsbG2trasbGxY2NjXFxcnJycpqamoaGhoaGhjo6Oe3t7zc3NcHBweHh4ioqKenp6hISEkpKSmpqalZWVhoaGTk5OJiYmCQkJCQkJBAQEEBAQDg4ODw8PEBAQFxcXFhYWERERCgoKEhISEhISGRkZGBgYFhYWFRUVExMTGRkZFxcXEBAQExMTGxsbFBQUHR0dHBwcHBwcISEh////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////gYGBgYGBfX19a2trgYGBnp6epaWlpaWlm5ubk5OTnZ2dkJCQhISEcnJye3t7bGxsc3NzfHx8lJSUoKCgra2thYWFwsLCgoKCjIyMkZGRjIyMfX19iYmJgYGBf39/oaGhdnZ2gYGBe3t7h4eHhoaGw8PDiIiIfn5+e3t7paWlu7u7m5ubfHx8fX19bm5ufn5+hoaGeHh4bm5uhISEnp6ehYWFfn5+gYGBiYmJ5ubmjo6Ojo6OkJCQhYWFc3Nzenp6eXl5gICAhoaGhoaGe3t7jIyMf39/fn5+cHBwdHR0dnZ2hISEd3d3h4eHh4eHoaGhp6enhYWFiIiImZmZpKSkwcHBwMDAnZ2dqKiobm5ucXFxdXV1mJiYh4eHq6ursbGxhISEeXl5enp6np6ek5OTl5eXhISEgYGBiIiIfX19mJiYh4eHi4uLeXl5VVVVDg4OBgYGFBQUEhISEhISGhoaICAgICAgDw8PExMTERERDg4ODg4OGhoaFBQUExMTERERDAwMEBAQHR0dFRUVHBwcFBQUFRUVHBwcFBQUHh4e////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7u7ufHx8gICAf39/xMTEk5OToKCgnJycl5eXsbGxwcHBiIiInp6ecXFxoKCggICAc3NzgYGBh4eHeXl5lpaWfX19iYmJhISErq6umZmZrq6ugoKCdXV1fn5+e3t7eHh4hoaGfHx8eXl5eXl5f39/rKysiIiIeXl5hYWFgoKChYWFa2trtra2ampqXl5eYmJih4eHkJCQenp6aWlphISEiYmJhoaGgICAioqKz8/PhYWFf39/iYmJg4ODdnZ2gYGBbGxshYWFgICAhoaGeXl5cXFxi4uLgoKCcHBwcnJygICAdHR0enp6fn5+m5ubkJCQiYmJf39/i4uLeXl5h4eHbW1tY2Njnp6ekpKSdHR0YGBgiYmJhoaGd3d3bm5uZ2dncXFxjY2NgoKCeXl5b29vZmZmnZ2doKCgg4ODgYGBhYWFfn5+gICAZWVlbm5uZmZmV1dXbGxsDw8PEhISExMTEhISGxsbGBgYFhYWFxcXFhYWDw8PERERDw8PFBQUFxcXEBAQDQ0NCgoKDg4OFxcXExMTEhISEhISEBAQGBgYa2tr////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////n5+fk5OTj4+PiYmJy8vLv7+/jIyMpKSkmpqaeXl5jo6OhoaGgoKCfX19e3t7gYGBi4uLfHx8iIiIj4+Pp6engoKCiYmJgoKCkZGRjIyMl5eXkJCQdnZ2hoaGdXV1cHBweXl5cHBwd3d3rq6ugYGBcnJyfX19kJCQj4+PhISEp6enhYWFjo6Ok5OTdXV1goKCd3d3dXV1enp6f39/fX19goKCjY2NkpKSkpKSnZ2dw8PDz8/PgoKCi4uLenp6fX19gICAeXl5aGhodHR0dXV1d3d3goKCeXl5dHR0gYGBenp6cnJyjo6Of39/dHR0cXFxYmJijo6Od3d3a2trgYGBgYGBp6end3d3hoaGbm5ub29vhYWFkZGRbm5ue3t7e3t7ioqKhoaGqKiomJiYeHh4jIyMcHBwgICAh4eHc3NzampqcXFxf39/hISEgoKCfHx8bm5ueHh4enp6ZGRkERERDw8PDAwMCwsLEBAQEhISFBQUDg4ODg4ODg4OCwsLFxcXFhYWEhISDw8PDAwMDg4ODQ0NEhISDg4OFBQUFBQU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////enp6g4ODiIiIiIiIk5OTnp6elZWVnp6ekZGRqKiohISEdnZ2enp6g4ODcnJyf39/ampqdnZ2i4uLl5eXl5eXnp6ecXFxkZGRiIiItLS0lpaWiIiIhISEenp6fn5+eHh4dnZ2fn5+paWlfn5+gYGBeXl5sbGxYmJieHh4fn5+enp60dHRf39/o6Ojzs7Oqampfn5+hoaGioqKgICAjIyMfHx8kpKSgYGBg4ODiIiIhISEi4uLs7OzmpqahISEfHx8jo6Ofn5+hoaGfX19dXV1aGhog4ODoqKigICAj4+Pt7e3nZ2dc3Nzc3Nzb29vbm5ugoKChISEXV1da2trl5eXgYGBcnJyf39/j4+Ph4eHgYGBdnZ2cXFxe3t7fn5+eXl5dnZ2e3t7n5+fiYmJjY2Nfn5+hISEeXl5eXl5hYWFioqKf39/fX19gICAfX19hoaGeHh4dnZ2d3d3dXV1MzMzNzc3KSkpDAwMCAgIERERERERDw8PEBAQDAwMCgoKDQ0NExMTGhoaEhISDQ0NDQ0NCgoKDg4OFRUVDg4OGBgY////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+/gYGBnJychoaGkpKSmZmZl5eXrq6ulJSUk5OThYWFiYmJbm5ueXl5gICAdHR0fX19hISEn5+fkpKSeXl5gYGBeHh4enp6fn5+iIiIoaGheHh4d3d3gYGBe3t7f39/ioqKbm5ukZGRg4ODfn5+gICAf39/jIyMpKSke3t7eXl5c3NziIiIdnZ2q6urgoKCmZmZeXl5o6OjkpKSc3NziIiImZmZdHR0eXl5goKChISEfn5+g4ODfn5+enp6gICAp6eniYmJk5OTkZGRdnZ2c3NzdHR0bW1te3t7n5+fgoKCampqe3t7fn5+gYGBenp6jIyMaWlpmpqao6Ojenp6dHR0e3t7dnZ2goKCf39/e3t7mZmZbm5ufX19h4eHiIiIbW1tb29vhoaGi4uLdnZ2oaGhfn5+eHh4hYWFhISEZ2dnZGRkbm5ua2trhISEiIiIdnZ2goKCgICAf39/h4eHiYmJfHx8T09PNDQ0VFRUBAQEDg4ODQ0NDAwMCQkJCgoKBgYGDQ0NEBAQDQ0NDw8PCwsLCAgIEREREBAQDAwMDw8P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////hISEm5ubmZmZmZmZn5+fpKSkoaGhoqKihYWFgICAgICAenp6mpqaiIiIeXl5j4+PfX19jY2Ng4ODb29vfn5+goKCg4ODZWVlm5ubdnZ2h4eHjo6OoqKidHR0a2trcnJyd3d3f39/fX19i4uLk5OTdXV1gICAcXFxgICAnp6eY2NjfX19fn5+d3d3hYWFsrKyq6urcnJydHR0pKSkh4eHh4eHf39/nJycgICAgYGBjIyMg4ODjIyMdnZ2vr6+jIyMbW1tgoKCc3NzeXl5iYmJd3d3fHx8b29vkpKSenp6kJCQcnJyenp6VVVVf39/k5OTkpKShYWFdHR0aGhoe3t7bW1tjo6OmpqacnJyaWlpb29vd3d3jo6OdnZ2fX19fHx8bm5ubm5ufHx8ioqKhYWFk5OTioqKjY2NjIyMfHx8aWlpd3d3bW1tZmZmaWlpWFhYbW1tgoKCkZGRgICAampqcHBwZ2dne3t7hYWFdnZ2Q0NDZWVlOjo6EBAQBwcHCQkJAwMDAwMDERERDAwMDg4ODg4OCAgICAgIFxcXExMTOzs7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////lJSUioqKg4ODj4+Pjo6OqampsLCwg4ODeXl5lJSUhoaGg4ODkpKSn5+fhISEsLCwi4uLmpqajY2Ng4ODkJCQfn5+ioqKgICAl5eXjo6Oenp6dXV1h4eHh4eHf39/eHh4g4ODhYWFdnZ2c3NzeHh4iYmJcHBwd3d3jo6Oe3t7ioqKgoKCd3d3e3t7kpKSrKysiIiIenp6kZGRg4ODe3t7enp6jo6OhYWFg4ODfn5+g4ODjo6OfX19e3t7jo6Oh4eHioqKgoKCfX19fn5+i4uLjIyMe3t7mZmZiYmJiYmJeHh4b29vt7e3jIyMcHBweHh4m5ubioqKY2Njc3NzioqKdHR0b29vbm5ujY2NcnJyc3Nzc3NzlpaWkZGReXl5b29veXl55OTkfX19dXV1dHR0hISEmZmZf39/iIiIbm5uaWlpbm5ucXFxZGRkenp6b29vfn5+enp6fHx8fHx8aWlpj4+PgYGBv7+/dXV1g4ODYGBgdHR0SUlJQEBAKSkpHR0dAAAAAwMDDw8PEhISDw8PDg4OEBAQDQ0NDAwMFxcXyMjI////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////h4eHhoaGlJSUmZmZj4+Ph4eHi4uLgoKCcXFxiYmJe3t7kZGRnJych4eHgoKCdHR0hoaGdnZ2kJCQioqKg4ODf39/iYmJlJSUgICAhYWFpaWlhYWFhoaGenp6iIiIjIyMgYGBampqZ2dnZmZmc3NzfX19d3d3hISEgICAb29vcHBweXl5dXV1nZ2dhoaGdXV1pKSkgoKCpaWliIiIgYGBdnZ2eXl5enp6eXl5l5eXd3d3i4uLgICAiIiIiYmJfX19cHBwf39/hISEjo6OkJCQenp6m5ubhISEioqKe3t7kZGRs7Ozo6OjgoKCenp6f39/YWFhi4uLc3NzcHBwdHR0e3t7dnZ2oKCgcnJydXV1dXV1eHh4dHR0YmJiiIiIeHh4eHh4m5ubu7u7Z2dniYmJg4ODmpqaenp6jo6OgoKCYmJiY2Njampqf39/hoaGiYmJjIyMlpaWg4ODampqcXFxdXV1b29va2trZGRkdnZ2e3t7i4uLdHR0CwsLVFRUaWlpcHBwLi4uAQEBEBAQFhYWDg4ODw8PDw8PCwsLDQ0N////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////hISEf39/o6OjiIiIjo6Onp6eq6urnp6ec3Nzh4eHlpaWkJCQhYWFi4uLbW1tfn5+f39/lJSUiIiIsrKygYGBiIiIkZGRhoaGdnZ2g4ODgICAgYGBkJCQm5ubg4ODgYGBeXl5mZmZe3t7gYGBh4eHdnZ2bm5ucHBwbm5ucHBwhISEeHh4fHx8vr6+kpKSdXV1enp6g4ODdnZ2pKSkpKSkdHR0cHBwb29vkZGRioqKeXl5iIiIZ2dneHh4fX19d3d3b29vg4ODeHh4Z2dnmZmZl5eXf39/X19fLS0ttra2r6+vioqKbW1td3d3gICAbGxslZWVl5eXhISEdnZ2f39/aWlpbm5uaGhoj4+PgYGBa2trfX19dnZ2aGhofHx8hYWFf39/f39/iIiIg4ODfHx8fn5+qKiowMDAnZ2di4uLjo6OdXV1kpKShoaGiIiIcnJygYGBjY2Nenp6enp6aWlpiYmJh4eHdnZ2eHh4jo6OaWlpCgoKWVlZgoKCfX19g4ODaGhoampqYWFhc3NzcHBwCwsLCgoKERERDw8PDg4OJCQk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////dXV1i4uLf39/bGxsrKysoqKikZGRc3Nzg4ODpqamq6uroqKilZWVgYGBi4uLlpaWh4eHh4eHi4uLeHh4d3d3b29ve3t7n5+fiYmJd3d3kpKSh4eHcHBwh4eHhISEdHR0fX19goKCgYGBgoKChYWFdHR0aWlpoqKiioqKrq6u5ubmi4uLsrKynJycgYGBfHx8h4eHgYGBfn5+enp6paWlnJycrq6urq6ul5eXkJCQf39/hoaGlpaWfHx8iYmJf39/p6enhYWFjo6Ol5eXfHx8dnZ2cHBwdnZ2p6endXV1X19fd3d3cHBwhISEeHh4l5eXZ2dncnJykJCQe3t7cnJyXFxca2trc3NzaWlpbm5ufn5+bW1tenp6aWlpf39/jo6Obm5uh4eHfHx8hISEi4uLi4uLgoKCh4eHfX19hoaGgoKCiIiIhYWFfHx8eXl5goKCg4ODbW1tbm5ui4uLfX19h4eHgICAbm5ubm5uiYmJZWVlFhYWX19fAAAAQUFBa2trdHR0ampqW1tbZmZmYGBgampqXl5eBwcHDAwMDQ0NJiYm////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b29vgYGBnJyclpaWlZWVlZWVhoaGi4uLe3t7hISEjY2NdnZ2wsLCdXV1hYWFiYmJkJCQbGxsgYGBiIiIe3t7bGxsfX19jIyMh4eHhISEfHx8i4uLiYmJjIyMhYWFfX19jIyMZWVlgYGBf39/mJiYdXV1fn5+np6ee3t7iYmJjo6OfX19gYGBhISEe3t7kpKSiIiIg4ODd3d3hISEfX19srKycnJybW1thYWFhYWFpqamkZGRg4ODdXV1dXV1n5+fjIyMhISEa2triIiIfn5+Q0NDOTk5fHx8ampqWlpaf39/dXV1cXFxbm5ucHBwgICAhoaGd3d3jY2Nenp6eHh4bW1tcnJyampqeHh4dXV1fHx8bGxscnJyfn5+gYGBh4eHeXl5mJiYmZmZfn5+n5+foaGhcXFxhoaGfn5+c3NzfHx8jIyMiIiIg4ODjY2Ng4ODfn5+fn5+gICAdHR0fn5+goKCfHx8eXl5ampqcnJybW1tfX19cXFxZ2dnAQEBaGhoampqXFxcqampdXV1XFxcWlpaU1NTUlJSOzs7U1NT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j4+Pfn5+jo6Og4ODmpqaqqqqjY2NhISEjo6Ok5OTp6enhISEhoaGlJSUlZWVe3t7f39/fHx8fHx8jIyMfn5+lpaWiIiIeXl5hISEgICAcXFxl5eXdnZ2b29vgYGBf39/h4eHenp6hISElpaWfX19dXV1nJycdXV1cXFxdHR0goKCb29vcXFxpqame3t7enp6gICAbW1tiYmJgICAdnZ2gICAiIiImpqaf39/e3t7cHBwcXFxcnJya2trdnZ2f39/eXl5d3d3d3d3eHh4cXFxeHh4ZWVldnZ2cXFxa2trg4ODGxsbYGBgf39/dXV1jY2NWVlZbm5ueXl5e3t7mpqaenp6dXV1d3d3fn5+Y2NjhoaGY2Njmpqad3d3cnJybW1ta2trb29vf39/m5ubgoKCmZmZmJiYmZmZlJSUi4uLioqKkZGRo6OjXl5ee3t7k5OTjo6Od3d3bm5uhISEkZGRlpaWkJCQi4uLgoKCiIiIhYWFbGxsb29vh4eHAAAAaWlps7Oze3t7b29vgoKCZmZmdXV1eXl5qampfn5+c3NzODg4////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////hISEqKiokpKSoaGhgYGBnp6ebm5uf39/hYWFjo6OmZmZjY2NeHh4jIyMmpqaiIiIdnZ2iIiIgICAiIiIiIiIfn5+gICAbm5ug4ODgoKCkZGRe3t7gYGBdnZ2hISEaGhod3d3iYmJlZWVdnZ2nJycjo6OcXFxc3NzhYWFiYmJn5+ff39/k5OTbGxsbGxsgYGBlJSUh4eHf39/e3t7eHh4f39/lZWVrKysY2NjhISEfX19h4eHdnZ2mZmZZmZmgICAfHx8hoaGenp6cnJyb29vgICAc3Nzj4+Pg4ODl5eXcXFxi4uLY2NjhYWFdnZ2Y2NjbGxscHBwZmZmpaWlhISEfX19ioqKdXV1iYmJb29vZGRkdnZ2bm5uZmZmgYGBf39/gYGBi4uLjIyMioqKh4eHhISEdnZ2goKCjY2NhISEk5OTlJSUpaWlg4ODfHx8hYWFhISEe3t7bm5uh4eHo6OjfHx8jo6Ojo6Og4ODi4uLjIyMc3NzBAQEBgYGAAAAeXl5i4uLpaWliYmJfHx8eXl5enp6eHh4h4eHODg4eXl5ioqK////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////hISEenp6mpqamZmZgICAd3d3hoaGd3d3cnJyfHx8f39/hISEjo6Of39/eHh4g4ODqqqqfHx8eHh4e3t7k5OTdXV1e3t7kpKSjY2NfHx8g4ODenp6fHx8YGBggICAn5+ffX19h4eHkJCQgICAeXl5d3d3lJSUjIyMeXl5dHR0np6ec3NzdXV1cnJyd3d3gICAfX19gICAhISEb29vc3NznZ2df39/ampqd3d3g4ODc3NzdXV1gICAb29vcHBwaGhofHx8dHR0cnJykJCQhoaGi4uLfHx8bW1tjo6OcHBwioqKd3d3fn5+iIiIfn5+eXl5hISEeHh4h4eHe3t7goKCfX19eXl5ioqKcnJyhISEjY2NiIiIfn5+g4ODf39/fn5+j4+Pjo6OhISEn5+fgoKCgoKCgICAhISEgICAkpKSoKCghoaGhISEfn5+enp6fn5+hYWFeHh4hoaGd3d3hoaGgYGBfX19l5eXgICAhISEh4eHeXl5JCQkGRkZUVFRsrKyeHh4rKysfHx8eXl5d3d3gYGBhISEhoaGaWlpfX19vr6+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////29vbmZmZjY2NhYWFenp6dXV1d3d3iYmJdnZ2fX19cnJyhYWFj4+Pfn5+m5ubfn5+hISEgoKCgoKCgYGBjo6OiYmJeXl5hoaGhISEjo6OlpaWp6enc3Nzd3d3enp6oaGhgoKCxsbGdXV1goKCgYGBenp6fX19bGxsoqKicHBwhoaGh4eHhISEgYGBfX19f39/d3d3fn5+fHx8dXV1d3d3g4ODnp6egICAv7+/k5OTi4uLhoaGYGBgenp6hYWFdnZ2fHx8cXFxh4eHcXFxhYWFfHx8iIiIjY2NiYmJe3t7iIiIZWVlf39/n5+fV1dXdnZ2enp6iYmJjIyMdHR0XV1ddXV1d3d3fHx8f39/eXl5fn5+hYWFg4ODeXl5enp6goKCk5OTfHx8fHx8eXl5bm5uj4+PjIyMioqKlpaWkJCQgYGBeHh4gICAgoKClJSUfn5+bGxsenp6dnZ2gYGBgYGBd3d3ioqKjY2Nfn5+gICAmJiYn5+fh4eHlJSUjIyM/v7+jo6OkpKSlJSUhISEeXl5dHR0lZWVdnZ2ampqeHh4dnZ2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////kJCQi4uLdHR0fn5+jIyMcHBwdXV1eXl5dHR0bm5ugoKCcHBwc3NzhISEg4ODcHBwiYmJgICAgYGBfn5+j4+Pk5OThoaGgoKClZWVnp6epKSkjY2NlpaWaGhoaGhogICApqaml5eXg4ODenp6dnZ2eXl5m5ubfn5+hYWFgICAsrKyeHh4fHx8dXV1e3t7d3d3hYWFdXV1gICAe3t7e3t7m5ubfn5+jIyMf39/i4uLgoKCmZmZgICAbGxsbW1thYWFbW1tbW1td3d3dXV1YmJijY2NZGRkenp6l5eXn5+ff39/lJSUhISEampqdHR0fn5+iIiInZ2dcHBwc3Nzn5+fcXFxhISEhISEgYGBhoaGlJSUkZGReXl5dnZ2fX19cnJygYGBf39/dHR0goKCgYGBl5eXioqKgICAf39/kZGRfn5+hoaGwMDAjY2NdXV1q6urcHBwiYmJjY2Ng4ODeXl5c3NzeXl5f39/hISEfn5+jo6Ojo6OmZmZpqamlpaWZGRkjY2NlpaWbW1tc3NzeHh4eXl5aGhodXV1cXFxX19fWlpa////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/nJyciIiIcHBwfHx8f39/hoaGbW1teHh4iIiIYWFhh4eHf39/hYWFf39/fX19aGhob29vd3d3jY2NhYWFjY2NhISElpaWpaWlpaWlf39/pKSklJSUWVlZcnJymJiYeHh4p6eni4uLc3NzhoaGhoaGeHh4eXl5hISEsLCwfX19ampqcXFxmZmZY2NjiYmJo6Ojf39/hISEeHh4tra2g4ODgICAeXl5iIiIfHx8bW1td3d3goKCeXl5f39/Z2dncXFxf39/kJCQeXl5aWlpcXFxf39/goKCe3t7dXV1hYWFe3t7hISEeHh4jo6OmJiYcHBwfX19XV1dbW1tZGRke3t7fX19enp6f39/eHh4gYGBhoaGhISEbm5udnZ2gYGBfHx8f39/i4uLjo6OgYGBgICAaWlpf39/i4uLgICAkJCQjo6Ofn5+enp6hISEgYGBu7u7eHh4gYGBa2trgoKCgICAhYWFlJSUampqf39/k5OTmpqa6Ojofn5+hYWFj4+Pn5+fdHR0aGhoeXl5k5OTg4ODe3t7h4eHg4ODb29vhoaG////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////lZWVi4uLhYWFiYmJnJycdnZ2fn5+lpaWdHR0bm5ufX19aGhoc3Nzf39/fX19fn5+gICAfX19f39/cHBwhYWFe3t7dnZ2gYGBg4ODeXl5k5OTgICAqqqqenp6gICAj4+PjIyMjIyMdXV1goKCh4eHcHBwiYmJe3t7jo6Od3d3cXFxiIiIhYWFcHBwi4uLfX192dnZhISEmZmZiIiIc3NzgYGBeXl5bm5uhISEjo6OdnZ2jo6OkpKSb29vJiYmhoaGcnJycHBwd3d3d3d3g4ODcHBweHh4enp6eHh4paWlWVlZfn5+c3NzfHx8ioqKhoaGeHh4iIiIenp6fHx8bW1teHh4goKCaWlpfn5+oKCgfn5+hYWFd3d3goKCb29vpKSkjIyMkZGRjo6Os7OzjIyMi4uL0NDQaGhoZ2dnlZWVi4uLg4ODiYmJenp6oqKifHx8c3Nzk5OTenp6YmJifHx8gYGBh4eHd3d3hISEkZGRfn5+mJiYgICAsbGxlJSUZ2dnZ2dneXl5iIiIdXV1YmJibW1tdHR0aWlpf39/kZGRxsbG////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tra2fn5+fn5+b29vgYGBhYWFiIiIoqKijY2NeXl5fX19ioqKgYGBYWFhfHx8lZWVbGxsgICAcHBwdHR0hISEcXFxgoKCfn5+gICAjY2NjY2NgICAhISEoaGhg4ODl5eXc3NziIiIhYWFb29vgoKCkJCQd3d3ZmZml5eXhISEb29vfn5+dXV1mZmZg4ODe3t7g4ODcnJygYGBfX19enp6mZmZgoKCenp6kpKSiIiIjo6OYGBgiYmJcHBwdHR0fHx8YmJikJCQi4uLfn5+hoaGgICAd3d3bGxslJSUg4ODb29vfn5+bGxsjo6OaWlpfn5+d3d3b29vZWVldXV1goKCmpqae3t7hoaGgYGBhISEeHh4hoaGaGhodHR0Wlpafn5+jo6Obm5ud3d3fX19fn5+eXl5gYGBf39/j4+PlpaWdXV1iIiIlJSUmJiYiYmJfX19enp6dnZ2goKChISEjIyMYmJid3d3hYWFkZGRjIyMgoKCeXl5f39/enp6goKCeXl5cXFxenp6ZGRkcXFxaGholpaWgYGBe3t7cnJyeHh4bGxs////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////iYmJhYWFh4eHiIiImJiYcHBwgICAj4+PioqKdnZ2dXV1jo6Of39/l5eXkZGRdXV1e3t7eHh4bGxsX19fZ2dng4ODbm5ueXl5fX19k5OThISEioqKg4ODb29vh4eHgoKCeXl5fn5+fX19dHR0i4uLe3t7kZGRf39/aWlpeXl5lZWVgICAeXl5cHBwjo6OlJSUjo6OdnZ2gYGBg4ODbW1tgYGBfX19g4ODgICAh4eHdXV1eXl5lZWVenp6hYWFfX19np6ec3NzYmJidHR0cnJygoKCioqKZWVlioqKZWVlfn5+fHx8kpKSR0dHX19fjY2NeHh4gYGBenp6fX19cXFxi4uLhISEf39/e3t7cnJyeXl5ZGRkX19fd3d3fHx8goKCfHx8jo6Oenp6hoaGenp6g4ODgYGBk5OTf39/ioqKmZmZmZmZg4ODjo6OlpaWg4ODfn5+gICAioqKe3t7h4eHf39/hISEjY2NgoKCkJCQhoaGcnJyf39/fX19fn5+fX19e3t7b29vYGBgY2NjZWVlcHBwcXFxampqb29vfn5+ioqK////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/PzmJiYi4uLgYGBgICAioqKenp6gICAg4ODjo6Od3d3mpqai4uLjo6OioqKxsbGbW1tf39/enp6Z2dnUFBQgYGBZWVla2trcHBwb29vgICAcXFxe3t7gICAhoaGioqKhoaGdnZ2kJCQfX19hoaGg4ODjIyMj4+Pg4ODm5ubdnZ2gYGBhYWFdXV1fX19bW1trq6ugoKCc3NzhoaGdHR0d3d3lJSUf39/hYWFjIyMjIyMfX19fX19eHh4iYmJb29veXl5cnJykJCQjIyMeXl5TU1Nc3Nzmpqaurq6Xl5ehISEiIiIkZGRg4ODgICAaGhogYGBeHh4goKCfn5+gICAlZWVenp6e3t7kpKSenp6c3NziYmJnZ2diIiIioqKgoKCenp6f39/fHx8cXFxgoKCiYmJc3NzlZWVdnZ2e3t7lpaWfHx8d3d3cnJyb29vgoKCgoKCfHx8f39/bGxsdnZ2fX19cnJyfHx8kJCQnZ2dg4ODfHx8gICAdXV1eHh4hYWFcHBwX19fhISEa2trfX19Z2dnf39/lJSUgICAfX19cXFxh4eH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////jIyMioqKbm5ujIyMh4eHfHx8c3NzjY2NlpaWnZ2dxMTEuLi4fn5+iYmJhoaGeXl5a2trlJSUbW1tenp6enp6bW1tcnJyeXl5ampqdHR0ZWVlaGhoeXl5c3NzcnJyh4eHeXl5kpKSdHR0fn5+dHR0i4uLfn5+g4ODhYWFhISEmZmZiYmJcHBwcXFxampqcnJyfn5+e3t7f39/g4ODb29vn5+fmJiYlZWVioqKfX19i4uLiIiIhYWFf39/b29vd3d3g4ODeXl5fX19e3t7cnJyioqKubm5n5+fd3d3dHR0iIiImpqag4ODenp6e3t7m5ubgoKCjo6OeHh4eXl5hoaGdHR0fX19kpKSnJyccXFxfX19cHBwd3d3fHx8e3t7g4ODjo6OhYWFe3t7e3t7eHh4eXl5f39/fHx8enp6lJSUf39/fX19gICAZmZmeHh4dnZ2mpqagICAd3d3fn5+goKChISEkpKSgYGBi4uLioqKgoKCeHh4cnJyeHh4dXV1gYGBW1tbgICAkJCQoaGhgoKClpaWoaGhf39/hISEf39/cnJy8vLy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////i4uLjIyMfX19eHh4g4ODioqKm5ubhISEiYmJlZWVk5OTmpqajo6Ojo6OhISEa2trc3NzfHx8eXl5bW1tdXV1cHBwYGBgaWlpX19fbGxsampqaWlpcHBwg4ODioqKh4eHbGxsgICAenp6hYWFa2trcXFxhISEgYGBfHx8f39/dnZ2d3d3mZmZgICAgoKCkJCQmZmZioqKmJiYlZWVnZ2dmJiYurq6iYmJi4uLiYmJhYWFZmZmioqKgoKCb29vioqKhoaGcXFxeHh4fn5+tbW1fn5+goKCh4eHgYGBoqKinZ2dZWVl////fX19bm5ul5eXaGhoi4uLcXFxX19fgICAgYGBj4+PnJychoaGgYGBi4uLf39/ioqKf39/iIiIe3t7i4uLf39/k5OTlZWVjo6OhISEioqKhYWFk5OTtra2fX19enp6ioqKioqKf39/hISEjY2Ng4ODfX19f39/fHx8g4ODaGhoc3NzcXFxaWlpeXl5g4ODZWVldHR0fn5+cXFxaGhobGxsdXV1f39/kZGRj4+Pi4uLV1dXgICAenp6Y2Nj/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+hYWFlpaWjY2NgoKCeXl5ZGRkk5OTg4ODfHx8gICAj4+PioqKgICAjIyMa2trcHBweXl5enp6X19fe3t7Z2dnaGhoWVlZW1tbX19fXFxcb29vZGRkd3d3fHx8jIyMgYGBdXV1Z2dnf39/dnZ2gICAfHx8kJCQmpqav7+/hYWFbm5ug4ODgYGBampqhoaGg4ODjo6On5+furq6jY2NgYGBgYGBgoKCUlJSmZmZdXV1g4ODsLCwioqKiIiIiIiIZ2dnbGxsgYGBm5ubqKioXV1ddXV1iYmJZWVld3d3k5OTW1tbZmZmgoKCdnZ2fHx8i4uLioqKmJiYc3NzsbGxioqKgYGBhYWFmJiYiIiIf39/hISEgoKCdHR0hYWFycnJg4ODi4uLdHR0cXFxdHR0iYmJf39/dHR0nJycfX19u7u7hYWFgYGBfn5+d3d3gYGBeHh4c3NzfX19goKCcnJyc3NzcHBweHh4dHR0cnJyeHh4dHR0gYGBhYWFYmJibGxscnJya2tre3t7ampqjY2NYGBgampqdnZ2fHx8aWlpk5OTcHBw////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ioqKg4ODenp6eXl5fX19IyMjjIyMhoaGfn5+i4uLf39/hYWFiIiIeHh4g4ODf39/fX19goKCfX19YGBgfn5+bW1tZWVlVFRUb29vYmJiXl5eTU1NbGxsiIiIdHR0ZmZmb29vg4ODXFxcfHx8b29vdXV1hoaGl5eXf39/eXl5hYWFjY2NfX19j4+PgYGBa2trhISEl5eXyMjIvb29rq6ura2tjY2Ntra2f39/kZGRqKiohISEj4+PgoKCf39/kpKShYWFlJSUenp6qKiofX19fn5+fHx8qampbGxsfn5+dnZ2g4ODcXFxlZWVdHR0hISEqqqqi4uLj4+Ph4eHl5eXenp6gICAk5OTqampdHR0e3t7kJCQiIiIbGxscnJyjo6OioqKfn5+fX19hYWFeXl5enp6iYmJgICAj4+PioqKgYGBvb29cXFxdXV1fHx8e3t7e3t7enp6gICAj4+Pg4ODk5OTj4+PioqKjIyMfX19l5eXg4ODfHx8jY2Ni4uLYmJigYGBXFxcYmJil5eXjIyMbW1tdXV1eHh4oqKiZmZmf39/lJSU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////i4uLmJiYgICAe3t7eHh4d3d3ZGRkcHBwhISEf39/fHx8jY2NjY2Nf39/gYGBjo6OampqhoaGYmJibm5uaWlpV1dXb29vb29vaWlpMTExXl5enJycd3d3b29vY2NjcnJyeXl5fX19goKCenp6VFRUc3NzUFBQbW1td3d3bm5ua2trj4+P8/PzeXl5iYmJiIiId3d3wcHBl5eXrq6upqamwsLCmpqaysrKubm5q6urw8PDh4eHqKiofX19b29vkpKSfX19jY2NkJCQpKSkhoaGgICAgICAj4+Pd3d3np6ebm5uiYmJi4uLgoKCfX19d3d3gYGBoaGhgoKCiIiId3d3i4uLenp6gYGBnZ2dhYWFhISEb29vhYWFc3NziIiIa2trjIyMioqKhYWFhYWFkZGRfHx8gYGBfX19np6er6+vzMzMurq6iYmJfn5+gYGBhISEc3Nzbm5ulpaWdnZ2cHBwhISEkZGRgYGBk5OTi4uLkJCQb29vjY2NiIiIenp6lJSUZmZmZ2dnfX19bW1tfHx8fn5+eHh4eXl5fHx8gICAbGxsu7u7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////dHR0dHR0jY2Nenp6h4eHbGxsi4uLd3d3fX19h4eHeXl5dHR0ioqKdHR0fHx8c3Nze3t7XFxcX19fXV1dWlpab29vn5+foKCgk5OTnZ2dfn5+a2trZmZmbm5ue3t7YGBgaGhocXFxc3NzXFxcd3d3ZGRkZWVlZWVlZWVlXV1dZmZmYWFhWFhYaGhocnJyoqKij4+PlZWVoKCgq6urmJiYm5ubk5OTpKSk2tra0dHRiIiIlJSUfX19g4ODmJiYhISElZWVurq6jIyMgoKCgICAmJiYe3t7gICAXl5el5eXfHx8cnJyfn5+pqameHh4cHBwd3d3urq6iIiIeXl5dXV1goKCj4+Pd3d3h4eHmZmZfn5+jIyMfX19k5OTiIiIZGRkdnZ2jIyMZGRkfHx8qqqqurq6kJCQf39/cXFxg4ODhoaGlJSUenp6goKCg4ODf39/oqKihISEiIiIeXl5fn5+eHh4d3d3iYmJh4eHgYGBcnJyfX19dXV1e3t7fHx8cHBweXl5bm5ujIyMk5OTiIiIh4eHc3NzcXFxhoaGeHh4YWFh////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6urqhYWFgYGBjIyMZ2dnf39/kZGRfn5+fHx8hYWFj4+Pj4+Pi4uLjY2NgYGBgoKCgoKCeHh4bW1tWVlZkJCQe3t7kpKSdHR0ampqh4eHcHBwb29vhoaGcHBwbm5ubGxsfn5+YmJia2traWlpdXV1XFxcaGhoaGhob29veHh4cHBwdnZ2dHR0W1tbZ2dnYWFhbGxshISEk5OTkZGRmpqavb29mZmZlJSUh4eHra2tl5eXgYGBiIiIh4eHkZGRgYGBgoKCdHR0ZmZms7OzkZGRhoaGeXl5j4+Pa2treHh4pKSkg4ODi4uLxMTEgICAh4eHc3NzdHR0uLi4kJCQgICAhISEf39/bm5ucHBwgoKCc3Nzjo6OeXl5dXV1gICAd3d3jo6Ol5eXhoaGrq6ugoKCeXl5fn5+iYmJfHx8hYWFbGxsd3d3lJSUlpaWc3NzfX19eXl5eXl5goKCdXV1hISEeHh4g4ODi4uLbm5ufn5+enp6hYWFd3d3cHBwfHx8dHR0goKClpaWgYGBdXV1a2trm5ubenp6ampqX19fb29vZ2dnc3Nz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vb29gYGBgoKCfX19fn5+bm5ufHx8kJCQkJCQfn5+mpqanZ2dh4eHlJSUgICAe3t7bW1tbW1tbW1teHh4cXFxc3Nzk5OTdnZ2h4eHY2NjdnZ2paWla2triYmJcnJyc3NzdXV1YmJicnJyXFxcaGhoY2NjlpaWb29vWFhYcXFxZGRkeXl5hISEWFhYZ2dndXV1d3d3g4ODt7e3iIiIzc3N2tranJycjY2NkZGRnZ2dnJyckJCQi4uLeHh4kpKSenp6ioqKd3d3gYGBhoaGoqKijY2Ni4uLc3NzeHh4g4ODbGxsf39/cHBwfn5+e3t7f39/fHx8oaGhc3Nzenp6gICAcXFxmJiYhYWFlpaWe3t7oKCgjIyMnp6exsbGhoaGj4+PjY2NqKiog4ODhYWFfHx8c3Nzf39/c3Nzbm5ujY2NdXV1lJSUpKSkeXl5ampqenp6d3d3cXFxd3d3cXFxiYmJfHx8i4uLg4ODgoKCfHx8g4ODjIyMfn5+fn5+bW1toKCgd3d3i4uLg4ODYmJiYGBgbm5uZ2dnY2NjU1NTYmJiampqdHR0////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////dXV1dnZ2cnJyeHh4iIiIjIyMcHBwh4eHhYWFiIiIe3t7g4ODjo6OfX19jIyMbm5uampqdnZ2eHh4a2trh4eHhoaGdHR0WFhYenp6bW1tenp6e3t7dHR0jo6OhYWFeXl5goKCaGhoXV1dWlpaX19fa2trXl5eXV1dW1tbWVlZWlpabGxsU1NTYmJibGxsrKysY2Nj9fX1vr6+rKysrq6u1NTUg4ODaWlplJSUmJiYg4ODiIiIgYGBi4uLj4+PioqKiIiIeHh4nZ2dcXFxfX19o6OjgoKCgYGBenp6gICAi4uLg4ODk5OTh4eHdnZ2gICAf39/j4+PfX19ioqKhYWFf39/eHh4fHx8cnJyS0tLb29vfX19dHR0cHBwoKCgYWFhiIiIeHh4g4ODhYWFbm5uiYmJlZWVkZGReHh4ampqm5ubpaWleHh4jY2NhoaGjIyMgoKCfHx8d3d3eXl5fHx8gICAb29veHh4fX19e3t7c3Nza2trfn5+h4eHcHBwnZ2df39/fX19fn5+aWlpY2NjZ2dnWlpaXFxcaGhocnJyaWlp9vb2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////gICAgICAj4+PcnJyf39/hISEkpKSc3NzgICAfn5+dXV1ioqKiIiIg4ODfX19eHh4d3d3hISEbW1tdHR0fn5+fn5+a2trdnZ2fn5+a2trdXV1jIyMc3NzWVlZj4+Ph4eHioqKbGxscHBwe3t7YGBgWVlZX19fXFxcUlJSXFxcYmJiaGhoe3t7cXFxXl5eu7u7aWlpc3NzjY2No6OjoKCgampqWVlZb29vbGxshYWF6enpfn5+bW1tioqKhISEhISEhoaGenp6Xl5eh4eHgICAnZ2dgYGBgoKCeHh4ZWVlZmZmcXFxgYGBf39/fX19dXV1i4uLeHh4oKCgkZGRjo6Oa2trdXV1dnZ2cXFxe3t7jIyMfHx8cXFxmpqalJSUc3Nzf39/fHx8jIyMc3NzhISEjo6OqKioiYmJhoaGd3d3enp6d3d3cHBwgYGBfX19eXl5dHR0oqKihoaGkJCQg4ODo6OjfHx8fn5+eXl5dnZ2goKCgoKCdHR0fX19hYWFa2trbGxsb29vZGRkX19fZWVlZmZmaGhobGxsc3NzY2Njampq////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////g4ODc3NzX19fl5eXfHx8fHx8gYGBjY2Nfn5+cnJyenp6hYWFhoaGhoaGc3NzhYWFfHx8gICAfn5+gICAf39/hYWFenp6d3d3e3t7hoaGf39/bm5utbW1d3d3i4uLgoKCY2Njm5ubWVlZampqdHR0dHR0bW1tf39/Xl5efHx8gICAg4ODeXl5g4ODWVlZampqaWlpd3d3goKCi4uLtra2b29vhYWFbGxsZ2dna2trZ2dneXl5fn5+f39/goKChISEj4+Pg4ODhYWFenp6eXl5wsLCkJCQeHh4jIyMhYWFgYGBioqKc3NzgICAhYWFiYmJaWlpi4uLhYWFmpqaj4+Pjo6Ojo6OdHR0gICAe3t7g4ODenp6k5OTdnZ2b29vi4uLenp6g4ODqampjo6OjIyMjo6OfHx8h4eHgYGBfHx8mpqaioqKeXl5cHBwjIyMaGhoh4eHd3d3lZWVgoKCcnJygICAiIiIkJCQjIyMlJSUfHx8h4eHcnJycnJygICAd3d3dHR0gICAdXV1VlZWampqfHx8bm5udXV1ampqbm5ucHBwcnJy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////h4eHkJCQmpqajY2Nenp6nJycjIyMh4eHgoKCmpqaf39/fX19e3t7i4uLkJCQdHR0dHR0hoaGZGRkiYmJfX19lZWVdXV1dnZ2Z2dnZmZmcnJyhYWFnJycenp6gYGBd3d3eXl51tbWf39/d3d3ampqbm5udHR0kJCQiYmJhISEfX19d3d3ZWVlf39/eHh4X19fXV1dZWVlh4eHcHBwYWFhhYWFi4uLhoaGgICAampqcXFxhoaGd3d3lJSUf39/n5+fkpKSgYGBhoaGd3d3fHx8l5eXxsbGeHh4dXV1eHh4bGxsYGBgiIiIeXl5UVFRfn5+gICAgoKCfn5+qqqqfHx8gICAhYWFd3d3cnJybm5ud3d3g4ODfHx8lJSUdHR0e3t7gICAfX19fHx8fHx8fHx8gYGBfX19e3t7hISEenp6eHh4cnJyenp6kpKSgoKCa2trlJSUp6enqqqqrq6uk5OTlJSUo6OjjY2Nj4+Ph4eHlJSUZmZmdnZ2cXFxgICAhoaGdnZ2dXV1dHR0YGBge3t7hYWFeHh4dnZ2enp6e3t7b29veHh4////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/6enplJSUhISEdHR0gYGBenp6fX19hYWFh4eHmpqaiIiIfn5+eHh4YGBgbm5ufHx8fn5+hISEenp6eHh4iIiIPj4+ubm5gYGBcnJyd3d3dnZ2d3d3gYGBfn5+fn5+bm5uampqfn5+fn5+hISEnp6edXV1gICAgoKCkZGRY2NjhYWFhISEenp6enp6hISEcnJyfn5+fn5+fn5+d3d3ioqKkJCQfn5+fn5+kpKSkpKSdnZ2gYGBfn5+f39/bm5ulpaWh4eHiIiIlJSUfX19srKyjIyMrKysgYGBgYGBlJSUmpqagICAgICAfHx8lJSUiIiIfX19e3t7c3NzgYGBb29vbGxsdnZ2ampql5eXcHBwfn5+fHx8d3d3eHh4np6ej4+Pf39/eHh4iYmJhISEiYmJgYGBgICAh4eHiYmJg4ODoaGhfHx8ZmZmd3d3c3NzhYWFiYmJf39/fn5+dnZ2ioqKZ2dntra2urq6j4+Pf39/tLS0kZGReXl5dHR0fn5+aWlpgYGBcXFxfHx8b29vnJyccHBwaGhoeXl5i4uLdHR0////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////mJiYgYGBiIiIcHBwhYWFenp6aGhoa2trkJCQfn5+jo6OfHx8iYmJbGxsiYmJgYGBY2NjqKioioqKdHR0eXl5bGxsgoKCfn5+fn5+np6efX19gYGBc3NzjIyMgYGBgoKCe3t7ioqKg4ODf39/fn5+gICAd3d3qampi4uLeHh4e3t7h4eHfn5+goKCgYGB2trahISEe3t7fn5+hISEpKSkgICAl5eXiIiIhoaGioqKgoKCjIyMhISEhoaGfn5+fn5+f39/jIyMg4ODcXFxioqKc3NzhoaG4ODgfHx8ra2thoaGf39/kJCQi4uLdnZ2hISEfn5+enp6gICAenp6dXV1bm5ubGxse3t7dXV1dHR0oKCgb29vbW1tfn5+lZWVg4ODhYWFkJCQkpKSf39/lZWVgoKCiYmJc3Nzd3d3i4uLc3Nzmpqas7Ozq6uraWlpkpKSjo6Og4ODn5+fycnJlJSUfHx8Z2dnurq6srKywMDAtbW1sbGxkpKSeXl5hYWFtLS0a2trampqa2trdnZ2a2tre3t7b29venp6ampqZ2dnh4eHr6+v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////hYWFk5OTi4uLnp6ekJCQj4+PfX19eHh4f39/lZWVfX19eHh4fn5+eXl5f39/cHBwioqKjY2NkJCQbm5ueHh4e3t7e3t7h4eHd3d3kJCQdXV1gICAk5OTd3d3h4eHgICAgICAgYGBenp6Z2dnd3d3f39/hISEcnJyfHx8h4eHiIiIc3NzfX19hYWFioqKi4uLdnZ2jY2Nc3Nzfn5+iIiIkZGRioqKd3d3hYWFkZGRiYmJj4+Penp6goKCh4eHjY2NiIiIf39/i4uLfHx8h4eHjIyMd3d3jY2NycnJlJSUmZmZgYGBYmJii4uLkJCQcnJyoqKienp6fHx8m5ubmJiYiIiIgYGBcHBwZWVlgICAenp6dnZ2eXl5hISEkpKSjIyMk5OTlZWVjIyMioqKfX19hISEioqKiYmJsbGxgoKCnp6ej4+PgICAjY2Nbm5ua2tro6OjfHx8fn5+ZmZmhYWFm5ubfHx8h4eHgoKCgYGBn5+fd3d3enp6enp6f39/nZ2dcXFxbGxsb29vd3d3cHBwaWlpd3d3cnJyc3Nzc3Nzp6end3d3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////nZ2dp6ennp6el5eXl5eXiIiIhoaGiYmJbW1tbGxsj4+PgICAd3d3gICAiIiImpqae3t7h4eHfn5+e3t7dnZ2h4eHe3t7g4ODgYGBl5eXkpKSeHh4goKCg4ODjIyMfHx8jo6Of39/dHR0jo6Ojo6Og4ODe3t7eXl5jY2NgYGBeHh4gYGBhYWFf39/q6urjY2Nh4eHgICAf39/j4+PiYmJqKiohYWFgICAgYGBhYWFg4ODj4+Pf39/ioqKdnZ2g4ODmZmZg4ODg4ODkZGRsLCwk5OTnZ2dpKSklZWVjo6OlJSUaGhoiIiIi4uLjIyMdXV1g4ODhISEdnZ2cXFxZWVlrq6ue3t7hYWFgoKChYWFioqKdXV1gYGBfX19bW1tb29vkZGRiYmJcXFxcXFxi4uLhYWFmpqacHBwj4+Pf39/fHx8fn5+fX19fX19bW1tZWVlhYWFaGhofn5+fn5+hISEg4ODhISEjY2NhYWFY2Njenp6e3t7dHR0bGxsiIiIi4uLkZGRl5eXc3NzgICAd3d3mpqahISEoKCgrKysf39/bW1tbGxs////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////XV1dmJiYq6urp6enkJCQhYWFioqKiYmJnZ2dj4+Pk5OTcXFxmpqampqaqqqqeXl5f39/hoaGk5OTkZGRiIiIgoKCdnZ2fn5+gYGBgICAfHx8eHh4hoaGfX19dnZ2iYmJlZWVlJSUjY2NioqKjIyMfn5+hoaGd3d3fHx8e3t7eXl5enp6jY2Ng4ODjIyMiYmJiYmJiIiIlZWVj4+PkpKSjo6Oh4eHgoKCg4ODjIyMhYWFmZmZi4uLgYGBh4eHg4ODb29vYGBgbm5uhoaGg4ODgoKCgoKCenp6enp6enp6mJiYrKysiYmJe3t7eXl5fn5+hISEkpKSgoKCd3d3hYWFh4eHenp6kZGRdXV1jIyMnJyclJSUi4uLjY2NoqKin5+ffn5+g4ODfn5+m5uboqKilJSUkZGRgoKCmpqalpaWgYGBgYGBg4ODc3Nzg4ODioqKgICAiYmJg4ODhoaGhoaGenp6fn5+iYmJiYmJcnJygYGBkJCQkpKShoaGdnZ2dXV1d3d3enp6c3NzoaGhs7Ozk5OTfHx8YGBgf39/dXV1aGho////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ycnJn5+fkpKSlpaWpaWlj4+Pjo6OdXV1kZGRoqKijo6OhoaGcnJyk5OTi4uLiIiIg4ODeXl5eHh4gICAbm5ui4uLhoaGnJyckJCQg4ODhYWFf39/jo6OeHh4bW1tfn5+lJSUm5ubeXl5bm5ue3t7g4ODgICAhoaGj4+Pd3d3g4ODfn5+bm5uf39/e3t7gICAg4ODiIiIkJCQb29vhISEiIiIiYmJhISEjo6Oi4uLkJCQgYGBfX19cnJyenp6hYWFdnZ2gYGBlJSUeXl5jo6OgoKCZmZmgICAZ2dnrq6ueXl5jIyMoaGhlpaWeHh4bm5uhYWFdHR0hISEjIyMiIiIf39/gYGBioqKlZWVy8vLtLS0rKyso6OjnZ2doqKiurq6mZmZkZGRjY2Nc3NzTk5OdnZ2k5OTsLCwj4+PlpaWubm5np6ek5OTf39/hISEd3d3l5eXiIiIeXl5fHx8fHx8iYmJfHx8dXV1iYmJiYmJbm5ukZGRhISEc3Nzc3NzfHx8hoaGenp6fX19jY2Nenp6b29vdXV1aGhoYmJiYGBge3t7jIyM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////kJCQq6ursbGxkJCQj4+PpaWliYmJeHh4i4uLkJCQi4uLg4ODc3NzjIyMlZWVqKiokZGRbGxse3t7i4uLenp6fn5+goKCi4uLj4+PqKiok5OTi4uLoaGhpaWleHh4cnJyhYWFjY2NeXl5hoaGg4ODhISEgICAh4eHjo6Om5ubhoaGgYGBfX19e3t7mZmZj4+PioqKk5OTjo6Ompqaf39/jIyMhISEjIyMjo6Oh4eHg4ODioqKf39/fn5+ioqKs7OzkZGRiYmJaWlpjIyMj4+PhYWFmJiYeHh4oKCgfHx8kZGRgoKCfHx8gICAi4uLfX19jo6Oi4uLgoKCd3d3iIiIk5OTe3t7mZmZo6Ojr6+vqamphISEYmJigYGBbGxstLS0eHh4f39/jIyMg4ODg4ODh4eHkZGRjY2Nk5OTlZWVvLy8j4+Pk5OTb29veHh4kJCQenp6ioqKeHh4fn5+jo6OdnZ2dHR0jY2NkpKSenp6cXFxZGRkk5OTiYmJf39/fHx8W1tblZWVm5ubvLy8dnZ2goKCeHh4fHx8jIyMdXV1hoaGioqK////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////pKSkn5+foKCgnZ2dhYWFo6OjgoKCiIiIkpKSi4uLlJSUgYGBlpaWj4+PmJiYmpqakZGRgYGBkZGRe3t7kpKSlZWVe3t7jo6OlZWV2trakZGRioqKi4uLbW1teXl5f39/jo6OjIyMi4uLh4eHbm5udHR0iIiIioqKjo6OhISEioqKgYGBg4ODfHx8gYGBiYmJr6+vra2tioqKfX19hISEfHx8fHx8g4ODgoKCenp6b29vcnJyZ2dndXV1i4uLk5OTiIiIgYGBXl5ecnJykpKSioqKenp6jIyMioqKdXV1bGxsYmJic3NzjY2Nj4+PkJCQeHh4dXV1iYmJy8vLgYGBjIyMgoKCpKSkk5OTkpKSbm5ufX19hoaGeXl5cHBwe3t7c3NzjIyMhISEhISEsbGxeXl5c3NzfX19eHh4enp6lZWVenp6enp6dXV1i4uLgICAeXl5wMDAi4uLfX19goKChISEbW1tdHR0kJCQbm5uZGRkkpKSsrKyoaGhfn5+dXV1aWlphISEdnZ2enp6d3d3ampqfHx8lZWVdHR0dnZ2cnJyu7u7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zs7OLCwsq6uroKCgi4uLjo6OkZGRrq6uhoaGfn5+mpqahoaGioqKnp6egoKCqKiohISEfX19kJCQioqKrKysi4uLjIyMlJSUmpqaj4+PjY2Nl5eXmZmZjIyMj4+PlZWVjIyMgYGBiYmJiYmJkJCQgICAiIiIe3t7ioqKgYGBh4eHk5OTkpKSo6OjioqKjY2Ns7OzmZmZdnZ2fHx8gYGBfHx8hISEiIiIg4ODkpKSk5OTjIyMi4uLmpqaf39/fn5+kpKSe3t7iYmJk5OTgYGBgYGBh4eHioqKdXV1e3t7iYmJhYWFhoaGk5OTenp6iYmJgICAe3t7gYGBj4+PiIiIjIyMfn5+l5eXmZmZenp6g4ODc3NziYmJiYmJcXFxgoKCbW1tenp6jY2NkZGRlJSUl5eXh4eHlpaWnZ2di4uLhYWFenp6g4ODfX19g4ODf39/d3d3gICAcXFxgoKClpaWeXl5eHh4gICAhoaGoaGhlpaWbGxsbW1tk5OTg4ODY2NjcXFxbm5um5ubdXV1cXFxcnJylZWVaGhocHBwcnJyenp6bm5u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////jY2NnZ2dmpqanp6enp6enp6ejo6OjY2Nn5+foaGhiIiIhISEhISEnp6eiYmJlZWVkpKSmpqanZ2dj4+Pjo6OkJCQh4eHoKCgjY2Nj4+PmJiYl5eXlJSUsbGxn5+fkZGRe3t7iIiIiYmJj4+PeXl5gYGBf39/hISEioqKhoaGi4uLjY2Njo6OlJSUwcHBmZmZ////lZWViYmJiIiIfHx8jIyMiYmJi4uLgICAioqKj4+PkZGRj4+Pi4uLjY2Nenp6jo6Oj4+PgICAgYGBcHBwe3t7jIyMiIiIhoaGjIyMb29vj4+Pi4uLjIyMubm5np6ei4uLd3d3fX19f39/cXFxgICAqamphISEfX19dHR0dHR0f39/oqKie3t7gYGBbGxsgYGBi4uLbGxsiIiIgICAfn5+goKCf39/gYGBh4eHj4+Pg4ODgYGBjIyMg4ODlZWVjo6OkJCQgYGBe3t7gICAfHx8f39/lZWVdHR0j4+Pd3d3c3NzdXV1jY2NZWVlYWFhhISEenp6dnZ2cHBwg4ODfn5+kZGRZWVlhoaGe3t7eXl5cnJy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////enp6hoaGjo6Oo6OjlJSUnJycjIyMfn5+k5OToqKijY2NkJCQkZGRjY2NnJyclJSUo6Ojl5eXkZGRmJiYra2tjIyMjY2Njo6OlJSUmpqalJSUfn5+kJCQnZ2di4uLioqKkJCQg4ODm5ubcnJyiYmJeXl5fX19c3Nze3t7hYWFgoKCh4eHj4+PlJSUv7+/k5OThoaGiIiIenp6aWlphoaGjIyMj4+Pi4uLj4+PiYmJlJSUcnJyl5eXgYGBh4eHfX19i4uLeHh4gICAfHx8jo6OiIiIgoKCkJCQh4eHjIyMhYWFeXl5fHx8gYGBhISEjIyMkJCQg4ODe3t7cnJyi4uLp6ennp6elZWVf39/gYGBgICAcXFxdnZ2fX19gYGBcnJyi4uLlJSUi4uLe3t7h4eHgoKCcHBweHh4f39/k5OT4ODgh4eHfX19gYGBd3d3e3t7eXl5jY2NiIiIhISEkZGRenp6iYmJfX19gICAc3NzcXFxcXFxdXV1cnJybGxscnJyf39/gYGBjY2NZ2dncnJydHR0hoaGd3d3f39/a2trgICAe3t7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vb2nZ2dmZmZkZGRiYmJkpKSkpKSjIyMg4ODl5eXpqampqamnZ2da2trenp6lZWViYmJo6OjmJiYjY2NmpqalZWVlpaWhoaGlZWVnZ2dkJCQjIyMhISEk5OTj4+PlZWVjo6OnZ2diYmJioqKiIiIjIyMlZWVh4eHgICAgYGBj4+Pjo6Ojo6Og4ODhoaGjo6OiYmJioqKj4+PmZmZfHx8iIiIgoKCj4+Pj4+PjIyMiIiIiIiIhoaGj4+PgICAf39/mpqa09PTi4uLgYGBgICAhoaGjY2Ng4ODioqKm5ublZWVh4eHhISEkpKSiYmJmpqamJiY+fn5eHh4n5+foaGheHh4kpKSiYmJkZGReXl5b29vn5+fhISEcHBwgICAdHR0enp6jo6Oc3NzhYWFfX19goKCg4ODgoKCZ2dnhISEgICAgoKCenp6fX19h4eHd3d3c3NzgYGBfX19kpKSZWVlj4+PqKiop6eneHh4lJSUeXl5fX19bGxscXFxd3d3fn5+kZGRi4uLgICAd3d3e3t7fn5+nZ2dkJCQu7u7eHh4cHBwoaGh7+/v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////hISEkJCQnZ2dj4+PcHBwmZmZkZGRnZ2dk5OTk5OToqKilJSUenp6m5ubl5eXlZWViYmJnZ2dkZGRmJiYmZmZl5eXkpKSlJSUjIyMkJCQiYmJkJCQi4uLfn5+hISEkpKSj4+PioqKhISEhYWFlZWVlpaWiIiIh4eHi4uLgoKCh4eHfn5+jo6Ofn5+hISEm5ubj4+PgYGBd3d3h4eHk5OTenp6eHh4f39/cHBwiYmJjo6OgICAioqKiIiIfX19g4ODiYmJl5eXl5eXnp6ef39/e3t7goKCfX19kZGRlpaWfHx8d3d3pKSkkpKSnp6egoKCfn5+f39/mpqagICAj4+Ptra2fHx8jo6OeHh4ioqK0dHRgoKChYWFe3t7gICAhYWFiIiIg4ODa2trh4eHfHx8dXV1hISEg4ODk5OTenp6h4eHgYGBZGRkZGRkhISEgYGBkJCQeXl5f39/cnJyhoaGnZ2dbW1ti4uLeXl5jIyMdXV1h4eHfHx8a2trjo6OgoKCampqnp6ebGxscXFxb29v2tran5+fvb29qqqqurq6e3t7j4+P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////lpaWl5eXioqKmJiYk5OTjY2NiIiImZmZkpKSo6Ojp6enkJCQiIiIkZGRm5ubg4ODlZWViIiIjY2NkpKSk5OTi4uLl5eXk5OTkpKShYWFmJiYkZGRjIyMkZGRkZGRfX19gYGBjY2NjY2Ni4uLjIyMhoaGiYmJfX19nZ2dg4ODgoKCfX19hYWFbm5uh4eHk5OTkpKSfn5+fHx8d3d3hYWFmpqamJiYiIiIbW1tbGxsXV1ddHR0iYmJi4uLpaWljY2NiYmJkJCQnJyctbW1nJyclJSUhYWFenp6kpKSnp6etra2iYmJr6+voaGhjIyMjo6Oo6OjlJSUh4eHnJycg4ODh4eHnp6egYGBhISElZWVfX19enp6fn5+c3NzdnZ2fX19jY2NjY2Nj4+PhYWFgICAenp6eHh4eXl5g4ODZGRkjIyMjo6OdnZ2bm5ueXl5bGxscXFxfX19fn5+np6edHR0fX19cXFxgoKCdHR0bm5ugICAcnJyfX19jo6Oa2trdXV1n5+fcnJybm5unp6eaWlph4eHgICAgICAv7+/l5eXrq6ufHx8////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////m5uboKCgiYmJiYmJh4eHh4eHi4uLhoaGlJSUm5ubr6+vqampoKCgoKCgkpKSoaGhnJyciYmJk5OTl5eXmZmZoaGhlZWVlZWVioqKg4ODlZWVkZGRlZWVioqKhYWFi4uLjY2NjY2NkZGRgICAioqKioqKkpKSgYGBfX19f39/eXl5kpKSh4eHgoKCfHx8gICAk5OTlJSUk5OTiYmJgICAh4eHrKyshoaGbW1tZGRkUVFRTk5OfHx8enp6lpaWlpaWkZGRmJiYmZmZpqamjY2NmpqakpKSnJyci4uLm5ubhISEg4ODo6Ojr6+vrq6uhoaGkZGRjo6OkJCQjY2Ng4ODiYmJfX19fX19hoaGe3t7eXl5enp6l5eXhISEcnJygYGBjIyMg4ODhYWFfX19mpqah4eHgoKChYWFdXV1Z2dne3t7iIiIiYmJnZ2dnp6ejY2Nl5eXjY2NiIiIm5ubi4uLdHR0a2trgoKCf39/jIyMdnZ2dnZ2lpaWgoKCiYmJY2Njg4ODenp629vbcnJyhISEa2trhoaG5eXlsbGxl5eXm5ubpKSk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xsbGr6+vrKyslJSUo6Ojj4+Pjo6OhoaGkpKSjo6Ok5OToKCgo6Ojo6OjlJSUmJiYvr6+mJiYkJCQqampmZmZi4uLoaGhkZGRiYmJjo6OhoaGjo6OlJSUlZWVhISEgoKCrq6ui4uLjY2NioqKi4uLiIiIeXl5gYGBfX19h4eHe3t7ioqKf39/fHx8mpqalJSUjIyMh4eHmJiYnp6el5eXhoaGgoKChISEiYmJeHh4RUVF6+vrZWVlg4ODe3t7sLCwn5+fsrKylpaWlpaWpKSknZ2dpaWlnp6eqqqqhYWFlJSUnp6elJSUf39/o6Ojk5OTiYmJ09PTlJSUn5+fx8fHfHx8np6etbW1rq6ukJCQgYGBhoaGg4ODfHx8ioqKnp6eeXl5hYWFfn5+iIiIlpaWhYWFeXl5jo6OeXl5kJCQgYGBiYmJkJCQjIyMfHx8e3t7mZmZfn5+fX19lJSUcnJyf39/dHR0fX19c3NzfHx8p6end3d3dHR0hoaGd3d3a2treHh4dHR0bW1te3t7bGxse3t7hYWFjIyMfn5+e3t7fX19eXl5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////p6enjo6OlZWVlpaWlZWVl5eXlJSUm5ublJSUgoKCjIyMo6OjoqKira2tsLCwo6Oj2trakpKSmZmZm5ubjo6Ojo6OsLCwnJycioqKgYGBm5ube3t7lJSUj4+PhoaGioqKjo6OqampfHx8j4+PiYmJiYmJe3t7goKCmJiYhoaGe3t7fHx8goKCmJiYeHh4fX19hISEj4+PiIiIjY2Nm5ubR0dHh4eHhoaGhISEcXFxkZGReHh4kpKSfX19h4eHsLCw5eXlo6OjtLS0mZmZ0NDQp6enkpKSp6enmJiYiYmJl5eXh4eHe3t7jo6OhYWFioqKkJCQfX19jY2NoaGhmpqakZGRj4+PnJycn5+fr6+vsLCwenp6hISEcnJyg4ODe3t7hISEg4ODgICAhISEioqKioqKg4ODh4eHhoaGhISEo6OjiYmJiYmJhoaG5+fnm5ubl5eXd3d3ampqlZWVfn5+h4eHfX19dnZ2kJCQgICAeHh4cXFxcXFxdHR0h4eHenp6hISEbW1tgoKCg4ODb29vkJCQdnZ2dHR0V1dXYmJi5ubm6urq////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////jIyMnJycjY2NmJiYrKysoqKim5ublJSUnp6eioqKk5OTnZ2dj4+PpaWljY2NsLCwuLi4t7e3oaGhi4uLk5OTjY2NpaWllZWVeXl5jo6Ol5eXlJSUh4eHf39/iYmJjo6OmJiYioqKjY2NhYWFeHh4fn5+mpqaiIiIkpKSlJSUjIyMiIiIfn5+dXV1eHh4f39/k5OTj4+PnJyclpaWjIyMMDAwdXV1jY2Nf39/f39/kJCQqampqampi4uLioqKiYmJiIiIqampnp6eoKCgmZmZkpKSnJych4eHoqKixMTEnZ2dlpaWsLCwoKCgw8PDgICAnJycjY2NhoaGl5eXkpKS0dHRkZGRkJCQeHh4kZGRkJCQfX19hISEjIyMeXl5e3t7hISEgICAh4eHg4ODYWFhfX19j4+PkJCQioqKf39/hoaGhYWFgICAgICAurq6tbW1iYmJbGxsdnZ2goKCrq6ueXl5gICAgICAg4ODeHh4c3NzZGRkd3d3h4eHeHh4dHR0bm5uc3NzZmZmk5OTo6OjbGxsenp6eHh4bm5ugICAeXl5ampq////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////mJiYqqqqlpaWjY2NmJiYfX19kpKSk5OTkpKSo6Ojl5eXnp6en5+fjY2Nn5+fj4+Pq6urtLS0wMDAlJSUl5eXhoaGnZ2diYmJi4uLmZmZg4ODgYGBkpKSjY2NiYmJiIiIfn5+i4uLmJiYjo6OjY2Njo6OkpKSlJSUiIiIk5OTnp6ejo6OhISEj4+PjY2NkpKSxcXFmJiYj4+PjIyMfn5+iIiIenp6FxcXd3d3R0dHY2NjlJSUq6urvb29paWlkJCQjY2N8vLyjIyMnJycp6enn5+fm5ublZWVqqqqmZmZqKiorKysrKysn5+fjY2NhoaGioqKioqKhISEiYmJhoaGi4uLhYWFjo6Og4ODhoaGhISEiYmJf39/lJSUe3t7fn5+goKChYWFd3d3MDAwg4ODhISEeXl5goKCYGBgkJCQkZGRc3NzmZmZsLCwrq6ulJSUg4ODk5OTenp6fX19fn5+eXl5dHR0fn5+gICAenp6fX19fn5+fHx8a2trcnJyeXl5ioqKhoaGb29vnp6eeHh4enp6bm5ud3d3ZmZmaGhodHR0eXl5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////lpaWn5+fnZ2dra2toKCgk5OTmZmZiYmJmpqampqaoaGhmZmZp6ennp6elpaWi4uLqqqqoqKirKys3t7ekZGRo6OjkpKSmJiYnZ2durq6n5+fk5OTi4uLenp6kZGRjo6OkpKSjY2NlJSUnp6enp6ei4uLi4uLgoKChISEe3t7gICAgYGBgYGBkpKSfHx8h4eHlJSUkZGRj4+PoqKikZGRhISEj4+PkZGRXV1dQkJCfHx8kZGRrKyshISE0NDQz8/PsbGx4+Pjp6en1tbWq6uruLi4qampl5eXhYWFjIyMdHR0vb29qqqqoqKinZ2drKyslJSUpqamgICAhoaGjo6OhISElJSUhISEiYmJioqKh4eHenp6f39/goKCe3t7goKChYWFjY2NjY2NWVlZcHBwd3d3h4eHiYmJkZGRg4ODiIiIgYGBoKCgqKioh4eHmJiYkJCQ2trae3t7e3t7fX19d3d3cnJye3t7dXV1eHh4d3d3hISEeXl5bm5ufHx8dXV1gICAf39/dHR0m5ubYGBgg4ODdHR0c3NzZ2dnbW1tcnJyeXl55eXl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oKCgpKSkh4eHnJycmpqan5+fmZmZk5OTkJCQqKiop6enoaGhkpKSq6urlJSUpaWlpKSkrKyszs7On5+flJSUnJycoqKimJiYkpKSl5eXiYmJk5OTgoKCkZGRlJSUgYGBhoaGgoKCjY2Nh4eHlZWVe3t7qKioeHh4kJCQeXl5hYWFfHx8lZWVhISEiYmJiIiIlJSUhYWFkZGRl5eXnZ2dmpqanZ2dq6urUVFRbGxshYWFgoKCp6enpKSkkZGRtbW1m5ubnp6eurq6srKyoqKirq6uoaGho6Ojh4eHrKysjo6Ox8fH0dHRt7e3p6enk5OT1tbWx8fHsrKyz8/PpaWlj4+PlpaWiYmJeHh4p6enkpKSe3t7i4uLjIyMfn5+kpKSjIyMgICAkZGRhYWFf39/ioqKcHBwiIiIrKysdnZ2enp6goKCd3d3pKSkmpqanZ2dh4eHwMDA8fHxenp6fX19jIyMgYGBh4eHeXl5hYWFc3NzkJCQj4+PlJSUgICAbm5ueXl5bm5uhISEkJCQenp6bW1tW1tbampqZWVlbGxsfn5+fHx8////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/fn5+foKCgp6enmZmZnp6eoqKioaGhmZmZpqamqKiol5eXtra2qqqqpqamo6Ojg4ODurq6qKiomZmZoKCgoKCglJSUjIyMjo6Oj4+Pi4uLlpaWgYGBmZmZkZGRiIiIjIyMjY2NfX19j4+Pe3t7enp6h4eHgoKCiYmJgYGBmJiYh4eHjIyMfX19d3d3iIiIm5ubnp6ejo6OlpaWmpqajY2NjY2NoqKimZmZn5+fHh4ehYWFkpKSi4uLoKCghYWFoqKiuLi4z8/PioqK09PTr6+v29vbxMTE0NDQ8/Pzw8PD/v7+5+fnwsLCv7+/paWl7Ozsr6+vwMDAxcXFwsLCjY2NhYWFdnZ2jIyMhISEj4+PhYWFjY2NhoaGenp6g4ODkZGRi4uLlpaWlJSUnJycd3d3dnZ2iIiIgYGBSkpKgICAcXFxfX19fn5+lZWVj4+Pjo6Og4ODfX19hISEhISEe3t7aWlprq6uo6OjhISEjY2NhoaGg4ODdHR0hISEf39/dXV1kZGRjY2Nenp6dXV1b29venp6dHR0aGhoZmZmZmZmiYmJcnJy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oKCgkZGRnp6el5eXo6Ojk5OTpaWloaGhn5+fpaWlj4+PoKCgpaWliYmJj4+PioqKmJiYoqKirKys+/v7m5ubkpKSlZWVioqKnp6ek5OTk5OTm5ubl5eXjo6OiIiIpaWllZWVe3t7kZGRiYmJjIyMioqKj4+Pj4+PdnZ2iIiIi4uLg4ODj4+PmZmZh4eHe3t7fHx8lpaWnp6ejo6Ok5OTsLCwm5ubnJycnJycdnZ2jo6OCwsLUVFRkpKSiYmJoaGhqKio1NTUr6+voaGh7OzsqKiora2t5ubmmJiY1tbWra2tvb2909PTqqqq9vb2w8PDtbW1/Pz8hoaGjo6OgoKClJSUgoKCjY2NkpKSmpqahoaGkpKSkpKSenp6fX19pKSkf39/iIiIhISEiYmJiIiIj4+Pg4ODdnZ2cnJyioqKg4ODhoaGcnJykJCQgoKChISEenp6dXV1fX19kZGRjIyMhYWFd3d3zs7Oc3NzgYGBbGxsiIiIh4eHf39/bGxsiYmJfn5+bm5udnZ2ampqcHBwc3NzgYGBcHBwb29vbW1td3d3cXFxiYmJ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////lpaWioqKpqampaWlpaWlioqKp6enpKSkoKCgiYmJm5ublZWVkZGRioqKubm5kZGRi4uLo6OjPT09l5eXlZWVlZWVnZ2dl5eXkZGRk5OTjIyMi4uLgoKCl5eXdHR0mJiYiYmJfHx8fn5+qKiojo6OhISEfX19ioqKioqKi4uLfHx8hoaGfn5+hISEgYGBiIiInJycm5ublZWVlZWVn5+fmpqalZWVmJiYs7OzlJSUk5OTa2trNTU1hYWFb29vmpqaqKiot7e34uLi29vb0tLSampqoaGhlZWVpqamqKiou7u739/fpaWlsbGx4ODgpqamsbGxpaWlmJiYnp6ejY2NgYGBenp6iYmJjIyMfX19fX19i4uLfn5+h4eHgoKCkpKScnJyjo6OhoaGh4eHkJCQgICAhYWFeXl5e3t7cXFxc3NzfHx8e3t7d3d3mJiYiIiIf39/dnZ2fX19gYGBeHh4eXl5e3t7dnZ2gICAdHR0fX19enp6h4eHhISEhoaGdnZ2fn5+fX19e3t7kpKSbW1tgICAbm5udnZ2ampqY2NjX19fgYGBzc3N////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4uLioKCgpaWlpaWlqKiokpKSoaGhnZ2dlJSUmJiYlZWVmZmZm5ubl5eXsbGxk5OTqKioi4uLl5eXpqamkZGRlpaWmZmZpaWlgoKCkZGRn5+fiIiIlJSUkZGRk5OTk5OTjIyMgYGBgYGBiIiIhYWFhoaGjo6Orq6um5ubhYWFj4+Pf39/hYWFi4uLgoKCjY2Nn5+fjIyMjY2Nl5eXoqKioKCgnp6eqamplJSUlJSUkJCQoaGhpKSkh4eHmpqalpaWnp6empqawMDA3NzcoaGhlJSUZWVlnZ2dhoaGoaGhr6+voaGh9/f3n5+fy8vL3Nzc1tbW3Nzcl5eXsLCwlJSUh4eHg4ODd3d3gYGBi4uLhoaGkZGRd3d3lpaWhoaGeHh4fX19f39/iIiIgICAk5OTmJiYhoaGgoKCra2thISEf39/iYmJc3Nzy8vLfn5+jY2NgICAgoKCiYmJaWlphYWFf39/nJycjIyMfX19hISEfHx8goKCc3NzhoaGl5eXfHx8e3t7eHh4bGxsg4ODgICAZWVlb29vg4ODZGRkZ2dndXV1iYmJYmJi////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8PDampqmpqao6Ojl5eXtLS0qamptra2ubm5n5+fqampn5+fqKios7OzjIyMlJSUj4+PjY2NVlZWm5ubsbGxoKCgmpqanJycmJiYi4uLo6OjlpaWvr6+r6+viIiIe3t7i4uLioqKiYmJk5OTioqKhoaGkpKSh4eHl5eXhISElpaWgICAioqKh4eHkZGRiYmJhoaGgICAhYWFjo6Oj4+Pjo6OoqKij4+Pq6urmJiYrKysoaGht7e3tra2r6+vlJSUpaWl2NjYnZ2d8vLyk5OTjY2NoaGhenp6zc3Nra2to6Ojo6Oj4uLi6urqqqqqp6en0dHRzs7O/Pz8qKioqKiogICAk5OTfX19dnZ2iYmJcHBwe3t7f39/ioqKhISEeXl5e3t7hISEgICAjY2Nenp6g4ODbm5uiIiIgoKCnJyciYmJgICAkJCQlZWVgoKCiIiIzs7Og4ODfn5+bGxslJSUfn5+pqamgYGBgoKCj4+Ph4eHmZmZnJyccXFxeXl5f39/bm5udXV1gICAhISElpaWj4+PdHR0fn5+aGhoeXl5h4eHkJCQbGxs////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////kpKSmZmZmJiYl5eXnp6eoqKira2tpaWlnZ2d7u7u9PT0////s7Ozl5eXlpaWlZWVmJiYampqkZGRjIyMjo6Ok5OTm5ubiIiIfHx8g4ODj4+PiIiIiYmJmpqagICAkJCQj4+PjY2Nj4+PgoKCenp6gICAhYWFoaGhcnJyjIyMlpaWiYmJjIyMiYmJZ2dnh4eHi4uLh4eHlJSUl5eXn5+flZWVl5eXv7+/p6enu7u7qKion5+fjo6Op6en2NjYnZ2dy8vLoaGh09PTwMDA/v7+vr6+nJycoKCgm5ublpaWmJiYl5eXk5OTn5+fkZGRpaWlqqqqoqKipaWlxcXFjIyMo6OjsbGxgoKCh4eHe3t7ioqKhISEd3d3gYGBc3NzhYWFgYGBjIyMk5OTjIyMiYmJjY2NioqKgICAfX19kJCQhoaGh4eHkpKSbGxsf39/pqamdXV1l5eXhoaGg4ODg4ODjIyMgoKCrKysjY2NdHR0f39/c3Nzf39/mJiYaWlpgoKCfHx8goKChISEgICAiIiIhYWFh4eHe3t7aWlpe3t7cnJybm5udXV1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////mpqakpKS9vb2m5ublpaWmJiYqKiooqKivLy8q6ur7e3toaGh0dHRoKCgmJiYlJSUnZ2doaGhhoaGmJiYjo6OkJCQjY2NnJycj4+Pk5OTk5OTi4uLioqKj4+Po6OjlpaWh4eHkpKSjIyMhYWFk5OTh4eHpKSkqqqqlZWVg4ODh4eHiYmJrq6ufn5+oKCgi4uLi4uLgICAjY2Nn5+fjY2NlJSUiYmJq6urrKys6urqgoKCsrKynJycoKCgoKCgpqamj4+PvLy8m5ubwsLClJSUl5eXlZWVjo6OkZGRs7Oznp6e4eHhi4uL6OjosbGxoaGhdHR0mJiYoqKipaWlsrKymZmZ5eXlgICAf39/f39/enp6goKCcnJygYGBeHh4enp6iYmJlpaWgYGBi4uLlJSUfn5+h4eHg4ODj4+PkpKSfn5+hYWFhYWFiYmJhISEgICAi4uLg4ODg4ODhYWFmpqao6Ojl5eXnp6elpaWgYGBg4ODhoaGh4eHkZGRjo6OjY2NjIyMhISEj4+Penp6b29vnp6eaWlpgICAXFxcfHx8dXV1c3Nz3t7e////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////nJycjY2Nqampn5+fo6OjmZmZrq6upKSko6Ojurq6sbGxo6Ojrq6usLCws7OznJycmpqanZ2doKCglZWVlJSUl5eXmJiYqKiol5eXnp6ekJCQk5OTl5eXjY2Nh4eHjo6OjY2NgoKCkpKSgYGBioqKiYmJkJCQhISElJSUmpqahISEhISEo6OjfHx8j4+PhYWFkJCQjo6Oh4eHkZGRkpKSj4+Po6OjgICA8/PzoKCgk5OTo6OjqamptbW1+Pj4nZ2dnp6ez8/PsrKyioqKlJSUn5+foKCglpaWmJiYkpKSnZ2dnp6eoaGhZmZmSkpKj4+PXl5eqampmpqal5eXoKCgnZ2dqKiokpKSf39/gICAfX19f39/d3d3eXl5iIiIfHx8eHh4c3NzioqKkZGRk5OTfHx8e3t7i4uLiIiIi4uLiIiIhISEjY2NlpaWfHx8zs7OwcHBm5ubgoKCkpKSmpqanZ2dh4eHzMzMra2tp6eno6Ojf39/e3t7c3Nze3t7enp6enp6cnJygoKCcHBwkpKSgoKCh4eHbGxshoaGhISEbm5ueXl5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1tbWsLCwm5uboaGhmJiYnJycnZ2dnp6eoqKiqKiosbGxrKysqqqqtLS0goKCrq6unJyckZGRpKSkra2tx8fHubm5l5eXlZWVjo6Ovb29l5eXkpKSkJCQmZmZlJSUjY2Nk5OTkJCQiYmJkZGRm5ubjo6Oi4uLmpqakZGRoKCghYWFjY2NlJSUjY2NjIyMhYWFiIiIoaGhjY2Njo6OkJCQjY2Njo6OiIiIj4+Pn5+fmZmZnJycmZmZnp6ei4uLnZ2dn5+f3d3d0tLSrKysr6+vmZmZoqKim5ubhISEh4eHb29vu7u7jIyMkpKSdnZ2h4eHlZWVsLCwj4+Ph4eHkpKSl5eXk5OTkpKStbW1hYWFhoaGe3t7gYGBi4uLgYGBiIiIhoaGiIiIdnZ2hYWFjIyMhYWFkZGRgoKCj4+PeXl5iYmJgoKCgYGBgYGBhoaGuLi4nJychoaGhoaGs7OzgoKCfn5+g4ODdnZ2jY2NioqKhoaGcnJylpaWioqKd3d3gYGBioqKkZGRhoaGcnJyiYmJj4+PeXl5jIyMe3t7h4eHfHx8d3d3fHx8////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zc3NoKCgjo6Oi4uLo6Ojn5+fpaWlkpKSpKSkn5+frKyspaWloqKirq6uoaGhm5ubtLS0lpaWn5+furq6t7e3srKy6urqubm5paWllpaWoaGhp6enjo6OmJiYq6urlJSUjIyMfHx8d3d3ZmZmlJSUmZmZi4uLkZGRl5eXm5ubm5ubnp6eoaGhn5+fjo6OlZWVk5OTl5eXj4+Pnp6eioqKioqKmZmZmpqajo6OlZWVlZWVi4uLkZGRm5ublJSUpaWljo6Oqampzc3NsrKyvr6+iIiImZmZl5eXjIyMWFhYLy8vCAgIS0tLgYGBpqamfn5+kpKSlZWVj4+PoqKipKSkkpKSpKSkoqKiioqKfn5+iYmJh4eHhISEg4ODfn5+eHh4jIyMj4+Pm5ubgoKCjo6OgYGBgICAgICAgYGBhoaGioqKj4+Px8fHenp6gICAh4eHgICAkpKSe3t7goKCeHh4f39/f39/ioqKh4eHoqKiwsLCiIiIbm5ujIyMhISEe3t7enp6f39/hYWFioqKd3d3ZGRkf39/fHx8eHh4fn5+ioqKgICAeXl5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+vr6rKysqKiovLy8iIiIkpKSfX19lJSUnJyclZWVmpqaoKCgra2tm5ubpaWl09PTkpKSxMTE1tbWrq6uysrKq6urrKysmJiYoaGhsrKynZ2doKCgoaGhpKSklZWVjIyMu7u7l5eXhISEcnJypKSkjo6Oj4+Pvb293NzclZWVm5ubjIyMnJyci4uLgoKClJSUiIiIjIyMj4+Pi4uLm5ubioqKiIiIrKysoqKirq6uqKiopaWllZWVm5ubjIyMpKSkpKSkt7e3kpKStbW1jY2NoaGhnJyciIiIi4uLampqDAwMf39/e3t7fn5+VlZWgYGBiYmJn5+fhoaGnp6ejIyMqKiolZWV/Pz8qampl5eXgoKCgYGBf39/j4+Pf39/gYGBenp6gICAmJiYhISEbW1tiYmJj4+PhYWFenp6i4uLkJCQgICAhYWFj4+Pe3t7kZGRj4+Ph4eHgYGBdnZ2hoaGg4ODgoKCjIyMl5eXdXV1fX19fX19hYWFenp6f39/iYmJm5ubkZGRZ2dng4ODeXl5fHx8dXV1lZWVcHBwcXFxeHh4hYWFkJCQvb29////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4ODgz8/Pvb294ODgqampqqqqv7+/nZ2dnZ2dmJiYh4eHoKCglJSUl5eXzs7O/f39+/v7t7e3t7e39PT0lpaWw8PDs7Oz2dnZtLS0wMDAmJiYk5OTnp6em5ubk5OToaGh5ubmjY2NjIyMqKion5+fr6+vjo6OmpqatbW1lpaWp6enlJSUoqKipaWlmZmZ4ODgw8PDu7u7np6evb292NjYioqKkpKSnp6e9PT0ra2tm5ublpaWr6+vqampjo6OnJycmJiYm5ubnJycmpqaoKCgkZGRi4uLg4ODX19faGhog4ODhoaGfHx8g4ODcHBwjo6Oi4uLjIyMj4+Ph4eHiIiIjY2No6OjpKSkioqKjY2NiYmJlZWViYmJbGxscHBwfX19iYmJc3Nzn5+fhYWFiYmJhYWFeHh4cHBwlJSUhYWFioqKjIyMi4uLgYGBjY2Nb29vfX19fn5+hoaGfHx8kJCQg4ODfn5+fn5+eXl5gICAnJycwcHByMjIzMzM1NTUiIiIh4eHlJSUdXV1iYmJeXl5fHx8goKCjY2NcnJybW1tfHx8rKysfn5+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////r6+vtLS0hYWFgoKCoqKiqqqqoaGhlJSU6+vrqamplpaW6Ojo6Ojoubm5cXFx2trao6OjpaWlqKiorq6utra2ra2tzMzMo6OjsrKyo6OjmpqampqaqampkpKSl5eXnJyclJSUlpaWysrKpqamkZGRnp6ep6entra2vr6+nZ2doqKimpqaiYmJpKSkqKio0NDQw8PDmpqaqqqqjY2Nw8PDmJiYlJSUjo6Ok5OTfn5+kpKSkZGRmpqapqampqamj4+PmZmZlpaWn5+fk5OToqKioqKikpKSTExMk5OTg4ODk5OTnJycgYGBfHx8hoaGkJCQk5OTfn5+v7+/f39/ioqKkpKSfHx8lJSUmJiYhYWF/f39e3t7fHx8goKCg4ODmJiYm5ubh4eHgoKCgYGBj4+PiYmJgYGBgICAf39/goKCioqKhYWFfn5+eXl5hYWFh4eHenp6hISEg4ODgoKCgYGBgoKCfX19kpKSfX19fHx8gICAd3d3mZmZgYGBfX19gICAb29vb29vd3d3nJyci4uLhISEmJiYgICAgoKCeHh4gICAcHBw////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////09PT29vbv7+/pKSksLCwqampwcHBsLCwp6enp6enzc3Nn5+fqampoqKimZmZj4+PlJSUnp6erq6uu7u7s7Oz4eHhqqqqycnJurq6o6Ojn5+foqKioKCgqKiora2tk5OTkpKSlZWVj4+Pjo6Oj4+Pjo6OkJCQn5+fmpqaoKCgmJiYmZmZjo6Oq6urjY2NhISEb29vlpaWmZmZnJyckpKSmJiYjY2NnZ2dj4+PkZGRoqKii4uLl5eXjIyMoKCglZWVn5+fl5eXra2tjY2NgICAX19frKysioqKkZGRk5OTiYmJoKCgkZGRh4eHkpKSmpqalJSUi4uLkZGRfn5+lJSUlZWViIiIiYmJkpKShISEkJCQmpqadnZ2f39/hoaGjIyMfX19hISEioqKfn5+fHx8h4eHeXl5fn5+goKCfn5+eHh4kpKSgoKCioqK/v7+h4eHeHh4enp6g4ODfn5+hoaGfn5+k5OThISEjY2NgICAhYWFREREhoaGf39/m5ubiIiIiIiIoaGhq6urmpqaoKCgfHx8hISE0NDQd3d3enp6dHR0gYGBn5+foKCg////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vr6+19fXwcHBq6uro6OjjIyMoqKinJyckZGRoqKijY2No6Ojj4+Pk5OTmpqaqqqqoqKinJycgICAi4uLra2tsbGxoKCgcHBwr6+vlJSUmJiYoKCgnp6ejo6OpaWlkpKSl5eXkpKSmJiYjo6Oh4eHkpKS7+/vurq6kZGRhISEjY2NjY2NjIyMh4eHjo6OeHh4gYGBgYGBnJycf39/kZGRnJyccXFxkpKSjIyMk5OTk5OThISEgICAj4+Pjo6Oj4+PoaGhh4eHqKioiIiIjIyMqKioioqKl5eXiYmJk5OTsbGxjIyMm5ubgICAkJCQ1dXVeXl5jY2NmZmZioqKjo6On5+fjY2NhoaGfn5+kJCQgICAeXl5jY2Nd3d3kZGRg4ODhISEjY2NkZGRhoaGfX19hYWFh4eHgoKCkZGRh4eHhYWFeXl5gYGBioqKfn5+enp6h4eHhISEdHR0eXl5goKCgYGBiYmJjY2Nh4eHiYmJkpKShoaGlJSUhoaGhISEmJiYe3t7o6OjlpaWdHR0d3d3hISEysrKbW1tdHR0bW1tm5ubfn5+eHh48vLy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////sLCwpKSkq6urkpKSmpqapKSksLCwioqKpqamo6OjjY2NqKiolpaWkZGRnJyci4uLpaWloaGhoKCgf39/kZGRkZGRjo6OjIyMsrKyTk5Oi4uL4uLiqKiolJSUnJyclZWVn5+fnJyclpaWiYmJioqKl5eXl5eXjo6Oi4uLhoaGiYmJjo6Of39/kJCQkpKShoaGioqKg4ODjY2NmZmZiYmJj4+Pl5eXkpKSoaGhn5+flpaWjo6Ol5eXeXl5jIyMj4+PkJCQnJyck5OTkJCQoKCgoqKikZGRgYGBb29vg4ODd3d3dnZ2iIiIi4uLioqKg4ODgYGBfHx8dnZ2kJCQdnZ2ioqKg4ODfHx8hISEg4ODjIyMhoaGjY2NfX19i4uLfHx8goKCh4eHiIiIiYmJlJSUiIiIjo6OlZWVj4+PgYGBjIyMgICAgICAhISEfn5+e3t7enp6f39/h4eHhISEhoaGhoaGg4ODhISEdnZ2goKCh4eHjY2NiIiIi4uLfX19f39/hoaGjo6OcnJyqqqqsrKyeHh4goKCfX19eXl5bm5ujIyMhoaGkJCQ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////mZmZm5ubpqamoqKioqKiq6urqKiolJSUjY2NkpKSj4+Pp6enmZmZjIyMoaGhlJSU0tLSgYGBo6Ojo6OjnJycqamp1NTUnp6eqampl5eXdnZ2o6Ojk5OThYWFmpqaoKCgjIyMjIyMgYGBjo6OkZGRjo6OiYmJd3d3hoaGmJiYaWlphYWFgYGBenp6fHx8iIiIj4+PfHx8jIyMgoKCj4+PiYmJgoKCi4uLf39/i4uLmJiYkpKSmZmZmJiYmJiYn5+fp6enlZWVm5ubj4+Pjo6Oi4uLkpKSjY2NeHh4hYWFjo6Oe3t7kZGRkpKSjo6OioqKgICAf39/ioqKhISEhISEgYGBiIiIgICAiYmJlJSUgoKCf39/d3d3e3t7cXFxfn5+eHh4cHBwhoaGiIiIjY2Njo6Od3d3hISEiYmJiIiIhYWFhISEf39/gICAiYmJjY2Nk5OTd3d3enp6d3d3enp6bW1tdnZ2jo6Oe3t7e3t7i4uLf39/fn5+fX19gICAf39/g4ODl5eXh4eHe3t7iIiIgoKCc3NzdnZ2eXl5ZGRkd3d3enp6j4+P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////p6enlpaWoKCgqKiopaWlnJycoKCgm5ublJSUmZmZoKCgpqamj4+PnJycpKSkkJCQf39/m5ublJSUnJyclpaWg4ODkJCQi4uLnp6eqKiompqampqal5eXmpqajo6OkJCQoKCgg4ODlJSUhISElZWVjo6OioqKiYmJjIyMf39/goKCkZGRi4uLfn5+fn5+hYWFmJiYj4+PkZGRkpKSd3d3lJSUjY2NlpaWiYmJjY2Nj4+Pfn5+hYWFjY2NmpqanZ2dhYWFpKSkjo6OkJCQoqKinZ2doaGhoqKikpKSh4eHjIyMhISEnJycjY2NjIyMhoaGkpKSjY2Nh4eHfX19dXV1gYGBj4+PgoKCc3NzhoaGdHR0gICAhISEgoKChYWFe3t7dnZ2eHh4c3Nzi4uLgoKCnJycenp6hISEiIiIe3t7goKCj4+PhoaGfX19jIyMioqKioqKeHh4cHBwhYWFioqKb29vdHR0iIiIhYWFb29vjY2NmZmZgYGBioqKj4+PlJSUo6Oji4uLbW1turq6gYGBf39/eHh4bm5ubW1tZ2dneXl5d3d3eHh4mZmZ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////rKysoKCgkJCQoKCgsLCwl5eXl5eXoKCgmpqanp6eenp6n5+fm5ubmpqalJSUoaGhlpaWjY2NoKCgoKCgnJyckJCQqampjo6OoqKikZGRpKSkk5OTjIyMhISEjIyMj4+PkpKSjo6OnJycl5eXmJiYiIiIo6OjkpKSioqKjo6OiYmJkZGRkpKSlpaWhISEiIiIjY2NgYGBjY2NnJycgICAiYmJjo6OiYmJnJyclJSUmJiYkZGRiIiIiIiIm5ubnJyco6OjfHx8pKSkkpKSdXV1mZmZl5eXoKCgmJiYjIyMmJiYm5ubj4+PkpKSgICAgoKCjo6OlZWVb29vgoKCj4+Pfn5+gICAhISEh4eHiIiIiYmJfX19i4uLdXV1fHx8enp6fHx8cHBwhISEgICAioqKhoaGhISEj4+PhYWFiIiIgoKChYWFi4uLh4eHc3NzgoKClpaWiIiIg4ODfHx8gYGBfX19g4ODmJiYiIiIhYWFioqKfHx8fn5+gICAjY2NhISEe3t7mZmZg4ODdnZ2tLS0fX19fn5+lZWVe3t7bGxsfHx8dnZ2kZGR////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////pKSkmpqanp6eoKCgnp6ejo6OmpqaysrKkpKSpKSkpaWl6enpdHR0j4+PoqKip6enm5ubqamps7Ozj4+Pf39/iIiIlJSUlZWVg4ODlpaWlpaWhYWFhISElpaWjY2NjIyMmJiYk5OTjIyMpaWlm5ubjIyMjY2NkJCQk5OTioqKhYWFhISElZWVlJSUjo6Oj4+Pj4+Pj4+Pg4ODkZGRgoKCk5OTmpqahoaGh4eHhISEgYGBg4ODj4+Pl5eXmZmZlZWVhYWFhISEl5eXlZWVlJSUkpKSjIyMmJiYk5OTlZWVfHx8dHR0m5ubhYWFg4ODiYmJfX19gYGBg4ODjo6OeXl5jY2NhoaGiYmJhYWFg4ODdHR0hoaGj4+Pra2thISEfHx8gICAd3d3jY2Ni4uLhYWFd3d3hoaGjo6OfHx8kJCQf39/kJCQd3d3fHx8goKCfn5+lpaWfHx8eHh4f39/fHx8eHh4ioqKhoaGhYWFeHh4dXV1hYWFhYWFfX19jo6OiYmJhoaGfHx8eHh4goKCdHR0dXV1c3NzcnJygoKCfHx8fn5+f39/kpKS////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////29vbr6+voqKip6eno6OjmpqakZGRlpaWmpqaoKCgqKiok5OTl5eXb29vbGxsnp6enZ2dgoKCoKCgoKCgj4+PoqKim5ubkpKSi4uLlZWVjIyMk5OTnZ2diIiIj4+PmpqapaWllJSUiIiIlpaWj4+Po6OjoaGhnZ2dkZGRnp6eiIiIeHh4h4eHhISEkJCQgoKCkpKSi4uLhISEk5OTkpKSnJyckpKSlpaWi4uLjo6OkJCQi4uLiYmJjo6Oe3t7mpqajo6Ompqap6enjIyMhoaGlJSUgoKCgYGBioqKlpaWgYGBlJSUhYWFj4+PkZGRkpKSlpaWgYGBiYmJe3t7v7+/oaGhlZWVj4+Pd3d3gYGBgICAhISEkpKShISEsrKykpKSd3d3ioqKbGxsioqKlZWVdXV1k5OThoaGmpqak5OTlJSUhoaGhoaGf39/fn5+d3d3gICAfHx8hYWFi4uLhoaGenp6hoaGf39/dHR0e3t7hISEh4eHdnZ2fHx8hoaGdnZ2gYGBenp6hYWFxsbGf39/iIiItra2fX19iIiIdHR0f39/gICAc3Nzd3d3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////qqqqoqKiqampnp6eiYmJp6enk5OTn5+fpaWlkZGRoaGhlJSUiYmJk5OTnZ2dkZGRra2tlpaWnZ2dlpaWjY2Nnp6enZ2dkZGRmJiYn5+flpaWkJCQlpaWe3t7iIiInJycoaGhmpqao6Ojk5OTl5eXk5OTnp6en5+flpaWk5OTkpKSmJiYlJSUmJiYi4uLh4eHmZmZp6enlpaWg4ODjY2Nh4eHp6ennJycioqKXFxckZGRgoKCk5OTkZGRfn5+jY2Nk5OTmpqaiIiIkJCQpaWlioqKjo6OgICAjIyMj4+Pk5OTl5eXlJSUh4eHd3d3hISEkJCQgICAd3d3fHx8jo6OrKysgICAhISEeXl5gICAfHx8j4+PkZGRqKiomZmZk5OTjIyMXl5ehISEhISEjo6Oj4+PioqKi4uLgoKCh4eHkJCQhoaGioqKgICAhYWFfX19g4ODdnZ2jY2Nenp6fn5+hoaGjo6OgYGBdnZ2fn5+nJycfHx8gICAf39/jY2NiYmJcHBweHh4ZGRkhYWFe3t7hISEfn5+kZGRlJSUfHx8cXFxfHx8ZmZmg4OD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////qKiolZWVmZmZjo6Oqampp6ennJycoKCgn5+fo6OjnJyckZGRiYmJioqKm5ubm5ublJSUioqKo6OjkpKSo6Ojnp6el5eXkZGRi4uLnJyckZGRkJCQjIyMpqamlJSU39/f5+fnpKSkj4+Pjo6On5+fkpKSl5eXhISEp6eng4ODgoKCk5OTlpaWi4uLoaGhlJSUnJycmZmZm5uboqKilJSUk5OTlJSUoaGhkpKSjo6OnZ2dlZWVjY2Nk5OTk5OTjo6OmZmZnp6elJSUjY2NkJCQi4uLm5ublZWVi4uLi4uLlJSUg4ODiIiIcnJyioqKhoaGgoKCgYGBgICAgoKCkJCQhISEenp6goKCdXV1fn5+goKCc3NzfHx8goKCgYGBe3t7s7Ozh4eHZWVlk5OTh4eHfX19oKCgjY2NhISEf39/lJSUmZmZeXl5gICAkJCQi4uLd3d3fX19j4+PfX19b29vdnZ2hYWFeXl5enp6cHBwj4+Pc3NzaGholZWVh4eHfHx8enp6c3Nzqampu7u7jIyMeHh4d3d3gYGBhoaGbm5ujIyMiYmJfX19////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////rq6urq6ura2tqampsLCwpKSkoqKinZ2dq6uroqKioKCgm5ubm5ubkJCQmpqanp6elZWVpaWlm5ubk5OTlZWVn5+fkJCQnp6emJiYkJCQlpaWk5OTjIyMlZWVoaGhmpqal5eXmZmZlpaWkZGRj4+PmZmZjo6OmJiYkpKSjIyMg4ODhoaGgoKCjo6OeXl5mZmZjY2NkJCQo6OjlZWVoKCgmZmZkJCQnZ2dhYWFk5OTkJCQkpKSk5OTkZGRjo6OiYmJpKSkmJiYlJSUmpqaiIiIjIyMioqKmJiYlJSUh4eHiYmJjIyMgICAeHh4ZmZmgoKCiYmJjY2NhoaGhYWFiIiIioqKgoKCgYGBenp6hYWFgICAhYWFgYGBj4+PgYGBi4uLg4ODgICAfn5+i4uLgYGBjo6OdnZ2h4eHhoaGk5OTnZ2dj4+Pg4ODhoaGgoKCeXl5kpKSZ2dnkpKShYWFfHx8cXFxiYmJc3Nzg4ODdnZ2fHx8goKCg4ODhYWFf39/jIyMfX19eXl5jY2NeHh4e3t7fn5+gYGBeXl5ioqKi4uLjIyMd3d3a2tr////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7u7oqKiq6urrKysq6urq6urqamprKysoKCgoaGho6Ojm5ubmZmZmpqamZmZmZmZlJSUx8fHpKSkn5+fiIiIlZWVioqKo6OjkZGRnJycnJycn5+fkZGRpqammZmZlpaWmJiYkZGRmZmZkJCQn5+fjIyMioqKlZWVm5ubkJCQioqKenp6l5eXjo6OiYmJioqKj4+PoqKijo6OlpaWnZ2dlJSUkpKSmJiYkpKSmZmZlJSUh4eHm5ubj4+PioqKioqKjo6OlZWVlZWVoKCgkZGRm5ubiYmJjY2Nl5eXj4+PkJCQdHR0kpKSpKSkg4ODeXl5e3t7jY2NeXl5g4ODg4ODhoaGeXl5jIyMg4ODfHx8e3t7goKCfHx8hISEf39/ampqZWVleHh4kpKSfHx8fX19e3t7eXl5e3t7j4+PmpqaiIiIlJSUm5ubdnZ2g4ODenp6hYWFbW1tgICAdXV1e3t7iIiIgoKCd3d3eXl5c3Nzg4ODfX19enp6fX19f39/f39/iYmJgoKChYWFf39/enp6eXl5iYmJkpKSkpKShISEhISEdHR0dXV1bW1t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////pqamq6urr6+vra2trKyss7Ozr6+vpaWlnJyco6Ojmpqao6Ojm5ubpKSkhoaGn5+fmZmZkJCQmJiYpKSko6OjoKCgkpKSjIyMf39/i4uLmJiYnJycoqKipKSkmpqalpaWl5eXn5+fpaWlkZGRlpaWl5eXmpqampqan5+flpaWk5OTkJCQjY2Ni4uLkpKSeXl5kJCQnZ2dgoKCmZmZiIiIl5eXm5ublpaWo6OjmpqaioqKiYmJj4+PeHh4jY2Nm5ubhoaGfHx8s7OzoKCgnJyci4uLoKCgioqKmpqakJCQZWVlhYWFiYmJgICAjY2NpqamlJSUh4eHj4+PgICAkpKSi4uLhYWFdHR0e3t7fX19fX19jo6OcXFxkpKSh4eHhoaGdHR0j4+PjIyMiYmJiYmJhYWFhoaGhoaGd3d3gYGBgoKCr6+vfHx8b29vbGxsjY2NbW1tdHR0jo6OgoKCgICAd3d3hoaGgICAkZGRbW1tgoKCdnZ2kZGRiYmJi4uLhYWFf39/iIiIkJCQgICAgoKCm5ub0tLSjo6OhYWFb29vbm5ucnJyd3d3jo6O////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////n5+fnp6era2toaGhqKiopqampqamoKCgoKCgvr6+oqKiqKiolJSUmpqaoKCgmJiYmZmZoaGhpKSkoqKiqampo6OjlpaWjo6Ojo6OjY2NioqKhYWFjIyMh4eHkpKSjo6OlZWVmpqak5OTiIiIiYmJioqKlJSUg4ODnZ2dfn5+nZ2dioqKk5OTkpKSfn5+jo6OkJCQl5eXiYmJm5ubjY2NmZmZmJiYmJiYjIyMi4uLnZ2djo6Oh4eHZ2dnkpKSkJCQi4uLjY2Nk5OTlpaWg4ODjY2NjY2NgICAc3NzhoaGkpKSiIiIe3t7i4uLiIiIl5eXjo6OkZGRiYmJjo6Oenp6gYGBi4uLjo6OdnZ2fHx8ZmZmhYWFiYmJjY2NdHR0hISEc3NzJCQkgYGBgICAgoKCfn5+mZmZlJSUjIyMhoaGh4eHfn5+dnZ2bW1tg4ODeXl5dnZ2fX19dnZ2cnJyfX19hoaGiIiIf39/fHx8eHh4gICAj4+Pmpqafn5+gYGBi4uLiIiIfHx8iIiIj4+Pj4+PhoaGaGhob29vjY2NgYGBYWFhhISEeHh4////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////sbGxhISEoKCgpKSko6OjmpqamZmZn5+flZWVmJiYoaGhmpqamZmZq6uroaGho6OjpaWlmJiYmZmZq6urnp6evr6+k5OTn5+fmJiYnJycpKSkioqKmpqamZmZra2tqqqqjo6Ojo6OlJSUenp6lpaWhoaGfn5+kJCQjY2NlZWVm5ubh4eHkZGRmJiYlZWVnZ2dmJiYm5ubjIyMh4eHoKCgjo6OjIyMiYmJkZGRjIyMk5OTkZGRjY2NkpKSPDw8urq6tLS0jIyMlpaWmZmZmpqalpaWhYWFh4eHjIyMhYWFhYWFhISEd3d3nZ2dgYGBjY2Nenp6ioqKhoaGgoKChoaGj4+PkpKSjo6OkpKSfX19dnZ2kJCQdnZ2e3t7gYGBkJCQioqKc3NzNjY2OTk5hoaGf39/kJCQeHh4fn5+dHR0gYGBkZGRlJSUe3t7jo6Og4ODcXFxcHBwfn5+iYmJdnZ2hISEkZGRe3t7bW1tgYGBenp6fX19enp6ZGRkdXV1dXV1BgYGAgICAAAAFBQUU1NThYWFhISEioqKd3d3f39/gICAa2trf39/gICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j4+Pnp6epKSkkpKSpKSkl5eXnJycmpqak5OToqKih4eHlpaWjo6Om5uboaGhpaWloaGhqampoaGhpqamp6enp6enoKCgnp6empqalpaWn5+fjY2NnZ2dr6+vr6+v2trasrKymJiYh4eHk5OTj4+Pnp6ehYWFh4eHlZWVnJyck5OTlpaWnp6ejY2Njo6OdXV1lZWVhYWFkZGRl5eXkJCQkJCQlpaWh4eHf39/n5+fk5OTjY2NhoaGkJCQj4+PYmJicnJyVVVVgoKCkJCQfX19ioqKlpaWl5eXlJSUMjIyeHh4hYWFg4ODf39/jIyMgoKCfHx8ioqKi4uLi4uLkZGRgICAjo6OlJSUjo6OfX19dnZ2g4ODiIiIgoKCiYmJh4eHf39/cXFxZWVlCQkJOzs7c3Nzl5eXkpKSioqKgICAe3t7hYWFeXl5f39/mpqaeXl5d3d3gICAgYGBenp6ZWVlAwMDNDQ0AAAAAAAAKCgoGxsbKioqVFRUUVFRc3NzcnJyeXl5f39/eXl5eXl5cXFxbGxsk5OTe3t7fHx8f39/bW1tg4ODd3d3gICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////lpaWlpaWoqKipqamlpaWk5OTpKSkjY2Njo6OlpaWkJCQnJyco6OjlJSUnZ2dlJSUl5eXnp6eo6OjkJCQnJyckJCQj4+Pl5eXo6OjnJyclZWVqampk5OTmZmZkZGRk5OToKCgj4+Pj4+Pfn5+mpqapqamkZGRhoaGhYWFkpKSmZmZlpaWmpqamJiYlJSUqampnJycp6enlpaWgYGBmZmZl5eXiIiIj4+PnJycmpqakJCQjo6OjIyMioqKk5OThISEiYmJiYmJfHx8f39/i4uLnJycfX19kpKSv7+/dHR0g4ODlZWVhoaGmZmZhoaGgICAeXl5iYmJgYGBi4uLh4eHfn5+dHR0cHBwh4eHcXFxjo6Oc3NzfHx8goKCioqKdXV1goKCh4eHh4eHaWlpAAAAS0tLfHx8fHx8fX19hYWFfX19fHx8hoaGcXFxdHR0d3d3b29vg4ODLi4uKysrGRkZe3t7ZmZmgYGBd3d3gYGBcXFxR0dHcnJydHR0h4eHe3t7bm5uc3NzeXl5bm5udXV1c3NzdXV1fX19np6eeHh4bGxsg4ODenp6j4+P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9PT0pKSkpKSkmJiYj4+Pmpqaj4+Pnp6ekJCQnp6em5ubmpqanZ2dmZmZl5eXnZ2dhISEjIyMkZGRmJiYlpaWi4uLioqKkZGRlZWVlJSUrKysk5OTkJCQm5ublJSUoKCglJSUjY2Njo6OioqKkZGRkpKSnZ2dfHx8eHh4ioqKkJCQkZGRoKCgtLS0uLi4ra2tqqqqmJiYpqamgICApKSkioqKfX19lZWVhYWFh4eHl5eXj4+Pj4+PiYmJiYmJhYWFk5OThYWFhoaGkZGRgYGBjIyMkZGRl5eXnp6elpaWhYWFmpqaiIiIlZWVgoKClJSUjo6OioqKjY2NioqKfn5+h4eHk5OTj4+Pg4ODgoKClJSUc3NzVVVVampqPDw8gICAiYmJZmZmkZGRYmJiNjY2BwcHPDw8DQ0Ng4ODdnZ2dXV1goKCe3t7cHBwUlJSCQkJjo6OiIiIh4eHfn5+dXV1enp6eXl5gICAf39/cHBwenp6eHh4eHh4dXV1eXl5bm5uc3NzdXV1cnJyYmJia2trdHR0c3NzcXFxeHh4eXl5cXFxiYmJe3t7i4uL////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////n5+fnJycqampo6OjlJSUn5+fo6Ojnp6eoaGhnJyclZWVlJSUq6uriYmJkpKSqKiojo6OmZmZmZmZl5eXlZWVlZWVbGxsm5ubk5OTlpaWnJyck5OTkpKSnJycoaGhioqKlpaWg4ODl5eXh4eHjY2NgoKCf39/jY2NlpaWkZGRfX19mZmZk5OTlZWVvr6+kZGRwcHBtbW1lJSUoaGhnJycjY2NoKCgo6OjoqKih4eHhISEeXl5lpaWhoaGk5OTh4eHg4ODhISEjIyMjo6Od3d3h4eHfX19jY2NlpaWmpqagICAkpKSkJCQkZGRc3NzhISEiIiIhoaGgoKCiYmJfX19i4uLaGhojIyMgYGBmpqajIyMhoaGdXV1ZmZmgYGBHR0dioqKSUlJAgICAwMDOzs7GBgYLi4udHR0dHR0hoaGh4eHjIyMjY2NbGxsg4ODg4ODenp6g4ODc3NzgYGBlpaWd3d3cXFxcXFxbW1tf39/f39/e3t7d3d3dnZ2c3Nzc3Nzd3d3h4eHaGhoa2trampqc3NzioqKbm5uc3NziIiId3d3e3t7gYGBd3d3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////p6enqKiorKysr6+vsrKyq6urhoaGn5+flpaWlpaWmJiYnZ2dmJiYioqKn5+fmZmZlZWVo6OjlZWVgoKCnJyclZWVoqKimpqaj4+PycnJioqKpKSkhoaGgoKCk5OTgoKClZWVhoaGmpqahISElZWVjo6OoaGhh4eHi4uLg4ODl5eXlZWVlpaWlpaWnJycnp6esrKyubm5mZmZkJCQlJSUhoaGl5eXmJiYiYmJjIyMgICAiYmJiYmJh4eHgoKCmZmZjo6OgoKCenp6iIiIhISEhISEeXl5j4+PjIyMh4eHoqKikJCQnZ2dfX19fHx8gICAi4uLiYmJjY2NcXFxhISEk5OThoaGdnZ2fX19i4uLe3t7YmJifHx8hISEc3NzhISEaGhoj4+Pf39/MjIyfHx8h4eHjY2NlJSUjIyMfX19fn5+kpKSPz8/h4eHe3t7eXl5e3t7gICAf39/fn5+goKCc3Nzfn5+dnZ2fX19cnJyenp6bm5umJiYeXl5ioqKg4ODcXFxdHR0Y2NjaGhogoKCd3d3enp6eXl5iYmJampqeHh4e3t7dnZ2cnJy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////r6+vra2tqamppaWloaGhubm5q6urnJyclZWVnJyco6Ojm5ubpqamlZWVpKSkdHR0eHh4gICAkJCQgYGBlJSUo6Ojj4+Pl5eXjIyMr6+vl5eXi4uLi4uLlpaWkpKShYWFk5OTsbGxiYmJmpqalZWVkZGRioqKk5OTfn5+jo6OlZWVi4uLjY2Nl5eXm5ubkpKSubm5l5eXhoaGlpaWj4+PlZWVlZWVmpqakZGRgICAl5eXm5ubhISEhYWFk5OTj4+PlpaWfHx8iIiIhYWFfHx8ioqKjY2Nh4eHhoaGgYGBi4uLhYWFlZWVi4uLl5eXfn5+h4eHf39/i4uLhISEgYGBdXV1goKCgYGBhISER0dHU1NTioqKenp6b29ve3t7QUFBfn5+i4uLXFxcjIyMh4eHe3t7dXV1g4ODb29venp6f39/i4uLe3t7hoaGfX19e3t7hoaGdnZ2fn5+gYGBhYWFd3d3cnJyeHh4eXl5cnJydHR0eHh4c3NzdHR0ampqZGRkampqeXl5ampqXV1ddHR0c3NzX19fc3NzbW1ta2trdHR0iIiIbW1turq6////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7Ozra2ts7Ozq6ursrKysLCwoaGhkpKSjo6OnZ2dpaWlpqamoqKiqampk5OTqKiok5OTl5eXi4uLnJyclZWVmJiYnJycj4+Pq6urpKSks7Ozn5+flZWVlJSUkJCQmJiYlJSUl5eXk5OTiIiIlZWVlZWVhoaGioqKhYWFg4ODgoKChoaGfHx8kZGRi4uLlZWVmZmZp6enlpaWjY2NeXl5lZWVf39/lZWVioqKg4ODioqKe3t7f39/jo6Od3d3hYWFi4uLlZWVj4+PiYmJlJSUj4+PkJCQq6urjo6OgoKCkZGRkZGRi4uLgICAgYGBh4eHlZWVhYWFgICAi4uLbW1tgoKCdXV1GxsbioqKcXFxjo6OnZ2dgYGBdHR0f39/bm5ug4ODhoaGk5OT3t7eiYmJe3t7hoaGhoaGhYWFd3d3g4ODg4ODcXFxhoaGjY2Nd3d3enp6h4eHdXV1cXFxe3t7b29vfn5+fX19dnZ2cnJycHBwjY2NcXFxZWVlZGRkaGhoc3NzeXl5cnJye3t7fn5+bGxsiIiIcXFxfn5+g4ODdnZ2d3d3cXFxurq6/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39qKioq6uro6Ojq6uro6Ojrq6urq6urKysn5+foaGhpqamo6OjlpaWpaWlo6Ojnp6ev7+/j4+Pnp6eoKCgmZmZrKysn5+fsLCwtra2s7Ozp6ennJyckZGRiYmJn5+fjo6OjIyMdXV1hISElpaWfHx8hISEhoaGbm5uh4eHg4ODioqKdnZ2kJCQhISEfn5+mZmZnZ2diIiIfn5+ioqKlZWVk5OTiYmJl5eXm5ubjo6Ojo6OnZ2djo6Ok5OTp6ennJycmJiYiIiIiIiIjY2NlJSUk5OTi4uLjY2NiYmJ9PT08vLyioqKfn5+mpqakZGRgYGBe3t7d3d3gICAlJSUKCgoampqREREk5OTi4uLfX19iIiIfX19d3d3d3d3enp6ioqKe3t7j4+PlZWV+/v7nJychYWFkJCQgYGBjY2NfHx8gICAhYWFhYWFenp6e3t7lZWVhISEe3t7g4ODenp6jIyMbW1td3d3bm5ud3d3fX19dnZ2b29veXl5dXV1e3t7fX19iYmJZmZmfHx8d3d3a2trenp6cHBwa2trfX19b29va2trgICAkJCQ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6Ojjo6OsbGxs7Ozurq6wMDAuLi4nJycoKCgo6Ojpqamnp6emZmZmZmZnp6ehISEkJCQnJycnJycqqqqoqKinJycoqKiqampo6Ojp6enkpKSysrKkJCQlJSUjIyMmZmZkZGRhoaGiIiIf39/lZWVhISEg4ODgICAjY2Njo6OjIyMhYWFfn5+h4eHjIyMi4uLnp6eioqKjIyMi4uLiIiIhISEg4ODi4uLkZGRj4+PkZGRmJiYkJCQjIyMf39/mJiYhoaGnp6ehISEgoKCiIiIioqKjY2NnJycl5eX4+Pjq6urkJCQj4+PhYWFjo6Of39/iIiIiYmJdXV1lpaWbGxsc3NzmpqagICAenp6gICAgoKCa2trf39/bm5ue3t7e3t7hYWFjIyMh4eHenp6i4uLi4uLkZGRgYGBcXFxi4uLenp6cXFxf39/jo6Oc3Nzra2tjo6Oe3t7eHh4e3t7fHx8fX19kpKSdXV1hISEf39/eXl5g4ODenp6dHR0fHx8g4ODhoaGgYGBe3t7gYGBlJSUcnJyb29vfn5+cnJyXFxce3t7bGxseXl5d3d3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////pqampKSko6Ojq6urn5+fpaWlnp6elZWVrq6umZmZra2to6Ojqampp6enoKCgk5OTnJycqKioqKiolZWVnp6eqamphoaGqKion5+f0dHRf39/lJSUj4+PmJiYmZmZmJiYkJCQjY2Nmpqag4ODkpKSgoKCeXl5gICAgYGBmJiYfHx8fHx8oaGhjIyMhISEhoaGjIyMlpaWlJSUj4+PdnZ2eHh4h4eHlZWVi4uLmpqak5OTlJSUioqKjY2NmZmZkJCQe3t7hoaGf39/jY2NjY2NfHx8lJSUiYmJrq6umJiYm5ubjIyMkpKSl5eXpaWlh4eHiYmJi4uLd3d3hoaGmZmZjY2Njo6Oe3t7fX19hYWFiIiIgYGBf39/iIiIgoKCfHx8d3d3c3NzmJiYj4+PjIyMgICAe3t7goKCe3t7gICAjIyMcHBwj4+PmZmZfX19fn5+ioqKioqKcnJyfHx8jIyMhoaGcXFxfX19jIyMiIiIc3Nze3t7eXl5cXFxk5OThYWFk5OTZWVlhoaGdXV1f39/gYGBfn5+eXl5cnJyZ2dnaWlpZmZmZ2dn8PDw////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oKCgn5+fr6+vtra2oKCgnZ2dn5+fp6enoqKimJiYoaGhiIiInJycqamprKyspaWlmJiYqqqqsrKyzs7OqampqKiop6entLS0lpaWoqKio6OjoaGhi4uLi4uLl5eXiIiIjo6OmZmZl5eXnJyciYmJgoKCfHx8iYmJk5OTl5eXlZWVm5ubmZmZgICAjIyMiIiIqampk5OTmpqaoKCgfn5+jo6OjY2NiYmJkZGRl5eXjY2NlpaWi4uLlZWVf39/ioqKkZGRkJCQfX19l5eXhoaGj4+Pk5OTjIyMpqamioqKlZWVk5OTgoKCjo6OjY2Ne3t7i4uLhYWFjIyMkpKSgICAlJSUfHx8e3t7gICAf39/f39/f39/fX19goKCeHh4enp6dnZ2g4ODfHx8h4eHg4ODcHBwhoaGeHh4jo6ObW1tgoKCfX19fn5+dXV1c3Nzb29vdXV1e3t7h4eHhYWFg4ODiIiIjo6OgoKCgoKCf39/enp6dHR0g4ODiYmJoKCgjY2NcnJypaWlc3NzcXFxfHx8b29vd3d3dXV1hISEdHR0ZGRkZWVlaGho8fHx////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////qKiom5ubr6+vx8fHsbGxq6urmpqanJycoKCgoqKiqKiooKCgpqamp6eno6Ojqqqqp6enoKCgf39/qKiolpaWn5+fnp6enZ2drKysm5ubp6ennp6empqahYWFn5+fr6+vioqKnJychISEgICAjY2NjY2NkZGRfn5+goKCkpKSg4ODi4uLgYGBjY2NdnZ2eHh4gYGBhYWFoaGhlZWVioqKmpqakpKShoaGk5OTj4+Pjo6Oh4eHh4eHe3t7nZ2dk5OTmZmZkpKSiYmJi4uLlpaWjY2Ni4uLgICAdHR0h4eHlZWVjY2Nk5OToaGhjo6Oc3NzkpKSj4+Pm5ubfn5+i4uLjo6Ojo6OgYGBf39/d3d3dXV1f39/iIiIfHx8f39/hoaGd3d3fn5+bGxsfn5+hoaGhISEjY2NfX19f39/fX19jo6OdHR0hoaGiIiIiIiIhoaGhISEkZGRk5OTiIiIiIiIdXV1g4ODkJCQlZWVfn5+dnZ2fHx8fHx8enp6dXV1eHh4c3NzYWFhg4ODeHh4kpKSc3NzZmZma2trbGxsdnZ2aWlpcHBwc3NzjIyM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////r6+vrKysm5ubpqamubm5pqamqampqqqqiYmJmZmZlpaWqKiopKSkk5OToaGhm5ubnp6eeXl5oaGhpaWlqKiom5ubm5ubjY2Nk5OTnJyclpaWpqampaWlh4eHoqKimJiYoaGhoaGhqamppaWlpqammpqahoaGd3d3kJCQgYGBlZWVkJCQf39/jo6Oi4uLdXV1j4+PkpKSr6+vkpKSm5ube3t7gICAioqKkJCQjY2NfX19lJSUh4eHhISEfn5+kJCQlpaWhoaGkZGRj4+PioqKmZmZjY2NlJSUkpKSiIiIgYGBhISEjIyMgYGBioqKn5+fhISE0tLSh4eHkpKSkJCQlZWVkpKSjIyMgYGBgoKCgYGBh4eHf39/ioqKfHx8fHx8ysrKe3t7jY2NeXl5jo6Oj4+PgYGBgICAf39/gYGBm5ubl5eXhoaGjIyMfn5+dnZ2f39/fHx8jIyMZ2dng4ODfHx8fn5+gICAioqKe3t7h4eHcnJyc3NzhISEb29vcHBweXl5fX19cXFxfX19c3NzeXl5bGxsc3NzgYGBZ2dnYWFhcHBwcXFxd3d3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////k5OTkZGRk5OTlZWVoqKio6Ojq6urrKysjIyMsrKykpKSmZmZra2tpaWlqKionp6eoaGhjIyMoqKimZmZn5+fq6urmpqakZGRmJiYoqKin5+fpqamr6+vqKionZ2djIyMm5ubnZ2diYmJl5eXlZWVo6OjkJCQi4uLk5OTjIyMfHx8dHR0gYGBcHBwgoKCiYmJkpKSi4uLmpqahoaGhISEe3t7iIiIl5eXf39/jY2NgYGBiYmJfX19goKCb29vkZGRjo6Oi4uLlJSUioqKlJSUhYWFhoaGiYmJkZGRjo6OgoKChoaGgYGBgICAgoKClpaWgICAlpaWjIyMiYmJiYmJiIiIg4ODiIiIjIyMiIiIeXl5gYGBiIiIf39/dnZ2fHx8iYmJh4eHl5eXb29vgoKCjo6OgoKCfX19fX19kpKSlpaWcXFxeXl5fn5+goKCgoKCbW1tenp6hoaGgYGBd3d3aGhofX19g4ODdnZ2gYGBeHh4iIiIe3t7cnJyfHx8cHBwampqgICAgICAdHR0ioqKbW1ta2trfHx8ZGRkY2NjYmJiZGRkaWlp////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////29vbm5ublZWVj4+Pk5OTkpKSlJSUlJSUpKSkoaGhpKSkqqqqq6urr6+vqamppaWlrq6unZ2dsrKyrKysr6+vpqamnp6eqKionZ2dpqamkZGRhYWFmZmZk5OTkZGRsrKypqamk5OToaGhgoKCgICAhoaGi4uLd3d3mpqalJSUkZGRgYGBioqKkJCQcnJyg4ODjY2Nm5ubeHh4i4uLi4uLpaWliYmJh4eHkZGReXl5mJiYpKSkk5OTiIiIfX19hoaGkJCQjIyMj4+Pl5eXjo6OfX19kpKSkpKSh4eHhoaGkJCQlZWVc3NzlJSUhISElJSUlpaWi4uLnJycioqKdHR0gYGBg4ODdHR0d3d3kpKSgoKCcXFxcnJyjIyMdXV1gICAbm5ugYGBfn5+k5OTbW1teHh4eXl5d3d3f39/g4ODd3d3kpKShISEgICAhISEenp6gYGBkpKSc3NzdnZ2enp6dnZ2dHR0gICAk5OTfX19Z2dndXV1goKCcXFxjY2Nf39/cHBwdXV1d3d3b29vfX19dXV1hISEcXFxampqfHx8ZmZmbm5ucnJydHR0////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////lpaWubm5n5+fjo6Oj4+Pn5+flJSUr6+vnJyclJSUoKCgsbGxrKysqKioo6OjoKCgm5ubmpqanJycmJiYqKiorq6upKSkoqKirKyso6OjqKiopqampqammJiYlJSUpKSkiYmJqampg4ODjIyMkJCQhYWFgoKCg4ODjIyMk5OTcnJykZGRiYmJa2trhYWFgYGBi4uLhYWFfn5+dnZ2enp6j4+PmpqampqagoKCh4eHb29vk5OTjIyMgoKChISEiIiIgoKCoaGhoqKilZWVmpqafHx8iIiIioqKeHh4hYWFjIyMi4uLhISEjo6OjIyMfHx8eXl5lZWVm5ubg4ODeXl5fn5+jY2NeHh4lpaWdnZ2enp6gICAc3NzgICAkZGRampqX19ff39/iIiIdnZ2fn5+lJSUnJycfX19j4+PmZmZk5OTk5OTjo6Obm5ui4uLdnZ2cnJygoKCm5ubenp6fn5+fn5+eXl5iIiIeXl5iIiIbGxsdHR0jIyMbm5ueXl5h4eHfHx8enp6cHBwdXV1dnZ2ZWVldXV1f39/goKCd3d3bm5ubW1tbm5ufn5+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l5eXnJyco6Oji4uLoKCgnJyckZGRoaGhkpKStbW1oKCgo6OjrKyssbGxqqqqnZ2dqampqKiompqao6Ojl5eXxcXFlpaWnZ2dpaWln5+fmJiYkJCQrq6uiYmJfX19lpaWoqKikZGRm5ubj4+PkZGRfX19h4eHjo6Ol5eXnJyckJCQmpqai4uLhYWFjIyMgICAdXV1aGhocXFxhISEjo6Ofn5+j4+PfX19fn5+hoaGgICAg4ODf39/gYGBiIiIhoaGgoKChISEiIiIkJCQh4eHl5eXiYmJjY2Nj4+Pi4uLj4+Pj4+Pe3t7iYmJmZmZh4eHlJSUgICAgICAh4eHhoaGgYGBgICAh4eHg4ODjo6OhYWFeXl5f39/i4uLf39/eXl5enp6k5OTe3t7iYmJkZGRjIyMj4+PgICAf39/bW1thISEiIiIqqqqlZWVenp6fn5+goKCb29viIiIg4ODbm5udHR0eHh4bW1tdXV1f39/hoaGf39/fHx8fn5+gICAd3d3enp6f39/a2trZmZmgICAfX19fX19goKCZGRkbm5uaGhobGxsaWlpcHBw////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/fk5OTj4+PlpaWm5ubl5eXjo6Of39/nJyciYmJlZWVoKCgnZ2dmJiYrq6upKSkqampp6enmZmZpaWlpKSkqKiopKSkqqqqnZ2doqKimpqahISEh4eHi4uLkpKSenp6hYWFkJCQm5ubmJiYkZGRkpKSnp6elJSUjY2Njo6OmZmZiYmJhYWFkZGRkJCQgoKClJSUfn5+iIiIf39/iIiIbm5uk5OTgYGBg4ODdnZ2goKCf39/iIiIgoKCkJCQn5+fkJCQkpKSgYGBioqKioqKiIiIgoKCkZGRgICAkpKSkZGRjIyMfHx8k5OTi4uLg4ODkZGRhoaGnp6eiIiIbm5ulJSUiIiIf39/f39/jY2NhISEhoaGhoaGiIiIioqKh4eHc3Nzbm5uf39/iIiIj4+PgYGBiYmJgICAd3d3fHx8aWlpg4ODjIyMc3Nzj4+Pfn5+jo6OgoKCeXl5eXl5c3Nzh4eHg4ODc3Nzf39/dnZ2e3t7f39/e3t7cnJyfX19ZmZmb29vbm5ugYGBdHR0a2trbW1tf39/hoaGgYGBfX19dnZ2enp6fX19d3d3iYmJ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////jIyMlZWVj4+Pj4+PlpaWj4+PfX19n5+fl5eXlJSUnJycoKCgo6OjoqKinp6ekpKSpqammZmZoKCgj4+PkZGRmZmZoaGhn5+fiIiImZmZm5ubkpKSoaGhm5ubj4+Pl5eXnJyckJCQpKSkf39/jIyMnZ2dcHBweXl5hISEkZGRk5OTfn5+iYmJlpaWgYGBm5ubn5+fl5eXiYmJeXl5kZGRmJiYj4+PhYWFhISEgICAjY2Ne3t7goKCiIiIi4uLdnZ2iIiIdXV1iYmJhoaGkpKSioqKh4eHiYmJjo6OkZGRmJiYjo6Og4ODh4eHioqKfHx8eXl5cnJyjIyMg4ODjo6OfX19gICAnJycaWlpmZmZhYWFkpKShYWFfHx8enp6fHx8fX19hYWFg4ODfHx8cXFxjY2NhYWFjo6OhYWFkpKSgoKCf39/e3t7gICAkpKSjo6OiYmJhoaGlZWVjo6OcXFxgoKCgYGBeHh4fHx8cXFxnp6ej4+PfHx8ioqKfHx8lJSUd3d3bGxsfn5+e3t7bm5ue3t7dHR0bGxsdnZ2e3t7cXFxeHh4enp6gICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////mpqamJiYoKCgmJiYhISEnJycjY2Nl5eXk5OTlZWVk5OTnp6empqalpaWm5ubkJCQoqKioaGhjY2NnJyckZGRmpqan5+fkJCQoaGhmZmZq6urpKSkn5+fm5ubq6urvr6+kZGRjY2NhISEkJCQiYmJjY2NhoaGiYmJiIiIjo6Of39/nZ2dl5eXmJiYn5+fkZGRmZmZkZGRioqKiYmJjo6OkZGRjo6OdnZ2fn5+kJCQfn5+fX19fX19hISEdXV1g4ODenp6gYGBdXV1jo6OhISEgICAioqKeXl5jo6OlZWVhYWFhoaGiIiIiYmJdnZ2n5+fhYWFgoKChISEfHx8kZGRk5OTh4eHkZGRbm5umJiYm5ubk5OTmZmZi4uLZGRkfHx8d3d3j4+Pk5OTg4ODiIiIiYmJeHh4jY2NkJCQnp6ekJCQfHx8b29vdnZ2j4+Pf39/g4ODkJCQhYWFkpKSioqKioqKiIiIcXFxhoaGd3d3jIyMhYWFiIiImZmZi4uLhoaGhISEfX19g4ODdXV1eHh4YmJie3t7eHh4bm5udXV1cXFxdHR0aWlpfHx8////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z8/PoqKilpaWkJCQjo6Ojo6OiYmJkJCQo6Ojf39/mJiYlZWVjY2NkZGRkJCQjIyMlpaWlpaWl5eXnJyclJSUl5eXurq6fn5+k5OTkpKSm5ubnZ2dsLCwnJycpKSknJycmpqagYGBl5eXlpaWra2tc3NzgICAjY2NioqKT09PdXV1XFxchYWFoqKinJycioqKfX19o6OjgICAh4eHi4uLh4eHi4uLl5eXjIyMiIiIgoKCeHh4j4+Penp6goKCf39/gICAhoaGiIiIe3t7mJiYkpKSkpKSh4eHoKCgfX19gYGBkZGRjo6OmJiYl5eXjo6OhoaGi4uLioqKoqKihoaGf39/gYGBfHx8bGxsd3d3bm5ujY2NmJiYk5OThISEeHh4hoaGhYWFj4+Ph4eHi4uLgICAioqKg4ODgYGBhYWFlpaWjo6OfX19iIiIjo6OioqKjIyMjY2NampqgYGBdnZ2k5OTi4uLgICAf39/d3d3hoaGc3Nzfn5+fn5+dnZ2goKCdHR0fHx8goKCb29vZmZmcHBwenp6hYWFdnZ2aGhodnZ2cXFxaGhob29vZmZm//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + + MatchVariable + + MatchVariable + + 1 + false + + + + UnionDimension + + UnionDimension + + 0 + false + + + + + \ No newline at end of file diff --git a/image_services/opera/raster_function_templates/Sentinel1_RTC_dB.rft.xml b/image_services/opera/raster_function_templates/Sentinel1_RTC_dB.rft.xml new file mode 100644 index 00000000..311d638b --- /dev/null +++ b/image_services/opera/raster_function_templates/Sentinel1_RTC_dB.rft.xml @@ -0,0 +1,115 @@ + + Sentinel-1 RTC dB + Sentinel-1 RTC data in dB scale + + Calculator + Computes 10 times the log10 of the input power values. + UNKNOWN + + + + Rasters + InputNames + Expression + CellsizeType + ExtentType + + + + Rasters + + + + Raster + + + true + + + + __IsRasterArray__ + + false + + + InputNames + + + in + + false + + + Expression + + 10*(Log10( in )) + false + + + CellsizeType + + 2 + false + + + ExtentType + + 1 + false + + + + Converts pixel values from power to dB scale by multiplying the log10 of the power values by 10. + 0 + C:\Users\hjkristenson\Documents\ImageServer\Thumbnails\RTC_dB.PNG + + + + + data:image/bmp;base64,Qk3uNwEAAAAAADYAAAAoAAAAyAAAAIUAAAABABgAAAAAALg3AQAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7u7uLi4sLCwxMTEzs7Ox8fHw8PDr6+vz8/P5OTksbGxrq6u1dXVtLS0tra2ra2trKysrq6usrKyoqKiq6urtra2qKiosLCwsLCwwsLC/f39mJiY3d3d0tLS7+/vysrKy8vL1tbWR0dHTExMTU1NdXV1cXFxYWFhYmJiYmJiW1tbUlJSTk5OUFBQVVVVVFRUWFhYUlJSXl5eWFhYWFhYXFxcW1tbYmJiXl5eZWVlXV1dWlpaZGRkb29vcnJycHBwe3t7eHh4fn5+fX19gICAhISEj4+PiYmJioqKhISEi4uLjo6OiYmJgICAg4ODfX19e3t7goKCe3t7gICAfX19d3d3dHR0eHh4ampqcXFxcnJyd3d3cXFxcnJybW1tc3NzeXl5c3NzdXV1fX19eHh4fX19cHBweHh4enp6eHh4cHBwYWFha2trYWFhZWVlYmJiW1tbYmJiYWFhU1NTVlZWVlZWR0dHTU1NWlpaWFhYVlZWU1NTWFhYUFBQW1tbT09PREREPT09QEBAOTk5RUVFRERERUVFPDw8T09P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6urqtbW1r6+vpqamp6enpaWls7OzxcXFs7OzrKysvb29wMDApKSkubm5tra2tbW1pKSkrq6uzMzMrKysvr6+tLS0s7Ozr6+vvr6+u7u73Nzc////l5eX5OTk0NDQwMDAwMDAwcHBubm5xcXFPDw8S0tLSEhIZ2dnaWlpZGRkYGBgXV1dXV1dUFBQU1NTTU1NUFBQUFBQWlpaT09PU1NTX19fWFhYTk5OV1dXYGBgaWlpZWVlWlpaYGBgZGRkZ2dncnJydXV1d3d3eHh4eHh4eHh4goKCg4ODh4eHhYWFh4eHioqKf39/ioqKhISEe3t7enp6fX19f39/e3t7enp6dHR0bGxsc3Nzd3d3dnZ2dHR0cHBwcnJybm5uampqcHBwcHBwbm5ugICAf39/cHBwb29vd3d3dnZ2d3d3cnJybGxsY2NjaWlpZWVlZWVlZGRkY2NjW1tbYGBgVlZWVFRUWFhYTExMTU1NVFRUXFxcUlJSYWFhWlpaYWFhUlJSWVlZTExMUlJSQEBASEhIVFRUQEBARkZGPT09QUFBVFRU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0tLS1NTUqKiot7e3sbGxyMjIu7u7u7u7rq6ux8fHr6+v5eXlvLy8u7u7vr6+vr6+xcXFuLi4w8PDu7u7zMzMt7e31NTUw8PDu7u7qqqq4+Pj+Pj4dXV1xMTE7e3tx8fHv7+/w8PDysrKw8PDvLy8j4+PPj4+Pz8/Xl5eXV1dUVFRWlpaVVVVVVVVT09PUFBQR0dHQEBAV1dXVVVVTk5OT09PWFhYVlZWWVlZVFRUVlZWWVlZZWVlYWFhXl5eZmZmbm5ucXFxcnJye3t7f39/d3d3b29ve3t7e3t7i4uLeHh4enp6enp6fHx8fX19d3d3fX19e3t7eXl5eHh4dnZ2fX19d3d3eHh4dXV1dHR0cXFxdnZ2c3Nzb29vb29vdHR0bm5udnZ2bGxsdHR0ZGRkcXFxdHR0bW1tcnJydHR0c3NzaWlpZWVlZGRkY2NjYWFhY2NjV1dXZmZmXFxcVlZWS0tLVVVVT09PWFhYVFRUXV1dWVlZW1tbW1tbYmJiW1tbWVlZSkpKPDw8T09PNTU1SkpKTU1NQUFBPDw8////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xMTE0NDQwcHBw8PD3t7eurq6ubm5uLi4ubm52trar6+vx8fHr6+vuLi4u7u7ubm5pKSksbGxtra2yMjIp6ensbGxtbW1tLS0uLi4////7e3tz8/Pt7e33t7e3d3dvb29r6+vxMTEzMzMurq6xsbG////29vbMjIyWFhYXl5eVlZWPz8/UlJST09PRkZGSUlJSEhIOTk5SkpKUVFRR0dHUVFRUVFRWFhYYWFhUlJST09PUlJSZWVlZmZmWVlZY2NjbW1tcHBwcnJyd3d3fX19dHR0dnZ2cXFxb29venp6goKCb29vdHR0cnJydXV1fHx8e3t7dXV1dHR0cnJyfHx8c3NzcHBwdXV1d3d3bm5ud3d3d3d3dHR0d3d3dHR0b29vc3NzcHBwbGxsb29vcHBwbW1tdHR0dnZ2aWlpbGxscnJya2trYGBgY2NjWlpaYmJiUVFRXV1dVlZWUVFRU1NTVFRUXFxcSkpKWFhYS0tLSkpKVlZWSkpKVFRUV1dXTExMT09PWFhYT09PUVFRRERETExMPz8/Pj4+QUFB////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19fXvLy8wcHBysrKwsLCtbW1wcHBvr6+6enppqamt7e3vLy8xcXFwMDA09PTqqqqwsLCu7u7wMDAu7u7tbW1ysrKtra24eHh4eHh4eHh7u7ux8fHt7e3ubm5////9PT0z8/PwsLCx8fH2tra1NTU2tra////5OTk1tbWnJycNjY2S0tLT09PQEBARUVFRkZGRkZGQ0NDR0dHR0dHQkJCRkZGQ0NDUFBQVVVVVVVVUVFRU1NTWFhYTExMX19fXV1daWlpampqaGhoaWlpbW1tcnJycXFxcXFxb29vcHBwbGxscHBwdXV1dHR0dHR0ZmZmbGxsbW1tc3NzeXl5dHR0dHR0dnZ2d3d3eHh4c3NzcnJyampqbW1taGhocHBwbm5ucXFxa2trbW1tc3NzcHBwbW1tYmJiYmJia2trZGRkcHBwXl5eZmZmaGhobW1tYmJiVlZWYmJiWVlZWFhYUVFRT09PTU1NXl5eVVVVVFRUUlJST09PUVFRTExMSUlJUFBQU1NTSkpKT09PVlZWUFBQUVFRTExMQUFBS0tLf39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tra20dHRuLi4u7u72trasrKytbW1vr6+vb29u7u7w8PD3NzcxsbGw8PDoqKisLCwxsbGqampubm5wcHBrq6u4ODg19fXr6+vqamp5ubm2dnZtbW1ra2tr6+vx8fHurq6xMTE6enpm5ubsrKyvr6+z8/P8PDwsbGxxsbGxsbGx8fHMDAwPDw8QEBAMDAwS0tLR0dHQkJCUlJSQkJCQEBAODg4RUVFR0dHR0dHWFhYT09PTExMV1dXWFhYTk5OWFhYZWVlZ2dnampqbW1tcHBwb29vbm5ua2trZGRkaGhob29vb29vcXFxeXl5b29vcHBwbm5uZWVldXV1cXFxc3NzdXV1ampqbm5uY2NjampqZmZmZGRkZGRkYmJiXV1dbW1tdnZ2Y2Nja2tra2trZmZma2trYmJiW1tbYmJiXl5eZmZmYmJiXl5eZGRkZGRkYGBgWlpaWFhYXV1dXl5eVlZWT09PVFRUQEBAUFBQUFBQUlJSSEhIUVFRU1NTUlJSVlZWVVVVSkpKW1tbVVVVTU1NRERETU1NRUVFNzc3np6e////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8fHxcXFvr6+srKyt7e3xcXFvr6+qKiowMDAt7e3vb290tLSt7e32trauLi4wMDAuLi40NDQt7e3sLCwq6urw8PDqKioyMjI6+vr1dXVu7u7tra2u7u7s7OzvLy8wcHB8/Pz/f39w8PDqamppKSkv7+/tLS0xcXFvb29vr6+rKysurq6z8/PTU1NMTExKysrLi4uNTU1RkZGVFRUPT09Ozs7PDw8Pj4+MTExR0dHUVFRSUlJSUlJS0tLU1NTTU1NSUlJXl5eW1tbYmJiaWlpYmJiY2NjYmJiZ2dnaWlpcnJycHBwbGxsc3Nzenp6a2trampqc3NzaWlpbm5uampqaWlpaGhoZ2dnZ2dnXV1dXl5eaGhoXV1dY2NjY2NjY2NjbGxsaWlpaWlpZGRkbW1tbm5uWlpaaWlpa2trY2NjXl5eVlZWT09PV1dXbm5uT09PWVlZYmJiYmJiVlZWXV1dW1tbWVlZVlZWVVVVTU1NWFhYREREQ0NDVVVVVFRUVlZWQkJCQ0NDTk5OU1NTUVFRTExMQ0NDSUlJTk5O////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wMDAycnJq6urvb29wcHBxcXFvr6+wsLCu7u7ysrKvr6+t7e3yMjIwcHBwcHBtra2wcHBuLi4srKytbW17Ozsv7+/rq6u4ODgtra2vb29wcHBs7Ozurq6srKysbGxvb293Nzc4eHhwsLCsLCwxsbGtbW1tbW1z8/PuLi4tLS0sLCwqampqKio1dXVtLS0KioqKysrKCgoIiIiPDw8Pj4+Pz8/NjY2MzMzMDAwLCwsOzs7RkZGPz8/QEBARERETU1NR0dHSUlJVVVVXV1dYGBgXFxcX19fYmJiW1tbW1tbVlZWaWlpcXFxeXl5fn5+dnZ2aWlpampqbm5ubm5uaGhoZmZmYGBgYWFhZGRkYGBgYGBgW1tbXl5eWFhYXFxcZ2dnYWFhZWVla2traGhoZGRkYGBgUlJSYWFhVlZWZmZmXFxcU1NTZ2dnYWFhVFRUaGhoXFxcUlJSWlpaUVFRV1dXXl5eVlZWUFBQXFxcUlJSS0tLTU1NREREVlZWTU1NTExMS0tLTU1NUlJSSEhITExMVFRUS0tLTExMSUlJ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wcHBtra2t7e3yMjIu7u7tra209PTwcHBuLi4wMDArKysysrKt7e3ra2tsrKyzs7OxcXFvb29zs7O4uLi5OTk4uLiycnJ3t7e7+/vwcHB0dHRwcHBs7OzvLy8t7e3v7+/ysrK4ODgu7u77Ozs3Nzcpqamvb29rq6uqamps7Ozpqamra2tq6urmpqamJiYtra2vb29w8PDhoaGHR0dHR0dOzs7Pz8/Nzc3NDQ0JSUlJSUlNTU1Ojo6PT09Nzc3QkJCTExMUFBQVFRUQ0NDQUFBV1dXV1dXVFRUWFhYSkpKT09PVVVVUVFRYGBgcHBwc3Nzc3Nza2trXV1daWlpXV1dampqaWlpZGRkYGBgXl5eXFxcV1dXXFxcWVlZWlpaV1dXU1NTXFxcampqY2NjampqaGhoYmJiaWlpXV1dX19fZWVlVFRUXV1dWFhYXFxcWVlZVlZWV1dXXl5eUVFRXl5eWFhYXl5eVVVVWVlZV1dXTU1NUlJSSUlJUVFRTU1NSEhIUFBQS0tLTU1NTU1NS0tLQ0NDSUlJS0tLTExMQkJC////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wcHBtLS0q6urwMDAs7OzzMzM09PTz8/P1NTUyMjIuLi4s7Ozvb29vb29zMzMpaWl0NDQ6+vr4+Pj5eXl3Nzc0tLSuLi45eXl29vbwMDAuLi4qKiovr6+w8PDxMTEurq6vr6+r6+v3d3d0NDQysrKvLy8u7u7vLy8tbW1urq6tbW1pqampaWlsLCwsLCwpKSks7Ozra2ttbW1ycnJzc3Njo6OOTk5MjIyMzMzLCwsHh4eHBwcHx8fREREOTk5Ly8vQEBAPj4+TU1NVlZWUVFRR0dHREREVlZWUFBQUlJSWFhYVFRUTExMVlZWXV1da2trampqcnJyaGhoWVlZSkpKVFRUU1NTYmJiY2NjZmZmYWFhW1tbYGBgUVFRXFxcVlZWUlJSXFxcXFxcX19fXV1dZmZmWFhYXV1dX19fWlpaYmJiYGBgWFhYX19fWFhYVVVVX19fV1dXXV1dXl5eWFhYWVlZUFBQV1dXTExMSEhITExMU1NTUFBQQEBAUFBQTk5OR0dHQUFBPDw8PT09REREQUFBPj4+PT09OTk5paWl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+fn5wcHBwsLCv7+/zMzMzc3Ns7OzwsLCurq6z8/P0NDQwsLC0tLSsrKypaWlyMjIo6OjwcHB0NDQ4+Pj3Nzc29vbsLCwubm54+Pj7u7uysrKwsLCqampurq6ubm50dHRtLS0xsbGw8PD2NjYxcXFzMzMwMDAxMTEuLi4xMTEqampmJiYxMTEzs7O5eXlrKysvLy8urq6qKiotbW1ycnJx8fHx8fHv7+/w8PDurq6tbW1LCwsIyMjFBQUICAgKioqLS0tNDQ0KCgoQUFBPz8/Pj4+R0dHQkJCPj4+SEhIVVVVUFBQTU1NQkJCQ0NDUlJSUlJSZGRkbW1taWlpY2NjY2NjRUVFiYmJxcXFVlZWWlpaUlJSV1dXVFRUUFBQWFhYVVVVTExMUlJSUlJSVVVVVlZWZWVlaGhoYGBgZWVlXl5eYWFhXl5eVVVVXFxcV1dXU1NTU1NTXl5eUFBQWFhYXFxcUVFRVlZWU1NTV1dXYmJiUVFROzs7T09PUlJSU1NTSEhIS0tLRUVFNzc3Pz8/RkZGQEBAREREPj4+QkJC////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zs7OpaWlx8fHurq6wsLCtLS03t7ewsLCsrKyubm5z8/PoaGhoaGhwMDAuLi4ubm5tbW1ycnJ29vbycnJwcHBu7u7xsbG1NTU4+PjwcHBwMDAx8fH2NjYyMjIwMDAt7e3ysrKubm5wMDAxsbGxMTEx8fHsLCwtra2srKyzc3NzMzMurq6x8fHvr6+ycnJxMTEwcHB0tLSx8fHxsbGvr6+s7OznZ2dv7+/xsbGv7+/srKysrKyra2tsrKyxcXFubm5JSUlICAgMTExJiYmHx8fPT09OTk5UFBQRkZGMTExNjY2QUFBPT09PDw8Nzc3Ojo6Pj4+Tk5OTExMXV1dWlpaVlZWUFBQ0dHR0dHRWFhYRkZGTU1NVFRUXFxcSkpKT09PUVFRUlJSTU1NTU1NUFBQVlZWR0dHUlJSV1dXUFBQZWVlXV1dXV1dWFhYY2NjXV1dUlJSU1NTUVFRTk5OU1NTWFhYU1NTW1tbWFhYUVFRVVVVV1dXTU1NU1NTR0dHT09PTU1NTk5OTk5OQkJCRkZGRERESUlJREREQkJCQkJC////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////sbGxubm5wcHBxcXFxMTEysrKtbW1urq6ra2trKys0NDQwcHBs7OzsbGxvr6+xcXF8fHxtra2srKyoaGhtra2vb29zMzMysrKzs7Os7Ozx8fHxcXFw8PDwMDAubm5tra2pqamurq6w8PDw8PDs7OzoqKi3Nzc39/fuLi4u7u7rKysubm5tbW1s7Ozx8fH3d3dra2tycnJxcXF0dHRurq64uLivr6+v7+/t7e3srKywsLClpaWqKioqampuLi4wMDAy8vLxsbG7OzswMDAlJSUjo6OWVlZJycnMDAwJycnJycnIiIiJycnIiIiKCgoJiYmGRkZMjIyeHh4nJycxcXFYWFhWlpaQUFBvr6+VlZWSEhIVFRURkZGREREUlJSXFxcSUlJUFBQUlJSSkpKSEhIU1NTSEhIUVFRUVFRYmJiUFBQYWFhW1tbU1NTV1dXX19fWFhYXFxcVlZWXFxcV1dXWlpaYGBgXV1dXl5eWVlZWFhYTk5OT09PTk5OTk5OQkJCQUFBQEBASUlJRkZGR0dHPj4+SEhIPz8/PT09Q0ND////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wMDAv7+/wMDAwcHBzMzMqKiotbW1vr6+v7+/w8PDrq6urKysrKystbW15+fny8vLt7e3r6+vx8fHsrKyurq64+PjxMTEvLy8ra2tvr6+tLS0tbW1wsLCpKSkt7e3tbW1srKyvb29vLy8sbGxvr6+tra2vLy8vb293d3dr6+vubm5n5+fpqamt7e3zc3NsbGxw8PDxMTEs7Oz0NDQzMzM5OTk3t7ex8fHwMDAubm5vLy8wMDAurq6tLS0oaGhtbW1rq6urq6utLS0qampvLy8uLi4v7+/wsLCz8/PycnJv7+/wcHBl5eXtLS0sLCwqamp2dnZ2trapaWlv7+/xMTE1tbWurq6dXV1Ozs7mZmZTExMTU1NU1NTRUVFPj4+Tk5OTExMSUlJQkJCRkZGQ0NDPz8/R0dHT09PRUVFW1tbWlpaVlZWWlpaUlJSVlZWVVVVUlJSTU1NWFhYWVlZVlZWXl5eV1dXV1dXXFxcS0tLVlZWWFhYXFxcUlJSTU1NTU1NUVFRQ0NDS0tLTk5OQ0NDS0tLUVFRSkpKPT097u7u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fnxsbGvb29wcHB3d3dzc3Np6envLy8tLS0u7u7w8PDxcXFrq6uycnJ4eHh4eHhuLi4xsbGxcXFtbW1ubm5xsbG2NjYv7+/tra20dHRw8PDurq6tra2rKysvLy8u7u7sLCwoqKitbW1vr6+xsbGy8vLysrKuLi4t7e31dXVpqamurq6v7+/rq6uvLy8tLS0wMDAwcHBtLS0vLy8xMTE2NjY1dXV2tra6urq5OTkvr6+srKyurq6oKCgn5+fsrKyt7e3wMDAyMjIyMjIpaWltLS0sLCwtra2wMDAubm5tbW1xMTEyMjIsrKyoaGhnp6eqqqqwcHBycnJtra2tbW1q6ur1dXV3d3dqKiofX19MDAwcHBwTU1NRkZGT09PSUlJQUFBUVFRSEhIQEBARUVFNjY2Ozs7OTk5PDw8MzMzTk5ORkZGPDw8SkpKU1NTWFhYUlJSVFRUTk5OVVVVVFRUU1NTVVVVS0tLUlJSXFxcVVVVVFRUWFhYTU1NUlJSWVlZSEhISkpKS0tLRkZGR0dHR0dHTU1NRERERkZGSEhI////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ubm5ubm5xsbGwMDAx8fHubm5u7u77Ozss7OzxcXFwMDArq6uqqqq7+/v3d3d6Ojo4eHhsLCw29vbs7OztLS0yMjI0dHR0NDQ5OTkxcXFqqqqu7u7u7u7tLS0rq6uvb29wsLCpaWloqKiq6urpqamvb29tbW1p6enu7u7r6+vtLS0ubm5ra2tsrKyurq6zMzMvLy8tLS0vLy8vLy8uLi4rKysqKio09PTzs7O4uLi0tLSvLy8tra2ubm5t7e3s7Ozv7+/sbGxrq6usbGx3d3d3Nzcv7+/r6+vurq6sLCwx8fHvLy85OTkrq6utLS0pqamsrKysLCwtra2sLCwubm5srKyqKioqampw8PDmZmZLi4uCQkJQkJCPT09R0dHRUVFNzc3RERENTU1QUFBREREPj4+TExMNzc3PT09Ozs7RkZGTU1NQEBAR0dHS0tLOTk5SUlJVVVVSUlJTk5OVlZWUlJSVFRUU1NTQkJCQ0NDXV1dTExMU1NTW1tbTU1NUVFRRUVFR0dHS0tLSEhIRkZGTU1NPz8/UlJSQkJCNTU1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vb29u7u7tbW1y8vLtLS0rq6upKSkrKysvr6+zc3NxMTEysrKzc3N3t7e7Ozsz8/PxMTEv7+/tbW1u7u7wcHBtLS00dHR19fXzs7Ow8PDw8PDsbGxqamps7OzsLCwv7+/rKysqKiopaWlqqqqp6enoqKioaGhra2tsLCwtLS0o6Ojrq6usLCwr6+vu7u7vLy8rq6urq6usLCwwMDArq6upKSkqKiouLi4vLy81NTU0dHRrKysu7u7rq6uqqqqoaGhs7Ozt7e3nJyc1tbWubm5o6OjoaGhpqamubm5u7u7srKyycnJzs7Orq6usLCwsrKyy8vLs7OzsbGxpKSkpqamt7e3sbGxnp6em5ubp6enJCQkFxcXqampMzMzPz8/QEBAUlJSPT09Pj4+NDQ0Pz8/OTk5OTk5RkZGQUFBPz8/TExMR0dHSkpKQkJCTExMPDw8PDw8NDQ0RERERkZGSEhIVFRUUFBQTU1NRUVFSkpKRkZGTU1NTU1NSkpKR0dHSkpKS0tLUlJSRUVFTU1NVVVVSEhIRERESUlJQ0NDh4eH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+/v7+/rq6ur6+vqKiorKystra2s7Ozu7u7qqqqtra2rq6uy8vL5eXl9PT0srKyubm5s7Oztra2rKysvr6+2traubm5/Pz85+fntra2u7u7s7Ozvb29uLi4t7e3v7+/pqamra2tsbGxr6+vurq6rKysmpqaqamptLS0pKSkwMDAr6+vsLCwq6urtLS0rq6uvb29urq6urq6xMTEo6Ojrq6uwsLCuLi40tLStra2wsLC0NDQpKSkr6+v0NDQyMjIt7e3qqqqo6Ojl5eXnZ2dnZ2drKysra2tuLi4wsLCwsLC0tLSu7u7u7u7qqqqtbW1ra2tp6enwMDAsLCwrKysoaGhjo6OmJiYkJCQnp6eo6OjAgICmJiYnZ2dNjY2MjIyRUVFQkJCPDw8MjIyLi4uMjIyKysrNDQ0Pj4+SUlJOTk5Ozs7OTk5Q0NDMzMzOzs7NjY2ODg4MDAwQUFBSUlJSkpKTk5OREREWVlZS0tLQkJCSkpKU1NTSkpKSkpKSUlJSkpKQUFBTU1NUFBQVVVVT09PRERESEhISEhI////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ycnJ09PTvr6+tra2w8PDxMTEurq6xMTErKysrKysrq6uvLy8ubm54+Pj19fXra2tvr6+uLi4q6urzMzMysrKtbW1vb29oKCgzs7OuLi44uLiw8PDqKioyMjIw8PDwsLCubm5uLi4tbW1vb29s7OzqampwcHBrq6uoKCgv7+/paWlvb29p6ensLCwsrKywcHBxMTEu7u7rKysuLi4sbGxsLCwp6en4ODg3d3dt7e3srKyvr6+1tbW3d3dra2trq6ut7e3paWlqqqqpqammZmZpqamn5+fpaWlzs7OqKioqampqqqqoqKipqamr6+vtra2srKyxMTEr6+vubm5rKysqKiorq6umZmZlZWVhISEhoaGyMjIPj4+nJyclZWVMDAwOzs7MjIyQ0NDREREPT09LS0tKysrKioqLS0tLy8vMjIyMTExOjo6Nzc3NDQ0Ly8vLCwsSEhINjY2Ozs7Pz8/QkJCSUlJUVFRSkpKUlJSXV1dU1NTTExMSkpKTExMSEhIPDw8SUlJTU1NTk5OSkpKOzs7SEhIRkZGQUFBQ0ND////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////q6urvr6+ubm5v7+/vr6+ysrKurq63t7eu7u7s7Ozrq6uz8/PwsLC6Ojos7Oz4+Pj5ubm39/fpqamurq6vb29tra2rq6uuLi4qKiowcHBxcXF6urq6+vr4+Pjx8fH4eHhzMzM5eXl1tbWr6+vuLi4zs7OysrKtra2sbGxwsLCsLCwpaWlt7e3wsLCpqamwcHBxMTEwMDArKys0NDQsbGx6enp0tLSsbGxsLCws7Ozz8/PuLi4wcHBsLCwtLS0rKystbW1s7OzpqampKSkpqamwMDAwcHBu7u7tra2ubm5urq6srKytbW1rKysra2tra2ttbW1qampuLi4srKyqampsrKysrKys7OzmpqakpKSrKysvLy8VFRUvb29v7+/cHBwOzs7LCwsLy8vLy8vOjo6ODg4MjIyODg4Ly8vPT09MzMzKysrMjIyMTExMjIyNTU1Nzc3QkJCNDQ0Li4uNTU1Q0NDQEBAOjo6RkZGSEhISkpKTU1NSUlJR0dHTU1NSEhIRkZGQUFBQkJCTU1NTU1NR0dHQUFBSEhIOzs7RERE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5ubmvb29urq6qKiosbGxrKysrKysuLi4ubm5vLy8vb29zs7OuLi4QkJC1tbW19fX8PDwvb29r6+v3t7e3d3dwMDAqqqqqKioubm5p6enysrKtbW1u7u739/fsrKyvb29o6Ojvr6+rKysoaGhra2tu7u7w8PDv7+/wMDAysrKrKysurq6sbGxu7u7p6enra2tvr6+ubm5tra2y8vL09PTvb29xsbGw8PDurq6t7e3w8PDysrKsbGxqampxsbGoaGhqampoaGhsLCwsrKyr6+vra2t2NjYu7u7pqamo6Ojx8fHubm5x8fHvr6+tbW1vLy8oqKiq6urv7+/vLy8tLS0tbW1wsLCqampra2toaGhkpKSkZGRhISEbW1trq6uvr6+bm5uPDw8KysrKSkpLy8vJycnJCQkOjo6Ly8vQkJCQEBAJSUlOjo6Ozs7JiYmMzMzLCwsOzs7LS0tQ0NDNjY2OTk5PT09QkJCQkJCPz8/QkJCQkJCQEBANzc3REREQUFBSEhISUlJQkJCRkZGSUlJTExMVFRUTExMSUlJSEhIxsbG////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6+vrz8/Pz8/Pzs7Os7OzsLCwvr6+x8fHz8/P0dHRyMjIr6+vvb295+fn7u7uxcXF5ubmwsLCsLCww8PDu7u7rq6urq6us7Ozu7u7tbW1sLCwwcHBz8/P6OjoysrKvb29qampq6urtLS0tra2sLCwycnJurq6wMDAx8fHubm5wsLCu7u7z8/Pra2twsLCu7u7x8fHwsLCysrKw8PDwMDAurq6xMTEvLy8vb29srKynZ2dxsbGycnJvr6+zc3NnJycwcHBrKyszMzM0tLS7+/v2dnZ1NTUqqqqtLS0xcXFurq6p6enoqKiubm5ra2tsbGxqqqqo6OjtbW1uLi4qqqquLi41dXVnZ2dwMDAu7u7u7u7rq6uDg4On5+fvr6+t7e3xMTExcXFFRUVJiYmJCQkISEhIiIiHx8fQkJCKioqODg4PDw8Pj4+PT09Ozs7NTU1QEBAJSUlJycnNDQ0KysrPT09Li4uOzs7Ly8vPT09REREQkJCPj4+REREOTk5R0dHRERERUVFNjY2SUlJUFBQSUlJWFhYR0dHSkpKTExMxcXF////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2traw8PD2trazs7Ozs7O5+fnv7+/oqKitbW1vb29wcHBw8PDysrK5ubmxMTE39/fxMTEvr6+vLy8zs7OvLy8s7Ozk5OTwcHBwsLCvLy8sLCwzs7Opqam2NjY09PT5eXlycnJ1dXVtra2pKSkrq6utra2tra2tra2nJycoaGhsrKytbW1tbW1sbGxrKyssbGxqqqqzs7Ora2tsLCwvb29v7+/rq6uzs7OqampwMDAtLS0p6enwMDA39/fq6urqamp0dHR5OTkwMDAr6+vra2twsLC1dXVpqampqamoqKiq6urqampp6ennZ2dpKSkrq6uoqKiyMjIycnJxMTEtLS0uLi4zc3NvLy8ubm5uLi4vb29rKys9vb2t7e3v7+/w8PDvLy8lpaWnp6eHR0dKSkpGxsbHh4eKCgoHx8fMjIyOTk5KSkpNjY2PT09Ozs7PDw8MTExNzc3Nzc3KysrMzMzLS0tMDAwMjIyPDw8MzMzODg4RUVFNDQ0PT09RUVFNzc3Ojo6QUFBQUFBOjo6PDw8Ozs7R0dHR0dHQ0NDRERE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2NjY9fX1/v7+5eXlrq6u////uLi4r6+vvr6+oqKitra2tbW10tLS4uLitbW1srKywcHBrKysqqqqsbGxsLCwqampsrKyyMjItLS0tbW1vLy89PT0sbGxuLi4r6+vpKSk0NDQw8PDoqKiu7u7qqqqsbGxtbW1p6enubm5ycnJr6+vra2tq6urubm5qqqqsLCwrKystbW1tra2u7u7s7Ozra2t19fXysrKvLy8paWlq6urq6uryMjI8fHxs7Ozra2ts7OzsrKypaWlvLy8qqqqqKiooKCgsrKywcHBsLCwoaGhn5+foKCgp6enpKSkq6urpaWlnp6eqqqqr6+vs7Ozurq6tbW1urq6tLS0r6+vvb29pqam/f39zc3Nu7u7t7e3wcHByMjInZ2doKCgERERICAgGBgYHh4eIiIiGRkZGxsbKSkpMDAwMjIyIiIiJiYmICAgHx8fNzc3JiYmLS0tHR0dMDAwKSkpNDQ0KysrPz8/Ojo6Nzc3R0dHOzs7Q0NDODg4MzMzQkJCPz8/MzMzPz8/OTk5RkZGQUFBS0tL////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19fXw8PDx8fHuLi4ubm5tra2xcXFv7+/srKyuLi4tbW1ysrK2traycnJpKSkv7+/s7OzsrKyr6+vpKSkt7e3xsbG3t7er6+vb29vmZmZvb29wcHBz8/PsLCwtbW1tra2wMDAs7Ozvb29qamppaWlrKysqampqqqqr6+vtra2sLCwvr6+q6urlpaWy8vLtra2qqqqrKyssrKyrKyswcHBqKioysrKsLCwtra2sbGxsLCwsrKysrKy/////Pz8urq6tLS0sbGxra2tsbGxqampsLCwrq6uqampra2tra2tpaWlpqamo6Ojo6Ojt7e3p6ensbGxpKSkra2tpKSkqqqqp6enr6+vtbW1ubm50NDQwcHBwsLCqKio7u7u6+vrwsLC1NTU29vbvLy81tbWs7OzwMDAFBQUFRUVGRkZGxsbGRkZJSUlIiIiKioqKysrJiYmLCwsMzMzHh4eJCQkMDAwNjY2LCwsKysrLCwsJSUlJycnMDAwLS0tPj4+OTk5Ozs7MTExNjY2Nzc3R0dHKioqOTk5Ozs7Pz8/Q0NDRkZG////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8fHx8fH3Nzcy8vLvr6+wsLCt7e3urq6sLCwu7u7s7OztbW139/f5OTkuLi4tbW1t7e3q6urtra2xMTEubm5q6ursbGxioqKqampqKioq6uro6Ojra2ts7Ozy8vLz8/PpaWlvLy80tLStbW1wsLCr6+vvLy8tLS0sLCwsLCwkZGRrKyso6OjpqamoaGh4uLipKSktbW1ubm5vLy8urq6x8fHr6+vsrKytra2v7+/9fX1////////9vb23t7e9vb21tbWq6uru7u7tra2qamp2dnZra2toaGhn5+fpaWlqqqqqampsLCw3t7euLi4tLS0sbGxwsLCoaGhubm5vb29oKCgqqqqysrKwMDAwsLCwcHBtbW1oKCg3Nzc4+PjxsbGvb29////vLy80dHRp6envr6+urq6Hh4eGxsbLCwsJycnKSkpKCgoPT09PT09Ozs7KioqKysrKCgoLS0tJCQkMDAwNzc3KysrQEBAJiYmFhYWMzMzGxsbMDAwQEBAPj4+KSkpQkJCMzMzQ0NDPT09S0tLOzs7NjY2RkZGSEhI////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////urq6srKyw8PDr6+vpKSkurq6oqKira2ts7Oz3Nzczs7O8PDwx8fHwsLCvLy8uLi4xMTEsrKyrKystLS0nJycsbGxtLS0qampr6+vra2t0dHRycnJsbGxrKyszc3Nu7u7ra2tt7e3wsLCz8/Pzs7OsLCwvLy8s7OztLS0r6+vpKSkqampsbGxrq6utra2ra2txsbGqqqqsbGxsbGxu7u7srKys7OzoqKit7e3////pqamrKyswMDAvr6+ysrKysrKcXFxMTExJSUlOTk5t7e3qKiosbGxubm5qKiopaWlqamptLS0wcHBvb29ra2toKCgpqamycnJp6ensbGxx8fHuLi4tbW1qqqqs7OzsbGxw8PD1NTUtLS0qKiovr6+eXl5ubm5xsbGvLy8rq6uwMDAuLi4t7e3yMjICQkJERERCwsLIiIiLy8vLy8vNTU1Ly8vLCwsISEhKCgoJiYmLS0tGBgYNjY2NTU1Ojo6QUFBKCgoJSUlGRkZKCgoNTU1MjIyODg4RkZGREREPT09QEBAQUFBNDQ0SUlJNTU1QUFB////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9PT0xsbGw8PDrKyssLCwwcHBtLS0wMDAxsbGvb29ysrK0NDQvr6+x8fHvb29sLCw1NTUsLCwubm5tra2o6OjqKiosbGxvLy8uLi4v7+/1tbWtbW1s7OzsLCwuLi4yMjIrq6uy8vLtra2urq6u7u7zc3N1NTUvr6+wMDAoqKir6+vsbGxq6ursLCwqqqqpKSkubm5s7OzoaGhsrKyt7e3wMDAxsbGs7Oz09PTwcHB+/v7q6urt7e3sLCwwcHBt7e3tLS0KCgoGRkZVVVV9PT02NjY1tbWvLy8ra2ttbW1urq6rq6uvr6+r6+vwMDArq6uurq6u7u7oKCgq6ursbGxrKysyMjIoqKiqKiosbGx0NDQd3d3cHBwhoaGyMjIx8fHv7+/t7e3ubm5t7e3oKCgsrKy3d3d3d3drq6um5ubcXFxBgYGAwMDAAAACwsLJiYmJSUlGRkZHR0dHx8fIyMjHR0dFxcXHh4eGBgYHBwcHh4eLy8vKysrIyMjJSUlIiIiODg4LCwsPj4+SUlJNzc3SUlJQUFBMDAwPDw8Ozs7nJyc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1dXVz8/PsrKyxsbGwsLCsbGx1tbWvb293NzcwcHBubm5srKysLCwubm5sbGxsLCwsbGxtbW1tLS0uLi4vLy8vb290NDQp6ensbGxtLS009PT3t7eu7u7pqams7OzsbGxtLS0qqqquLi4ubm56enp4uLiysrKxcXF1tbWubm5r6+vsbGxsrKyp6enxcXFqqqqsLCwtra2tbW11NTUzc3NzMzMtra2s7Ozw8PD2tra/f39wMDAp6ensbGxvLy8uLi4qKiosLCwubm5rq6u6+vr4+Pjra2tu7u7sbGxpaWlrKysycnJrKysra2ts7OzqqqqvLy84+PjwsLCpqamqqqqt7e3q6urmpqatra2r6+v2trat7e3r6+vqampwMDAwMDA6enpxcXFuLi4tra2sLCwp6enp6entra2tbW1w8PD09PTr6+vDAwMAAAABQUFAAAAHx8fFRUVBwcHExMTDAwMFRUVExMTDAwMICAgHR0dGhoaFhYWJSUlGBgYFRUVKSkpIiIiJycnKCgoNjY2Li4uPz8/NTU1OTk5KioqNDQ0mZmZ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tbW1sbGxv7+/wcHB1dXVsbGxz8/PwsLCv7+/8PDw1tbWqqqqzMzMt7e3rKysq6ursrKyu7u7ra2ts7OzuLi439/fr6+vwMDAv7+/1NTUpaWluLi4sLCwra2tra2tvr6+srKyvb29s7OzsbGxqKiora2t6+vr4uLiqqqq1tbWycnJ4+PjtLS0ycnJq6urubm5tLS0rq6utLS0uLi4s7Ozvb29tLS0t7e3uLi4u7u77u7utLS0srKyo6Ojqqqqurq6u7u7oaGhxcXF09PTlZWV39/fzc3Nq6urr6+vsLCwqqqqsLCwvr6+tbW1p6enra2trq6u6+vrxMTEvr6+vb29np6ey8vL7Ozs7Ozs1tbWkJCQh4eH29vb0tLSz8/P09PTrq6ut7e34eHhpaWlqampwsLCsLCwuLi4t7e3wsLCxMTEnZ2duLi4XV1dBAQEBgYGAAAAEhISFxcXFhYWFRUVISEhIiIiEhISERERFhYWFxcXKSkpMDAwJCQkHx8fHx8fHx8fHR0dFxcXHx8fJycnICAgLCwsMTExMTExMzMz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////sbGxt7e3qqqqnZ2dsrKyycnJzs7Oz8/Px8fHwcHByMjIvb29tLS0oqKiq6urnp6epKSkra2tyMjIysrK1NTUtbW13t7etLS0urq6v7+/urq6r6+vubm5sbGxsbGxysrKp6ens7OzrKystra2tbW14uLit7e3rq6uq6urzs7O3d3dx8fHq6urqamppaWlrq6utra2qampmpqas7OzyMjItra2sLCwsLCwurq69PT0vb29vLy8vb29sbGxoKCgqampq6ursLCwt7e3s7Ozra2turq6sLCwsbGxnZ2do6OjqqqqtLS0qamptLS0sLCwxMTE0NDQtbW1uLi4xcXFz8/P2tra4eHhyMjI0dHRoaGhnZ2doaGhwsLCs7Oz1dXVxcXFt7e3sbGxrKysx8fHvLy8xcXFr6+vtLS0t7e3sLCwyMjIuLi4t7e3q6urkpKSFxcXAAAAFhYWFhYWGRkZIyMjNDQ0Nzc3GhoaFhYWFxcXDg4OEBAQHh4eJiYmJCQkHBwcDAwMFhYWLi4uHx8fKysrHh4eGRkZMjIyGhoaKysr////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4ODgr6+vtbW1srKy5OTkubm5xsbGycnJycnJ0dHR39/ftbW1v7+/tra2y8vLsLCwrq6utLS0s7Ozs7OzycnJrKystbW1vr6+zMzMvb291dXVr6+vp6enr6+vra2ts7OztLS0sLCwqampr6+vr6+v1dXVra2tqampubm5tra2ubm5m5ub29vbpaWljo6OnZ2durq6vb29rq6umZmZsLCwtra2srKysLCwtbW15ubmwsLCsLCwubm5sbGxpqamr6+vm5ubs7Ozrq6uuLi4paWlsbGxtLS0sbGxqKiopKSkra2to6OjqKiosbGxzMzMu7u7urq6sbGxt7e3qampuLi4qKiolJSUwcHBurq6pKSkmZmZxsbGrKyso6OjnZ2dn5+frKysurq6urq6sLCwjo6OnJycxsbGwcHBtbW1r6+vra2tsbGxsLCwkpKSnp6eo6OjiYmJcnJyKioqFxcXHx8fGhoaGhoaJycnJCQkJSUlISEhFRUVExMTFhYWExMTISEhHBwcCQkJCgoKEhISFRUVIyMjFRUVHh4eEBAQLS0tYWFh////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ysrKwcHBubm5urq66Ojo39/fu7u7zs7OxMTEq6urvLy8tra2srKyq6urq6urs7Ozurq6rKysuLi4v7+/zs7OsbGxurq6srKyvr6+vLy8wsLCvr6+pqamtra2p6enoKCgq6uro6Ojqampw8PDsrKypaWlrq6uvb29vb29u7u70NDQs7OzvLy8wMDAqqqqrq6uqKiop6enqqqqtbW1rq6us7OzvLy8v7+/yMjIwsLC39/f6urqsrKyvLy8r6+vtra2tbW1q6urmpqaoqKiqKioqqqqsrKyrKyspaWlpqamrq6up6envLy8tLS0qamppqammZmZy8vLqampmZmZra2tra2t1tbWsbGxurq6oqKipKSkw8PDwMDApaWlq6urq6uruLi4sbGx0dHRxcXFra2tt7e3lpaWrq6uu7u7sbGxoqKim5ubra2ts7OztLS0rKysnZ2dra2tu7u7YmJiExMTFxcXEBAQCgoKCwsLGhoaGxsbExMTExMTGhoaCwsLISEhGRkZGhoaFBQUBAQEDAwMCQkJGhoaGhoaGRkZJSUlkZGR////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7OzsrKysbGxtbW1v7+/xcXFvb29x8fHtbW109PTsrKyn5+fqamptbW1o6OjrKysnZ2dqKiosLCwrq6uwsLCwsLCoqKixMTEt7e33d3dp6entra2tLS0sbGxsbGxra2tqKiorq6uycnJtbW1rKysq6ur19fXkZGRrKysra2tqKio9PT0r6+vy8vL7+/v3Nzcqqqqt7e3xcXFtra2ubm5sLCwvLy8s7OztbW1tbW1tbW1srKyzMzMxMTEuLi4s7OzvLy8srKytra2ra2tpqammpqatra2ysrKqKiowcHB4ODgv7+/oKCgrKysoKCgnZ2drq6utLS0hISEpaWlwcHBoqKip6entra2ubm5srKyrq6upKSkoaGhra2tsbGxp6enp6enr6+vz8/Pt7e3s7OzsbGxsbGxq6urt7e3tbW1u7u7tLS0srKyrKysvr6+uLi4r6+vpqamra2tr6+vERERQUFBbGxsCQkJAgICBQUFGhoaEhISERERCQkJCAgICQkJGhoaJycnFxcXFhYWDQ0NBwcHEhISHR0dEhISHh4e////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19fXsrKyx8fHtbW1xcXFxMTEw8PD1dXVwcHBq6urtbW1tbW1oaGhqqqqsbGxpaWlra2ttLS0ycnJwMDAp6ensrKyqKioq6urrq6ut7e3y8vLqampqampsbGxrKysr6+vubm5n5+fvr6+s7OzsbGxsbGxr6+vubm5zs7Oq6ursLCwpKSkuLi4qKio0tLSt7e3tra2qampzMzMv7+/paWlra2txMTEpaWlqqqqubm5tra2ra2ts7Ozr6+vq6urtra2w8PDwMDAwcHBvr6+qKiooKCgpKSkn5+frKysycnJt7e3oKCgtLS0rq6us7OztbW1q6urm5ubvb29zc3NpqamqampqqqqqamptLS0rKyssrKyvLy8n5+frq6utLS0urq6m5uboqKit7e3urq6qqqqysrKsrKyra2ts7Oztra2n5+fk5OTnZ2dn5+fnJycuLi4qKiorq6usLCwrq6ut7e3sbGxrKysioqKRUVFf39/AAAAERERCQkJCwsLBQUFBgYGAAAABQUFFBQUDw8PHBwcBgYGAQEBFRUVEBAQDg4OEhIS////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tbW1xMTE0tLSxMTEurq6y8vLx8fHy8vLvr6+uLi4r6+vtLS0zs7OtbW1qampt7e3r6+vv7+/t7e3oqKirKyssbGxsrKyn5+fyMjIo6OjtbW1urq6wcHBqKionZ2dpqampKSksbGxqqqqubm5v7+/rKyss7Ozn5+frq6uvb29pKSkra2tubm5qamptra2z8/Px8fHpqampqamzc3NtLS0rKyswsLCyMjIr6+vu7u7vLy8sbGxvb29paWl3NzcrKysmZmZsLCwp6enrq6usrKyp6ensbGxn5+fycnJsbGxwcHBoKCgra2th4eHp6envb29sLCwubm5qKiolpaWp6enoKCgvb29vr6+qKiomZmZnp6eqqqqz8/PqKiorq6uqampoKCgnZ2dq6uru7u7s7Ozu7u7sbGxuLi4srKytLS0mZmZqampnZ2dnJycmJiYioqKqKios7Ozv7+/ra2tm5ubpKSkoaGhra2tra2trKysoqKigICAe3t7EBAQAAAABwcHAAAAAAAAERERDAwMCAgIFBQUAwMDAwMDJiYmJSUlFBQU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////uLi4urq6rKysvr6+wsLC0NDQ1tbWsrKysLCwu7u7vLy8ra2tvr6+z8/PwsLCzc3NvLy8xMTEtLS0tra2vr6+s7Ozqamps7OzxcXFxsbGqqqqqampvr6+tLS0tLS0pqamtbW1tra2qqqqo6Ojqqqqs7Ozo6Ojp6enurq6q6ururq6rq6upaWlqqqqwMDA1NTUt7e3rKysurq6srKyqampr6+vwcHBtbW1qqqqrq6urq6uu7u7ra2trq6uurq6rKysuLi4sLCwra2tsbGxvLy8uLi4rKysycnJsbGxtra2qqqqp6en2trauLi4oaGhrKysubm5tra2kJCQoKCgtra2pqampKSkoKCgvLy8pqamp6enoqKis7OzxMTEpKSkqqqqq6ur2tras7OzpKSkq6urtbW1y8vLrq6uuLi4qampn5+fmZmZoqKil5eXs7OzpaWlqqqqsbGxrKysqampr6+vtLS0sLCwurq6qKioqKiokZGRqamplJSUPz8/Ozs7cHBwAAAAAAAADAwMGhoaERERFBQUGBgYCAgIBgYGHh4empqa////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////t7e3tbW1ycnJvLy8vr6+vLy8vb29sLCwoKCgtLS0rq6uwcHBysrKtra2sbGxpqamtLS0p6envb29ubm5qamptbW1t7e3xcXFtLS0tbW10tLSsrKytra2qqqqvLy8vLy8sLCwmpqamZmZlJSUqqqqqampp6ens7OzrKysoaGhp6enrKyspqamzMzMs7OzqKioz8/PtbW1zMzMuLi4rq6uqqqqqampqqqqqKiowcHBo6Ojurq6r6+vubm5t7e3ra2tpqamsrKyubm5ubm5t7e3q6urxMTEsbGxvLy8o6OjsrKy4ODgzs7OtLS0rq6uqKiokJCQv7+/q6uroqKip6enra2tqampuLi4oqKiqampra2tqqqqqKiompqasrKyp6enqqqqx8fHs7OzqKiox8fHtLS0zs7OsrKyu7u7rq6unp6elZWVmpqas7OztbW1t7e3vb29wsLCtra2np6en5+fp6enpqaml5eXm5ubo6OjsbGxvb29mpqaIiIiBQUFg4ODoKCggoKCAAAAGBgYHR0dEhISEhISFRUVCgoKExMT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7Ozr6+vzs7Ot7e3xcXFzMzM0dHRvb29qamptLS0vb29u7u7uLi4ubm5oKCgq6ursLCwwMDAubm52NjYtbW1sbGxxMTEurq6pqamr6+vrKyssLCwv7+/ysrKtbW1sbGxrq6uwMDAqKiosrKysrKyqampnp6epaWln5+foaGhurq6q6urqqqq39/fwsLCq6urrKysrKyspqam0tLSx8fHra2toqKioqKiu7u7ubm5qKiovr6+lJSUra2tr6+vpqamoaGhtbW1qqqqnJycx8fHwMDAqKioj4+PUlJS2dnZ0dHRvLy8p6enqKiosLCwn5+fwcHBs7Ozu7u7r6+vsbGxoKCgpKSkkZGRtbW1s7Ozm5ubnZ2dqqqqj4+Pp6entra2q6urp6ensrKys7Ozo6OjsbGxzs7O4eHhycnJwMDAwcHBq6urubm5srKyubm5o6OjtLS0srKys7OzrKysoKCgsbGxurq6paWlp6enu7u7ra2tDQ0NYWFhrKysqKiora2tl5eXiIiIoqKinJycpqamDg4OCgoKGRkZDg4OCwsLBAQE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////qKiou7u7m5ubiYmJ1dXVy8vLvLy8m5ubqKioxsbG0tLSzc3Nx8fHtbW1vLy8u7u7tLS0uLi4u7u7oqKioqKihoaGsLCwzMzMv7+/p6enw8PDuLi4oqKivLy8r6+vqqqqrKyssbGxqqqqtLS0tLS0pqamnZ2dwMDAr6+v2NjY9/f3r6+v2NjYxsbGsLCwsbGxurq6srKyra2tsrKyx8fHz8/Pz8/P0tLSu7u7s7Ozqampt7e3t7e3ra2tuLi4q6urxMTErq6utbW1xcXFpKSkmpqaqKior6+vycnJn5+fh4eHqampl5eXurq6qqqqxcXFoKCgnp6ew8PDrq6uoKCgi4uLnZ2do6OjnZ2do6OjvLy8n5+fqampoaGhsLCwubm5nZ2dr6+vq6ursrKytbW1u7u7s7Ozubm5sbGxs7OztLS0uLi4uLi4tLS0qampr6+vrq6unp6en5+ftra2ubm5t7e3vLy8pKSknZ2dtbW1r6+vSUlJiYmJCQkJJCQknJycqqqqmZmZi4uLioqKjIyMl5eXnJycHBwcBgYGCgoKCwsL////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5OTknJycsrKyxcXFwsLCvr6+vb29tLS0vr6+ra2tr6+vsLCwr6+vtbW1p6ens7OztbW1vLy8m5ubtra2vLy8sbGxqampra2tt7e3vr6+sbGxs7Ozw8PDvLy8vb29tbW1ra2tt7e3mpqas7Ozrq6uu7u7rKysra2t5OTkrKysubm5sLCwo6OjtLS0tLS0paWlu7u7tLS0t7e3qKiosrKyrKys1tbWp6ennJycqampurq639/fs7OzsbGxpqamqKioyMjIt7e3s7Ozm5ubvLy8rKyslJSUR0dHoqKin5+fjIyMo6Ojr6+vpqamn5+foqKit7e3rq6um5ubtra2tbW1o6OjpKSkp6enn5+fq6urp6ensLCwn5+fp6enqqqqsrKyubm5qqqqvLy8x8fHrKys1dXVzMzMqamptbW1tLS0oaGhqqqqwMDApqamsrKyuLi4rKysrKysra2tw8PDqKiop6ens7Ozr6+voqKioqKio6Ojl5eXtbW1tLS0l5eXAAAAICAgt7e3kZGRxcXFp6engoKChISElJSUiYmJXl5ebGxstra2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////t7e3tLS0vb29uLi4w8PD0tLSwMDAs7Ozv7+/vb29vb29tLS0u7u7ubm5u7u7ra2ttra2q6ursbGxvr6+qampyMjIsbGxra2tr6+vs7OzpaWlwsLCpqamoKCgtbW1ra2ts7OzqqqqsbGxx8fHq6urrq6uysrKo6Ojra2tp6entbW1oKCgqampy8vLqqqqrKystbW1oaGhs7Ozs7Ozq6ursrKyqKio19fXsrKyrKyso6OjnZ2dpaWlnp6erq6usLCwq6urrq6uqamppKSkqKiop6enmJiYsbGxurq6o6Ojq6urLy8vcnJyr6+vpKSkw8PDi4uLmpqarKysq6urycnJq6urp6enrq6urKysmJiYvb29m5ubzs7OrKyspqamnp6enZ2doKCgsbGxwMDArq6uvr6+x8fHwsLCxMTEwMDAurq6ycnJzs7OoaGhr6+vurq6t7e3r6+vnZ2drKysv7+/w8PDw8PDv7+/tra2vLy8sLCwpqampKSkt7e3FRUVdXV1yMjIwcHBqqqqsLCwnp6eo6Ojm5ubw8PDsbGxkpKSb29v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tbW1ysrKw8PDyMjIuLi4ubm5qampr6+vtbW1wMDAx8fHuLi4rq6uv7+/v7+/sbGxqampsrKytra2u7u7tbW1qKiosLCwpKSkr6+vtbW1u7u7pqamsrKyq6urtLS0m5ubqKiorq6uu7u7pKSkyMjIt7e3rKysqKiosLCwx8fHxcXFrKysu7u7pKSko6OjsrKyw8PDwcHBrq6uq6urrKysrq6utbW1y8vLmpqatLS0srKyq6ursbGxwcHBh4eHsLCwpaWlqqqqp6enlpaWmpqasrKyqampwcHBtLS0vr6+pKSkqqqqnJycs7OzqampnJycn5+fqKionJycxsbGubm5pqamr6+vpaWlvb29oqKimZmZoqKiqamplJSUrKyss7Ozt7e3vb29tbW1u7u7t7e3t7e3qqqqsLCwwcHBsLCwwsLCwcHBy8vLs7Ozq6urwcHBr6+vra2tqampuLi4x8fHrq6uu7u7wMDAurq6ra2tuLi4tra2BwcHAAAAAAAAq6ururq62trasbGxrKysp6enpKSkr6+voqKibGxsqqqqysrK////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7OzqqqqxMTEzMzMr6+vpqamurq6oqKipaWlq6ursrKytLS0vLy8srKyqampt7e3wMDAqqqqsrKypaWlwMDAra2trKysw8PDvb29s7OztLS0qampmJiYnZ2dra2tysrKsbGxtbW1v7+/r6+vqqqqqKiowMDAwcHBtLS0oqKixcXFo6OjtbW1n5+fq6urp6enrq6ut7e3p6eno6OjoqKiz8/Pqqqqm5ubq6urt7e3rKysoKCgsbGxnp6emZmZmJiYrKysp6eno6OjwcHBuLi4u7u7qqqqq6urv7+/o6Oju7u7paWlrKysu7u7pqamsLCwu7u7t7e3tbW1sbGxrKystLS0pqamvb29n5+fubm5xsbGurq6tLS0s7OztbW1tra2vLy8vb29vr6+x8fHuLi4sLCwsbGxtbW1s7Ozv7+/x8fHtra2tLS0pqamp6enq6urp6enoqKitLS0qampsbGxr6+vubm5zc3NsrKyt7e3tLS0zs7ODAwMBwcHY2Njvb29oqKi29vbqqqqq6ursLCwrq6utra2qampmJiYqamprKys////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0NDQyMjItbW1tbW1rq6upaWlpKSksrKyoKCgrKysoaGhu7u7tLS0qqqqyMjIra2tsLCwrKystra2srKyvLy8ubm5qampt7e3t7e3sLCwwMDA1NTUgICApKSkqKio0tLSsbGx29vbqamps7OzsbGxqqqqra2tnJycx8fHp6ensrKysLCwtLS0sbGxpqamra2tpaWlrq6urKyso6Ojo6OjsrKyxcXFtra2zs7OxMTEtra2vLy8k5OTp6enra2tpaWlsLCwo6Ojtra2oKCgt7e3r6+vtbW1urq6rKysr6+vurq6lJSUr6+vzc3NgYGBpKSkqqqqvLy8v7+/lJSUlpaWoqKiqampqKiora2tpKSkrq6utra2r6+vqampqqqqsLCwt7e3srKytLS0mZmZp6enxsbGtbW1vb29vr6+wsLCs7OzpKSktra2r6+vwcHBr6+vnp6ekpKSoqKiubm5vr6+qKiosLCwv7+/sLCwsrKyycnJ3t7eysrK7+/vxsbG////yMjIwcHBz8/Pt7e3qqqqqKiosLCwqampn5+fq6uroqKi6urq////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+/v7+/p6enqqqqsrKyo6OjqampqamppaWloKCgq6urqqqqo6Ojr6+vtLS0pKSks7OztLS0srKysbGxvr6+urq6tLS0qampwcHBxcXF0dHRrq6ux8fHmZmZoqKiqqqqz8/Pv7+/tLS0q6urqqqqp6envr6+q6urubm5ra2t2dnZra2trKysoaGhq6urrq6ut7e3p6envb29ra2tsLCwz8/Pr6+vvr6+rKyst7e3tra2xcXFtLS0oqKinZ2dubm5oKCgoaGhpKSkpaWllZWVwcHBlpaWqqqqv7+/wcHBra2tv7+/uLi4n5+fqqqqrq6us7OzvLy8o6OjrKystLS0qampsbGxsLCwtLS0sLCwv7+/vr6+pqamqqqqtbW1pqamsrKyra2to6Ojs7OztbW1tbW1v7+/r6+vrq6uurq6sLCwtbW139/fr6+vp6en19fXpqamsLCwurq6tbW1p6enrKysqKioWlpawcHBsbGxt7e3vr6+wcHBzc3NwcHBoqKiu7u7pKSkpqamv7+/qKiop6eno6Ojn5+fpKSko6OjkJCQ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////r6+vw8PDvLy8p6entbW1u7u7s7Ozp6eno6OjuLi4lpaWuLi4s7Ozt7e3ra2trKysoqKioKCgqqqqwcHBtbW1u7u7t7e3w8PDycnJy8vLrq6uy8vLvb29kZGRm5ubw8PDrKysu7u7srKyq6ursbGxtLS0qqqqqampqKiozs7Oq6urmZmZq6urs7Ozm5ubxMTEysrKsbGxr6+vqqqq0NDQuLi4r6+vs7Ozs7Ozp6enpqampKSkvr6+qqqqr6+vmJiYnZ2dpqamsrKyo6OjoaGhoKCgqqqqtLS0p6eno6Ojtra2p6ensrKypKSktLS0wcHBpqamuLi4lJSUnp6emZmZgYGBtra2rq6urKysqampqKioysrKtbW1oaGhqKioqKioqampsLCwxMTEx8fHsrKysrKypqamqKiotLS0vLy8xMTEs7Oztra2qqqqsrKysrKyxcXFp6enq6uroKCgs7OzsLCwtbW1tLS0n5+fsbGxurq60NDQ39/fv7+/sbGxtra2wMDAra2tmZmZp6en4+Pjqampv7+/rKysqqqqoaGhuLi4////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wcHBvLy8tLS0tbW1wsLCq6urp6enw8PDn5+fnZ2dpaWloqKiq6ursbGxqqqqo6Ojra2twMDArKysmZmZq6ursbGxr6+vsrKytLS0q6urwsLCsrKy6+vrq6urqampp6ent7e3uLi4rKysq6urra2tp6enra2trKysxcXFra2trKyst7e3nJycoqKiwMDAr6+v5eXlsbGxzMzMoKCgqKiotLS0sLCwrKyst7e3vr6+nZ2dwcHBsbGxn5+fYWFhpaWlpaWlpaWlqKioqampu7u7oKCgqampra2toqKiw8PDh4eHq6uroaGhqqqqv7+/sbGxoqKis7Ozra2tr6+vqKiosbGxrq6ulpaWpaWlurq6sLCwt7e3p6entra2rq6u1dXVq6ururq6v7+/yMjIvb29srKywsLCnZ2dqqqqvb29uLi4v7+/sbGxsrKy3t7eo6Ojo6Ojs7Ozs7OzrKysn5+fs7OzuLi4p6ensLCwuLi4y8vLxsbGsbGx19fXwMDAl5eXm5ubtbW1oKCgpaWlmZmZmpqasbGxlJSUp6enuLi4sbGx////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19fXtLS0tra2np6esrKytLS0tbW1xMTEurq6qKior6+vsrKysrKym5ubra2tv7+/nZ2dra2tnp6epqamrq6upaWltLS0r6+vra2tu7u7t7e3sbGxtbW1ysrKtLS0xcXFp6enr6+vtbW1np6er6+vvb29pKSkmZmZwMDArKysn5+ftLS0p6enxMTEsLCwra2ts7Ozrq6urq6usbGxtLS0w8PDq6urrq6uurq6tbW1urq6k5OTuLi4ra2trq6uq6urlJSUwcHBs7Ozs7OzsbGxrq6upqamn5+ft7e3ubm5pKSkr6+vnZ2duLi4kJCQpaWls7Ozn5+foKCgo6Ojs7OzxsbGsLCwtbW1tLS0sLCwrKystLS0o6Ojrq6umpqasbGxxsbGoaGhqKiotbW1pqamra2tsrKysbGxtra2wMDAq6urtra2q6urzMzMurq6sbGxrKysp6enrq6uurq6vLy8mZmZp6enu7u7yMjIt7e3tra2qKiorKyssLCwoaGhra2tqamppKSkmZmZq6urmJiYu7u7ubm5paWloKCgwMDAmpqa////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7u7r6+vtbW1uLi4wcHBoqKisLCwtLS0uLi4pKSkqampurq6sbGxwcHBvLy8pKSkra2tqqqql5eXjY2NnZ2dsrKynp6eqampqqqqu7u7srKyuLi4sbGxpqamubm5tra2p6enrq6uqampp6enu7u7rKysyMjIp6eno6OjsbGxubm5s7OzqqqqqKiotLS0vr6+tLS0paWltra2tLS0nJycs7Ozr6+vtra2ra2turq6q6uroaGhwcHBr6+vr6+vs7OzxsbGpKSkmJiYq6urp6ens7OzsrKyl5eXxMTEjY2NrKysq6urvr6+gICAj4+PtbW1pqamsLCwr6+vtbW1qKiosLCwsbGxsLCwqqqqoKCgp6enkZGRj4+PoqKir6+vsrKyp6enubm5sLCwtra2ra2ttbW1p6enycnJqqqqt7e3x8fHu7u7r6+vq6urxcXFsbGxpqamsrKyr6+vsLCwubm5tra2t7e3tbW1v7+/vr6+ubm5rq6usbGxsbGxr6+vrKysq6urpKSkiIiIlZWVl5eXnp6epKSknp6epaWlqKioq6ur////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Pj4wcHBtra2ra2ts7OzsrKyq6ursbGxvLy8w8PDp6envb29vb29uLi4sLCw4eHhnZ2drq6urq6ulpaWf39/sLCwnp6eoKCgoqKisLCwra2tnp6erKyssrKyvLy8v7+/tra2qampurq6qKiou7u7r6+vurq6vLy8vb29urq6q6ursrKyubm5nJycrKyspqam3d3dt7e3p6enurq6m5ubo6OjwMDAr6+vuLi4wMDAvLy8ra2tq6urp6enra2tpaWlsrKyrq6uv7+/vb29srKyhISEtra2wcHB3NzclpaWsLCwwcHBxsbGsrKysLCwioqKtbW1oKCgsrKyr6+vrq6usrKyubm5rKysv7+/qqqqpqamrq6uycnJwMDAwcHBrKysrKysrKysra2trKyspaWlsbGxoKCgvLy8p6ens7Ozw8PDv7+/tLS0o6OjqKiotra2sbGxrKystra2mpqaq6urs7OzsrKyrKysycnJurq6srKytLS0tLS0q6urqqqqsbGxo6OjkZGRv7+/m5ubp6enmJiYsbGxtbW1q6urqKiorKyssbGx////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tbW1tra2m5ubvLy8uLi4q6urmpqat7e3y8vLy8vL2dnZ5+fnra2tubm5srKyqKionJyczMzMnZ2dsbGxq6urm5ubpqamoaGhn5+fo6Ojk5OTmZmZo6OjpaWln5+fubm5oaGhvb29m5ubra2tpKSktLS0r6+vq6ursbGxtLS0x8fHsLCwqKiopKSklpaWoqKira2tpqamtLS0tbW1ra2tw8PDzMzMubm5t7e3sLCwvr6+t7e3tra2p6enoqKipaWlq6urqqqqpaWlpKSklZWVtLS04ODgzs7Oqampqampubm5zMzMtLS0p6enr6+vurq6u7u7wMDAqqqqqamptLS0oqKisbGxzs7Ow8PDm5ubqqqqp6entbW1tLS0oaGhs7OzwcHBtLS0r6+vqKiorKysq6urtbW1rKysqKiowsLCrq6utbW1qqqqmpqasbGxpKSkycnJrKyspKSkqampsrKyurq6xMTEtra2wsLCtLS0qqqqqqqqoaGhqKiora2tpKSkjIyMra2tsrKyzMzMubm5x8fHurq6r6+vvLy8tbW1pKSk2NjY////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8PDwMDAsrKyq6urs7OzuLi4xMTEtra2urq6vLy8u7u7v7+/uLi4u7u7qKiooaGhoKCgsrKyqqqqoKCgpKSkoqKikJCQmpqakJCQnJycnZ2dm5ubn5+fsbGxvLy8rq6unJycrKysrKystbW1pKSkm5ubtbW1qampq6urq6urp6enpaWlwsLCra2ts7Ozvr6+wsLCtbW1vLy8vr6+wMDA1dXVxcXFuLi4ubm5urq6u7u7n5+furq6sbGxrKyssrKyu7u7p6entLS0ra2t09PTq6urtbW1s7Ozs7Ozy8vLxcXFo6Oj/v7+r6+vra2tqqqqrKystra2q6urmJiYtLS0uLi4ubm5xMTEsrKysrKys7Ozr6+vvr6+sbGxr6+vpqamtbW1p6env7+/wsLCvLy8ubm5tra2zc3Nx8fH2trar6+vr6+vu7u7urq6r6+vrq6uubm5s7OzrKysra2ts7OztLS0oKCgoaGhtbW1nJycrKyssLCwm5ubp6enqqqqqKiom5ubmJiYm5ubra2tp6enwcHBvb29jo6Op6ens7OzmZmZ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7u7uuLi4wcHBubm5urq6n5+fgYGBwsLCtra2tra2sLCwtra2vLy8sbGxurq6p6enp6enqKioqKiom5ubsbGxoKCglpaWjIyMjIyMkpKSjo6Onp6elpaWqKiosrKyt7e3p6enrKysnJycsrKyqKiosrKyrq6uvLy8wcHB1dXVubm5pqamt7e3sLCwp6entra2tbW1tbW139/f4eHhubm5ra2tuLi4x8fHfn5+w8PDqKiotLS0x8fHu7u7vLy8tbW1mZmZn5+fvb29wcHBzc3NlJSUq6ursrKyn5+fq6urwsLClpaWn5+fs7Ozq6urra2tsbGx2NjY0dHRsbGx7Ozstra2ubm5x8fHycnJvr6+s7Ozrq6usLCwrKysubm5zc3NwMDAtra2sbGxra2toKCgubm5qqqqsrKyzc3NrKys3t7etra2tLS0tbW1ra2tqqqqqKioqqqqq6urs7OztbW1nJycq6urr6+vqqqqpaWlrq6upaWlsbGxs7OzlZWVs7OzmJiYmJiYpaWlnJycpqamkJCQqampqqqqp6enn5+fp6enmZmZ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////mZmZqampqampqKios7OzLCwsubm5uLi4q6ursrKysbGxtLS0tra2p6ens7OzqKiosLCws7OzqKiomZmZqampmJiYmJiYgICAoaGhlpaWiYmJaWlpqKiop6eno6Ojk5OToqKiuLi4kJCQqqqqnZ2dpqamsrKym5ubsrKyo6Ojpqamvb29pKSktbW1tbW1lZWVtLS0wsLC+fn53d3dzs7O39/f19fX6enptbW1u7u7ycnJr6+vwsLCr6+vsLCwvLy8tLS0xcXFpaWlxsbGsLCwsLCwsLCw39/fmJiYq6urtra2ra2tqKioxsbGqKiosbGxyMjIx8fHvb29ra2tv7+/r6+vtLS0wMDA2NjYqKiooqKisbGxv7+/pKSkrq6u0tLSt7e3tbW1sLCwvb29pqamqampu7u7srKytLS0ubm5r6+v4eHhnp6epKSkqampr6+voqKir6+vsrKyrq6urKysuLi4wcHBtra2u7u7t7e31dXVubm5s7OztbW1srKyj4+PoqKii4uLlZWVsrKyxMTEn5+furq6nJyczc3NoaGhxMTEtbW1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7u7w8PDrq6up6ensbGxpKSkoaGhoqKiubm5pqamsrKyt7e3wMDAr6+vr6+vt7e3mpqaurq6kZGRoaGhl5eXhoaGn5+fnp6enZ2dV1dXmJiYysrKqampo6OjlZWVpKSkq6urrq6usbGxqKiohoaGo6OjgoKCoqKiqqqql5eXmpqat7e39vb2oqKis7OzuLi4sLCw6enpysrK2dnZ19fX0dHRuLi45+fnx8fH29vb2trasLCwxcXFr6+vo6Oju7u7paWlvr6+zMzM19fXt7e3oKCgrq6uw8PDp6enx8fHoKCgs7OzuLi4sLCwr6+vrKysvLy81NTUuLi4t7e3sLCwwsLCqqqqr6+v09PTrq6uvr6+o6Ojs7OzsbGxrKyso6Oju7u7tra2q6ursbGxsbGxsbGxsbGxsrKy1NTU4ODg6urq2dnZu7u7qamps7OzvLy8ra2tnZ2dyMjIo6OjnJycubm5tLS0r6+vzc3Nurq6uLi4oqKit7e3srKypqamu7u7lZWVlZWVr6+voaGhq6urp6enwMDAtra2pqamqampoaGhzc3N////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ra2trq6uu7u7nZ2ds7OzxcXFqampsrKysbGxtbW1s7OzqampuLi4paWlsLCwqqqqoqKim5ubjIyMh4eHiIiIvLy8wcHBxsbGvr6+srKyp6enn5+flJSUnZ2du7u7mpqakZGRnZ2do6Ojm5ubp6enlZWVlZWVioqKpKSkoqKikpKSlJSUjIyMoKCglZWVy8vLu7u7vr6+xsbGv7+/zs7Oubm5xMTE2dnZ7+/vurq6uLi4zMzMqKioubm5tbW1sLCwvr6+ra2ttbW1ubm5tLS0wsLCvr6+tLS0qKiotLS0r6+vurq6tra2x8fHq6ursbGxpaWl2tratbW1np6esLCwv7+/sbGxpaWlvb29tLS0o6Ojtra2tbW1s7OzwMDAoqKiqqqqu7u7lZWVqqqq4eHh1NTUm5ubr6+vqKiotbW1sbGxurq6t7e3tbW1u7u7sbGxu7u7p6entbW1mpqatLS0nZ2dpaWltLS0vb29tLS0oaGhqampqKionp6emZmZuLi4wMDAnp6eo6OjwsLCrq6uwMDApqamoKCgnp6eoKCglZWV////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////qampsbGxra2tubm5mpqasLCwvb29s7Ozra2ttLS0tbW1u7u7uLi4urq6qqqqs7OzuLi4ra2toaGhi4uLtra2qKiowcHBoqKilpaWubm5pqamoaGhtLS0o6OjoKCgoKCgs7OzkpKSoKCglpaWqampk5OTlpaWnJycn5+fpKSkpKSkpqampaWlk5OTm5ublZWVnp6era2tv7+/v7+/zs7O1tbWvLy8wcHBvb29zc3NwsLCtbW1t7e3urq6tra2s7Ozt7e3pKSkhYWFzMzMyMjIu7u7rq6ut7e3mpqap6enyMjIt7e3srKyxMTEra2tubm5mJiYnJyc2dnZv7+/tra2srKyrq6ul5eXqqqqr6+vq6uruLi4rKyspaWlpqamqKiosrKyzc3NxsbG0NDQurq6qqqqqamptra2ra2tqqqqm5ubsrKy0tLSycnJqKiop6enmJiYq6urra2trq6utra2q6urubm5v7+/qKiosLCwt7e3urq6qamppqamsbGxpKSkqqqqurq6vLy8qqqqo6OjqamppqamsbGxj4+PpqammJiYpqam////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tbW1sbGxra2tsrKynZ2dt7e3pqamuLi4vb29rKysxMTExcXFwcHBt7e3ubm5oaGhlJSUp6enqqqqrq6uo6OjrKyswMDAq6urtbW1pKSkqKiopaWloqKiu7u7ubm5sLCwpaWlnp6enp6ejo6OkpKSi4uLv7+/oqKik5OTpaWll5eXo6Ojq6urk5OTmpqapaWlqqqqtLS03d3d2NjY5+fn/f39yMjIuLi4wMDAxsbGycnJt7e3wMDAsrKywMDAqKios7OznJycvLy8sLCwzMzMsLCwt7e3ra2tq6ursbGxpqamxcXFn5+fp6enp6entra2s7Oz1NTUsLCwra2ttLS0oqKiurq6pqamuLi4q6urtLS02travLy84+Pju7u7tra2xcXFysrKv7+/sLCwpKSkt7e3sbGxrq6ura2trKysrKysvLy8y8vLwMDAra2tqKios7Ozo6OjsLCwtbW1tLS0qKiouLi4sbGxrq6usrKyqKioqamppaWlq6urp6en0dHRtbW1vr6+q6urmJiYk5OTpKSkn5+fm5ubi4uLlpaWmJiYmpqa////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////sbGxpqamoqKisrKyt7e3uLi4qampubm5t7e3tbW1rq6us7Ozu7u7q6ururq6oKCgnJycqampqampnJyctbW1tra2paWli4uLqqqqoqKiqampsLCwpqamu7u7tra2rKyssbGxmZmZjY2NjY2Nk5OTnZ2dioqKj4+Pj4+PkJCQiIiImpqagoKCkpKSoKCgz8/PlJSU7Ozs4+Pjz8/P2NjY39/fqqqqnJycwMDAxcXFtbW1vr6+q6urvr6+vLy8t7e3tLS0rKysxMTEpaWlsLCwy8vLtLS0sbGxrKyssrKyuLi4tra2wsLCvLy8paWlq6ursbGxrq6us7Ozubm5tbW1rq6uqqqqrKysqqqqeXl5oqKira2tpqamoaGhwMDAjIyMtbW1oaGhqqqqr6+vnZ2du7u7xMTEwMDArq6upKSkwcHBvr6+r6+vs7OzsrKyurq6pqamsLCwpqamra2tq6ursLCwo6OjrKysq6urtbW1n5+fpqamrKysubm5oaGhx8fHqampoqKiqampl5eXlZWVj4+PkJCQl5eXmpqaoaGhm5ub9/f3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7e3tsLCwq6urp6ensbGxr6+vt7e3t7e3r6+vr6+voqKiqKiovr6+r6+vvLy8ubm5qqqqubm5sbGxpaWlpaWluLi4rKysl5eXr6+vqqqqpKSkqqqqurq6r6+vl5eXubm5v7+/ubm5l5eXmpqasLCwmZmZkZGRlJSUjY2NlpaWj4+Pl5eXj4+PuLi4nJyclJSUvLy8nZ2dp6ennJycx8fHycnJp6enj4+PoaGhnp6er6+v+vr6rKyspqamvr6+rq6urq6usrKyrKyskZGRra2trq6u0dHRra2tsrKysbGxnp6emZmZpaWlrKystbW1srKyqamprKystbW1v7+/vr6+vr6+r6+vq6urrq6un5+fqqqqvLy8lpaWsbGxzMzMwsLCnJycsbGxpKSkvb29q6uru7u7ubm5vLy80tLSu7u7qampoqKirKysnZ2dn5+fqKioqampo6Ojqqqqra2tr6+vrKyssbGxsrKypqamra2tpqams7OzpaWlq6urqKioqamppqammJiYp6enl5eXkpKSrKysoKCgnZ2dmpqaq6urnZ2dn5+f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////q6urpqamkJCQw8PDp6enq6urrq6utra2ra2tmpqaqqqqtLS0t7e3tLS0oaGhtLS0r6+vsrKysLCwubm5r6+vtLS0qqqqqampqKiotra2ra2toaGhysrKsLCwt7e3s7OzlpaWwcHBkZGRlJSUoKCgo6OjqqqqsLCwjY2Nr6+vrq6usrKysLCwsrKyiYmJmZmZmJiYp6enqampubm5ysrKn5+fsbGxpqamnp6eoKCgn5+fqqqqsLCwqqqqrq6utbW1v7+/tra2uLi4ra2tpqamy8vLyMjIrKyswsLCt7e3s7OzpKSko6OjrKysurq6vLy8l5eXu7u7ra2tt7e3srKyurq6tra2p6eno6OjsLCwr6+vurq6xMTErq6uoKCgubm5sLCwu7u72dnZuLi4t7e3ubm5r6+vra2trKysq6urtLS0tbW1r6+vo6Ojt7e3mJiYqqqqsbGxu7u7qqqqnp6esrKyqamptra2tbW1zMzMsbGxv7+/rq6urq6upaWlsbGxp6ensLCwra2tioqKnp6er6+vnZ2do6OjmJiYrq6unJycnZ2d////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tLS0ubm5wcHBvr6+pqamxcXFsrKyt7e3t7e3urq6tra2tLS0qqqqubm5tLS0p6enm5ubrq6ujIyMurq6ra2ttra2q6urpqammJiYmJiYtbW1uLi4ysrKsrKyq6urmZmZqqqqzs7Op6ensLCwnZ2doaGhqqqqx8fHtbW1sbGxrKysqqqqpKSktLS0tLS0nZ2dioqKnZ2dubm5m5ubkJCQubm5sLCwtra2sbGxq6urqampuLi4paWls7OzlZWVxMTEuLi4vb29uLi4s7Oztra2ysrKzs7O2NjYvLy8vb29srKyqqqqt7e3r6+voKCgrq6usrKytbW1oKCgtLS0qqqqr6+vtLS0p6enpaWloqKiq6urqqqqrq6uubm5m5ubuLi4rKysrKysrq6uzc3NrKystbW1tbW1srKys7OzoqKilpaWoaGhs7Ozv7+/sbGxqKio0NDQxsbGxcXFyMjI1NTUr6+vysrKvr6+u7u7sLCwuLi4tra2pKSko6OjqKiosrKyuLi4p6enpqamm5ububm5vLy8qKiooKCgpKSkpaWloqKim5ub////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4+PjuLi41NTUxMTEtra2qampuLi4s7Ozra2tubm5xsbGwcHBvLy8rq6upKSklpaWo6Ojrq6ura2ttbW1ra2tp6entLS0X19fv7+/srKypKSkrKysp6enp6ensrKyrq6uq6uroaGhn5+fqqqqrq6utbW1xMTEqqqqs7OztLS0wMDAoaGhtLS0ra2trKyssLCwtbW1q6urs7OztLS0tbW1r6+vvLy8vr6+srKysrKyxMTEv7+/vr6+tLS0tra2r6+vo6Ojv7+/tra2urq6vLy8qKio0NDQu7u7zc3NsbGxv7+/tra2v7+/rq6usbGxsLCwtbW1tbW1sLCwra2tqqqqtbW1nZ2dpaWlqqqqmJiYs7Ozqampr6+vqampqamppaWluLi4y8vLs7Ozrq6uuLi4t7e3sLCwsbGxrq6uv7+/u7u7vLy8xcXFsbGxm5ubqqqqpKSktra2rKysqKiora2tqqqquLi4mpqa1tbW29vbs7OztbW11dXVyMjImpqaqKiourq6m5ubpKSkq6urq6urqampvr6+qqqql5eXn5+fvb29qqqq2dnZ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////np6esLCwtLS0rKystra2sLCwp6enpKSkxMTEs7Ozubm5np6erq6uoaGhvLy8qampnp6et7e3srKynp6eqKiomZmZqampr6+vp6eno6OjsrKyr6+vq6urtbW1r6+vsrKytLS0tLS0rq6ur6+vp6enrKysqKioyMjIurq6oaGhra2ts7Ozrq6usbGxrKys0dHRsLCwsrKytLS01NTUwcHBq6urubm5wMDArq6uu7u7tLS0tbW1s7OzuLi4vLy8rq6urq6uvLy8srKyo6OjwMDAqqqqurq6+/v7rq6u2dnZvb29tbW1tbW1tra2pqamq6ursrKyr6+vsbGxp6ens7Ozr6+voaGhra2trKysrKysurq6sLCwoqKiu7u7x8fHycnJurq6sLCwwsLCvr6+xsbGurq6tbW1n5+fqqqqr6+vrq6uu7u73Nzc1tbWmZmZtbW1urq6nJycvLy80dHRtLS0srKyurq619fX5ubmycnJ7u7ux8fHwsLCt7e3q6urz8/PpaWlnZ2dnp6eo6Ojm5ubnZ2dpqamt7e3mZmZtLS0xsbG2dnZ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////t7e3u7u7tLS0x8fHxsbGw8PDn5+fqampsrKyw8PDr6+vq6urq6urrKyssrKyq6urt7e3xsbGt7e3pKSkmZmZsrKyrKystbW1pKSkw8PDpKSkr6+vvLy8rKyssrKysrKyrKyssLCwrq6umJiYq6ursbGxt7e3n5+fp6entbW1tra2pKSksLCwsbGxw8PDtra2qampvb29paWlo6Ojs7OzvLy8wsLCp6ent7e3urq6tra2vb29tbW1sbGxtra2wcHBtbW1srKyzc3NkZGRr6+vuLi4rKysvLy8////vLy8ycnJt7e3lpaWw8PDvr6+lpaW0NDQs7Ozpqam0dHRvLy8u7u7t7e3mpqaoqKit7e3tra2pKSksLCwvLy8urq6qKiourq6zs7OycnJsrKys7Ozu7u7u7u7t7e31NTUvr6+ycnJx8fHrq6uvb29qamplpaWxMTEra2tqampm5ubtLS0x8fHrKystbW1zMzMtbW1xcXFqqqqra2txMTEtLS0v7+/pKSkoqKisbGxoqKioKCgnp6eqampl5eXoqKikJCQycnJp6en////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zc3N0tLSzs7OwsLCxsbGu7u7srKysLCwrq6un5+fsbGxuLi4nZ2dtbW1t7e3wsLCp6enqqqqra2tsLCwp6enwMDAtLS0srKyr6+vv7+/x8fHs7Ozrq6utra2u7u7rKyswcHBsLCwmJiYtLS0vb29q6urrq6usLCwurq6srKyo6OjsrKytbW1srKynZ2dxMTEt7e3rq6upqamt7e3yMjIzs7Ourq6t7e3vLy8xcXFwMDAvb29qampubm5oqKiurq6w8PDvr6+vb29z8/Py8vLysrKtra2yMjIu7u7vLy8v7+/lpaWv7+/wcHBtra2pKSksbGxuLi4pqamqqqqmpqa0tLSpqamtLS0ra2tra2tra2tra2trq6upaWlra2tqKiovLy8t7e3q6uru7u7urq6sLCwysrKqKioubm5paWltbW1uLi4p6ensbGxrKysnZ2dvLy8nZ2dqKiorq6uvLy8uLi4ra2ttra2t7e3o6OjzMzMrKysqampoqKis7Ozurq6ysrK1dXVqKiopKSkpqamu7u7sbGx1NTUzc3NoqKinp6ehoaG////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////nJycxMTE0dHR0NDQpKSktbW1wcHBuLi4yMjIx8fHx8fHra2tyMjIxMTExcXFqampr6+vtLS0t7e3rq6uuLi4urq6ubm5q6uruLi4r6+vqKiosbGxtLS0q6urp6enwsLCv7+/s7OztbW1tLS0vLy8t7e3ubm5paWlq6urq6urqamprKysubm5srKyvr6+rq6uvr6+t7e3tra2u7u7urq6zs7Ovb29rKyssrKywMDAs7Ozu7u7wcHBs7Ozurq6qamplJSUlZWVrq6ura2tra2ts7Ozra2tnp6era2tp6enwMDAx8fHrKyssrKyq6urrq6utLS0x8fHtbW1sLCwuLi4tLS0paWlurq6tra2tbW1w8PDv7+/urq6vLy8w8PDzMzMrq6uq6urp6envr6+y8vLs7Ozzs7OqqqqwMDAq6ursbGxqKiosrKyqKiora2tuLi4rKyswcHBsrKyr6+vr6+vra2trq6uwsLCzs7Ora2tsrKysLCww8PDsLCwpKSkpKSkqqqqrKyslpaW2dnZ09PTrq6uq6urmpqao6Ojra2toqKi8PDw////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4+PjxcXFwcHBxsbGz8/PwcHBuLi4srKytra2zc3NwMDAtra2qampvLy8tra2urq6tLS0qqqqpKSks7Ozo6Ojt7e3uLi43d3dvLy8s7Ozt7e3rq6uv7+/sLCwpaWlsLCwxMTExcXFq6urnZ2dr6+vs7Ozs7Oztra2uLi4qqqqsbGxs7OzpKSkra2tpaWltLS0s7OzsbGxvb29o6OjtLS0u7u7tra2srKyvb29urq6wMDAtLS0q6urpKSksbGxt7e3qamptra2vr6+o6OjvLy8r6+vnp6era2tnp6e2NjYqqqqvLy8xMTEwcHBsLCwpaWlt7e3p6entLS0u7u7vLy8tra2rq6uwMDAwcHB0NDQ2NjY1NTUysrKyMjIyMjI1tbW09PTycnJwsLCuLi4enp6qamprKysxcXFw8PDvb2919fXvLy8w8PDr6+vqqqqra2txMTEubm5paWlra2tsLCws7OzrKysrKyswcHBs7OzpaWlvLy8tLS0rKyssLCwpKSksLCwsLCwsrKyv7+/qampnZ2dpqamlpaWoqKik5OTvLy8ubm5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////y8vL0tLS2dnZubm5xMTEysrKsLCwsrKyuLi4xcXFv7+/vr6+rKyst7e3w8PDzs7OuLi4o6OjsLCwvb29s7Ozrq6uuLi4tra2wMDA3t7ewMDAtra2wsLCyMjInZ2dra2tsbGxu7u7rKyssbGxtra2r6+vs7Ozu7u7vLy8xcXFtbW1tLS0s7OzsbGxwcHBu7u7u7u739/fwMDAyMjItra2uLi4tLS0u7u7ra2ttbW1yMjIubm5tLS0tbW1t7e3wcHBvLy8t7e3pKSkxMTEtbW1v7+/19fXrKyst7e3sLCwt7e3tra2qampr6+vtra2u7u7wsLCra2tsbGxra2txsbGvb29qamp19fX2tra2dnZyMjItLS0np6epKSkoaGhzc3Nt7e3s7Ozvr6+q6urt7e3uLi4vr6+zs7Ovr6+tbW17Ozsubm5uLi4n5+fra2tvr6+sLCwtLS0vLy8p6ensrKyrq6uqamptra2srKyoaGhsLCwkZGR4+Pjra2tv7+/qampmpqapKSkysrKx8fHsLCwwcHBpqamoKCgubm5paWlqampv7+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zc3N0NDQyMjIyMjItbW1zc3Ntra2vLy8x8fHvb29w8PDsbGxwsLCwMDAwcHBy8vLvLy8sbGxvr6+p6enwcHBwMDAra2tu7u7xcXF7e3twMDAubm5urq6o6Ojrq6ur6+vvb29ubm5u7u7ubm5nJycpqamubm5ubm5vr6+u7u7vb29rq6uuLi4r6+vrq6uubm52dnZycnJurq6qampsLCwsLCwqampsrKytLS0q6urnp6epqamnZ2dpqamvr6+xsbGtra2sbGxlpaWqqqquLi4srKyrKyswMDAt7e3p6eno6OjjY2NoaGhwsLCx8fHwMDAoqKio6Ojtra20NDQrKysuLi4ubm5zMzMwsLCxcXFoaGhrq6uuLi4ra2tmpqar6+voaGhz8/Pr6+vsbGxy8vLsrKyoKCgtra2oKCgtra2wsLCqKioq6urp6envb29sLCwqampyMjItLS0sbGxrq6utbW1oaGhqKios7Oznp6enp6evLy83d3dxsbGr6+voaGhoaGhr6+vrKyso6OjpKSkkJCQqKiow8PDoaGhq6uroaGhs7Oz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////uLi4Q0ND1NTUz8/PqampxsbGysrK1NTUxcXFs7Ozzc3NtbW1wsLCyMjIsLCwzMzMubm5ra2tubm5vb29z8/Ptra2urq6v7+/yMjIwMDAvb29w8PDw8PDvr6+uLi4vr6+wMDAsbGxuLi4urq6vr6+q6urt7e3rq6uvb29sLCwubm5tra2v7+/wsLCuLi4yMjI29vb0NDQs7OztLS0u7u7tLS0tLS0t7e3urq6vr6+uLi4v7+/wMDAwcHBu7u7q6uru7u7q6uruLi4tra2tbW1o6Ojtra2v7+/rKystra2srKytra2t7e3w8PDsbGxt7e3q6urqqqquLi4ubm5srKyv7+/sLCwwcHBurq6oaGhs7OznJycvLy8uLi4p6ensrKynJycpaWlysrKwsLCwMDAyMjIw8PDwsLCw8PDuLi4qKioqqqqubm5t7e3tra2xsbGp6entbW1pKSkubm5u7u7q6urq6urtbW1vb29y8vLq6urpKSksbGxvLy8rKyskJCQra2tnp6eu7u7sLCwoKCgpqamtra2lpaWmJiYqKioqKior6+v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7OzycnJwMDA0dHRysrKyMjIvb29urq6w8PDzs7OtbW1sbGxtra2zMzMubm5ubm5wsLCysrKyMjIvb29tbW1vb29uLi4xcXFvr6+vr6+xMTEw8PDw8PD3t7eyMjIxcXFra2turq6u7u7xMTEq6urrKystbW1tra2ubm5tra2t7e3wcHBwMDAxMTE6enp09PT////wsLCsbGxtra2rKysubm5urq6vLy8qqqqurq6u7u7wcHBu7u7t7e3tbW1rq6utra2wMDAsLCwp6enpaWlqKiovLy8uLi4uLi4uLi4pqamyMjIvb29vb2919fXyMjIt7e3paWltra2pqamm5ubra2txMTEtra2ra2tp6enpqamubm5urq6rKysrq6uoqKira2ttra2n5+fvLy8tLS0qqqqr6+vtbW1u7u7uLi4tLS0p6entLS0u7u7t7e3ysrKs7Ozvb29s7OzrKyssLCwpKSkqqqqxsbGpKSkr6+vsrKyqampra2tzc3Nn5+flZWVtLS0s7OzpKSkoaGhpKSkrq6uwcHBmZmZurq6p6enrq6uoqKi////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+/wMDAurq6xcXFx8fHxMTEysrKs7Ozt7e3zc3Nvr6+tbW1vr6+wcHBz8/Pvb29xcXFx8fHvb29ycnJurq6vr6+vLy8v7+/wcHBv7+/vr6+tLS0vr6+wMDAu7u7tbW1v7+/u7u7wMDAoKCgtbW1qqqqra2tpqamra2tt7e3sLCwvb29ubm5ysrKzMzMvb29uLi4urq6sbGxlZWVt7e3tLS0vr6+vb29t7e3s7OztbW1srKyxcXFu7u7tbW1r6+vyMjIrq6uuLi4rKysvLy8s7Ozs7Ozu7u7vLy8xsbGt7e3tra2v7+/sbGxxcXFu7u7wcHBr6+vu7u7m5ubw8PDubm5vr6+ycnJw8PDubm5sbGxpaWlsLCwr6+vq6urrq6uurq6vr6+vLy8rq6usbGxsbGxo6Ojl5eXrKysr6+v19fXw8PDurq6tLS0rKystLS0paWlvLy8rq6uwMDAqampvLy8rq6uvr6+rq6uqampoaGhoqKiqqqqo6OjoaGhm5ubp6enp6enpaWlnZ2doaGhwcHBsrKyrKyspqampKSksLCwq6ur////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5OTkycnJx8fHv7+/u7u7vLy8v7+/u7u7ubm5wMDA09PTx8fHxsbGn5+fra2twsLCt7e3y8vLwcHBtra2w8PDwcHBxcXFtra2wcHBycnJvb29u7u7ubm5wcHBu7u7w8PDurq6ysrKsrKyuLi4t7e3ubm5v7+/ubm5tra2sbGxvb29u7u7t7e3tra2tbW1wMDAvr6+s7Ozu7u7wMDArq6us7OzsbGxubm5ubm5t7e3tbW1urq6vLy8vr6+sbGxr6+vyMjI1dXVu7u7tLS0uLi4ubm5vLy8rq6utra2w8PDwMDAtra2vLy8v7+/ubm5xcXFwMDA3d3dra2tzMzMwMDAqamptbW1uLi4t7e3tra2tLS0zc3NxcXFrKysrKysqKiora2turq6o6Ojr6+vq6urtra2sLCwrq6um5ubtbW1rq6uqamppaWlqqqqvLy8ubm5np6es7OztLS0vb29mZmZtLS0xMTEvr6+qKiovr6+t7e3srKyoqKipKSkq6uroqKit7e3qqqqtra2qqqqoKCgq6urra2tyMjI4ODgw8PDq6ury8vLsrKy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tra2vLy8w8PDubm5r6+vv7+/u7u7wcHBubm5wcHBycnJxsbGs7OzwcHBvr6+wcHBwcHBxsbGwsLCx8fHw8PDwsLCwcHBvb29wMDAvr6+vLy8u7u7v7+/r6+vsrKywMDAtra2v7+/s7OzuLi4wcHBvb29vLy8urq6ubm5tLS0ubm5r6+vvr6+q6uruLi4tbW1wsLCs7Ozqqqqu7u7vr6+t7e3rKyss7OzrKyss7Ozvb29rq6ut7e3urq6s7Ozurq6uLi4w8PDysrKw8PDtra2rKyst7e3qKiovb29tLS0tLS0ubm5v7+/xcXFxsbGsbGxs7OzvLy8z8/Pt7e3uLi4yMjIra2tuLi4r6+vt7e3ycnJrKyssrKyoaGhtLS0vr6+sLCwr6+voaGhrq6ut7e3kpKStbW1ra2turq6q6ursrKytLS0lJSUoaGhvb29sLCwy8vLqqqqrKyso6OjuLi4ycnJpaWlrq6uqqqqtbW1o6OjuLi4u7u7q6urr6+vra2t19fXycnJpqamo6Ojn5+f39/fzc3N1tbW0NDQ0NDQtLS0vr6+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xsbGwsLCuLi4xsbGycnJtLS0vb29x8fHxMTEzc3N0dHRtbW1s7Ozvr6+x8fHuLi4vr6+tra2u7u7wsLCvr6+v7+/wsLCwsLCvr6+tLS0xsbGwsLCubm5wcHBv7+/rKystbW1v7+/urq6ubm5u7u7tbW1vb29sLCw0NDQsLCwsrKyr6+vt7e3oaGhs7OzxsbGvr6+srKyq6uro6OjtLS0xsbGyMjIt7e3np6ejIyMjIyMpKSktra2u7u7xcXFvLy8ra2tv7+/xMTE0NDQx8fHysrKsrKyrKysx8fHxsbG2dnZvb290dHRxsbGuLi4vLy809PTv7+/vb29w8PDtbW1t7e3v7+/tLS0uLi4vb29urq6sLCwra2tqampsLCwsrKyvr6+uLi4vr6+t7e3s7OzsbGxs7OzpKSksbGxo6Ojvr6+xcXFpKSkoKCgra2toqKioKCgtLS0pqam0tLSnp6etLS0qKiosrKypqamoaGhrKysoKCgqKio2dnZo6Ojp6enxcXFpKSknp6esbGxl5eXuLi4tLS0qqqqwsLC2NjYzc3Nurq6////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zc3NxMTEw8PDsbGxwMDAvr6+v7+/ubm5ubm5yMjI09PT1NTUxsbGx8fHwsLCv7+/0tLSvb29wMDAz8/PtbW1qampwsLCw8PDtra2ubm5urq6uLi4vr6+wMDAtLS0sLCwubm5vr6+v7+/q6uru7u7vb29tbW1wsLCqqqqubm5u7u7xMTEsLCwrKyss7Ozubm5w8PDwMDAvb29wMDAsrKyubm5xsbGtbW1np6eoaGhjIyMODg4r6+vra2tvr6+t7e3wsLCxsbGra2tzs7Ow8PD29vbwMDAx8fHvr6+1tbWtLS0t7e3zc3N1NTU0tLSu7u7tLS0xMTEvLy8wsLCwsLC19fXsLCws7OzwcHBrq6uq6urrKyswsLCubm5qampt7e3r6+vrq6usbGxr6+vwMDAr6+vt7e3sLCwqqqqpKSkqampuLi4zc3NyMjItra2srKyxMTEsbGxq6urxsbGr6+vx8fHmJiYtra2r6+voqKisrKyuLi4x8fHt7e3tra2l5eXn5+fsLCwqKioqqqqq6urs7OzwcHB+/v7vb29wcHByMjIpKSk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yMjIxcXF0NDQwcHBzs7Ow8PDt7e3rq6uy8vLurq6urq60NDQuLi4ysrKu7u7xMTEzc3Nx8fHvr6+19fXwcHBvb29xcXFvr6+tra2v7+/ubm5urq6wsLCuLi4r6+vsLCwxsbGtra2tra2ubm5tbW1ubm5rKystra2t7e3urq6pqamurq6urq6tLS0xMTEvb29wsLCrq6uvb29x8fHwcHBubm5t7e3qqqqubm5ra2thoaGv7+/pKSkurq6vb295eXl0NDQ4uLixMTEy8vLx8fHzMzMzs7Oy8vLzMzMsrKytra2xsbGv7+/sbGxurq6vr6+u7u7+vr6ycnJz8/PxMTEsrKyxcXFx8fHyMjIwcHBt7e3vb29qqqqsbGxuLi4vb29r6+vra2ttra2r6+vs7OzsbGxra2tqKiovb29ubm5vr6+u7u7r6+vqampsLCwmpqayMjIpqamoqKi0dHRrKyssrKyrKysqKiooaGhq6urxsbGnp6epqamtLS0np6enJycwsLCpaWloaGhqqqqnJycxcXFuLi4vr6+wMDAjY2Nurq6paWl0NDQ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0NDQsLCww8PDw8PDw8PDw8PDvr6+u7u7wsLCvr6+wsLCzc3Nz8/P0tLS0dHRzc3N6enpvr6+wMDAy8vLvr6+u7u7s7OzycnJuLi4tbW1wsLCq6urvLy8wcHBuLi4tLS0vr6+yMjIra2tvb29urq6tbW1pKSku7u7wMDAtbW1uLi4rq6utbW1v7+/ra2tsLCwvb29v7+/wsLCu7u7w8PDhYWFv7+/tLS0sLCwoaGhurq6rKysu7u7urq6tbW14uLi6urq0dHR09PTy8vLz8/P1dXVv7+/zc3N19fX3d3dwcHBeXl5tbW1y8vLs7OzvLy8ubm5rKyss7Ozvb29vLy8vb29uLi4vr6+zc3NysrKysrKra2tra2tp6ensrKyrKystbW1tra2qqqqurq6sbGxtra2sLCwtbW1vr6+ra2twMDAs7OzyMjIs7OzxMTEv7+/wcHBqKiomJiYy8vLr6+vsbGxsbGxqKiovr6+q6urpqamoqKipqamoqKiubm5pqamp6entbW1qqqqrq6uoqKivr6+o6OjpaWlk5OTkZGR2NjY19fX////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7u7wMDAu7u7zs7Oz8/PxMTExMTEwsLCwsLCrq6uv7+/ycnJt7e3y8vLwcHBzs7O1dXV1dXVzc3NuLi4xcXFxsbGzc3Nurq6paWlwMDAxMTEvr6+ubm5tra2sbGxuLi4wMDAs7Ozubm5ra2tsLCwra2tx8fHu7u7urq6w8PDtbW1t7e3q6urp6ensLCwtbW1vr6+wcHBycnJwcHBvLy8KioqkJCQlZWVra2tioqKwMDAxMTEzs7OwsLCvr6+tbW1t7e3zs7OwcHBzMzMx8fHx8fHx8fHqampxMTE29vb0NDQwcHB3NzcxsbG9fX1urq6wMDAvb29vr6+yMjIubm54ODgt7e3w8PDoaGhubm5v7+/q6uruLi4vb29s7OzrKysuLi4s7Ozs7OzsLCwg4ODtra2vb29vr6+tbW1uLi4wsLCtLS0t7e3oKCgysrK19fX0dHRpKSktLS0ra2tu7u7mJiYt7e3pqamra2tpaWlpaWllpaWnp6et7e3rKysrKyspKSks7Ozl5eXuLi4xsbGnJycqKionZ2dmpqaqampoqKioqKi////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////29vbw8PDy8vLycnJwMDAwsLCubm5v7+/urq6vr6+0tLSzMzMxsbGzMzMubm5xcXFyMjI09PTy8vL8fHxvb29wsLCubm5tbW1tra2vb29w8PDra2tuLi4uLi4uLi4vr6+vLy8t7e3u7u7yMjIs7Ozvr6+wcHBw8PDwMDAtbW1vLy829vbwsLCurq6vr6+wMDAuLi45OTky8vLt7e3vLy8sLCwuLi4rq6uIiIinZ2djo6OsLCwvLy84+Pj2NjYy8vLx8fHzMzM+vr6yMjIwcHB2NjY0dHR2NjYwsLC2NjYy8vL1NTU3NzczMzMxsbGvLy8urq6vLy8tLS0sLCwtbW1ra2tubm5rq6utbW1uLi4tbW1q6urtra2tbW1w8PDsbGxuLi4tLS0rq6ubm5uU1NTt7e3sLCwp6enqKiooqKisbGxxMTEtra2x8fH4ODgz8/PvLy8srKyxcXFq6urp6enpqamqqqqpaWltLS0q6urubm5ra2trq6upaWloaGhpqamr6+vqKiourq6oKCgxMTEvLy8q6uroKCgm5ubj4+Pmpqaqqqqmpqa////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8PD09PTx8fH3Nzcy8vLxcXFysrKubm5wMDAy8vLxcXFxMTE0dHR0dHRx8fHsLCw0tLS0tLSzMzM9/f3wMDA0NDQwsLCyMjIycnJvr6+ysrKwMDAwcHBo6Oju7u7xcXFw8PDvb29wcHBurq6tra2wsLCtra2t7e3wcHBqKioubm5s7Ozt7e3vb29o6OjsbGxwcHBubm5u7u709PTwMDAvLy8urq6uLi4nZ2dPj4+kZGRy8vLzc3Nr6+v2dnZ19fX39/f5OTk09PT6enpu7u7ysrKz8/P0tLSsrKyv7+/wcHBx8fH2dnZzc3N7u7u1NTUwcHBzs7Otra2s7Oztra2vr6+urq6tra2urq6rq6uwsLCsrKyr6+vtbW1ra2tsbGxuLi4vLy8vr6+tra2qampo6Ojs7OztLS0zMzMrq6usbGxrq6uvLy8yMjIvb29xMTEt7e3tbW1qKiopaWlsrKypaWll5eXoqKiqqqqo6Ojm5ubrKysnJycm5ubpKSkpqamra2trq6utbW1w8PDk5OTxMTEsbGxpKSkn5+fo6OjmJiYsbGx9/f3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////vLy8zc3Nw8PD3t7exsbG0NDQwMDAvb29r6+vzs7Oz8/PyMjIx8fH09PTxsbGx8fHzs7O8/Pz7OzszMzMzs7Oy8vLzc3Nubm5wMDAxsbGvr6+vb29s7Ozvr6+vb29wsLCsLCwt7e3wMDAsbGx3NzcsbGxvr6+tbW1tLS0rKysuLi4s7Ozv7+/t7e3tra2uLi4vb29tbW1xMTEv7+/wMDAw8PDxsbG3t7eeXl5pKSkubm5r6+vw8PDxMTE3Nzc19fXycnJysrK6Ojo19fXzc3N0dHRzMzMysrK1dXV1dXV6urq4uLi1tbW29vbysrKtra29/f3urq6t7e3uLi4xMTEvr6+xcXFsbGxqampx8fHt7e3srKytra2tra2srKyt7e3uLi4tLS0vr6+tbW1sbGxt7e3s7Ozs7Ozubm5u7u7pKSksbGxl5eXpaWlwsLC1NTUvLy8srKyu7u7r6+vpaWlsbGxwMDAtra2qamps7OzpaWlq6urr6+vsLCwsrKyn5+foaGhsLCwp6envLy8q6urj4+PlJSUpqamnp6empqarKysvr6+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7OzswsLC0NDQzc3NycnJxsbGxcXFzc3NxcXFzMzMzs7Ow8PD09PT09PTxsbGycnJwsLC19fX1dXVzMzMx8fHycnJv7+/vLy8xMTExcXFvLy8wsLCu7u7wsLCvLy8ubm5sLCwvLy8tra2ubm5rq6utLS0sbGxsbGxr6+v1tbWwcHBuLi4wcHBrKysr6+vtbW1w8PDxcXFxMTEx8fHzMzMw8PDu7u7y8vLzc3NycnJMjIylZWVzs7OvLy8xMTEzc3Nzs7O39/f1tbWubm529vb19fX5ubm4+Pj4ODg/f3909PT6Ojo7Ozs6urq1dXV0NDQ7+/v39/f3Nzc0tLS3t7euLi4uLi4uLi4wsLCtbW1rKysy8vLtLS0qampsrKyo6Ojubm5uLi4u7u7urq6wcHBqKiop6enu7u7rKyslpaWqKios7Ozpqampqamubm5u7u7n5+fs7OzsLCwx8fHs7OzrKyspaWlwcHBt7e3p6ensrKysrKyra2tqqqqr6+vrKyssLCwwMDAtra2s7OzoaGhqKioo6Ojm5ublpaWn5+fm5ubs7OzpKSk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1dXVwMDAxcXFw8PD09PTxMTEzs7O0dHRxsbGzc3NwcHBxsbGxsbGu7u7vLy8v7+/uLi4zMzM1dXV6urqycnJx8fHwMDAv7+/xsbGwsLCwMDAwMDAxMTEu7u7tra2vr6+v7+/rq6utbW1urq6wsLCuLi4vr6+wMDArKysuLi4tLS0srKyvb29wMDAu7u7tbW1r6+vwcHByMjIvb29v7+/5+fnysrKxsbG0dHRsbGxw8PDDQ0NWlpaubm5vLy81NTU1tbW7e3t2dnZ0dHR5OTk09PTycnJ/f39wcHB5eXl39/f3t7e1dXV3d3d+Pj46enp0dHR8fHxsLCwrq6utLS0v7+/vLy8uLi4ysrKwsLCtbW1xcXFwcHBwsLCuLi4ycnJrKysvLy8sLCwt7e3tra2uLi4uLi4qqqqoaGhqKiorKysw8PDsbGxx8fHs7OztLS0q6urqKioqampwMDAtbW1t7e3r6+v09PTqamprq6upKSkqqqqw8PDtbW1q6urtra2oKCgpqamsrKyyMjIpKSkqampq6uroqKio6Ojk5OTqqqqm5ubra2t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXFysrKzMzMzMzMzc3Nv7+/zc3NyMjIycnJubm5xMTEvLy8xcXFwcHB1NTUt7e3urq6xcXFgoKCy8vLw8PDxcXFw8PDwsLCxcXFvLy8tbW1wMDAvLy8tLS0q6urxcXFu7u7sLCwq6urvLy8xcXFtbW1tLS0ubm5v7+/ubm5sLCwtbW1tbW1s7OzsLCwsLCwy8vLxMTExcXFxsbGyMjIwMDAwsLCwsLC19fXycnJvr6+qqqqWFhYt7e3p6enx8fH2tra0dHR3t7e6enp4ODgsbGxwcHBxsbGysrK29vb3d3d8PDw0dHR09PT8vLy1NTU1NTUyMjIzMzMxsbGyMjIt7e3q6uruLi4vb29tLS0tbW1srKys7Ozn5+fs7OzvLy8rq6uurq6s7Ozt7e3urq6rq6uuLi4paWlsLCwqqqqo6Ojs7Ozrq6ura2tvLy8tbW1rKysq6urp6entbW1ra2ttLS0sbGxnp6es7Ozpqamr6+vrKysrKysra2ttbW1p6ensLCwsLCwrKysubm5oaGhrq6upqamr6+vl5eXlZWVm5ubqqqqrq6u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yMjI0NDQ0NDQx8fHw8PD1dXVycnJurq6v7+/wMDAx8fHy8vLxMTE2travLy80tLSsbGxwsLCycnJx8fHwsLCxcXFzMzMu7u7u7u7ysrKvr6+wsLCw8PDw8PDwsLCuLi4tbW1urq6s7OztbW1tbW1vLy8zMzMwcHBurq6t7e3tra2tra2uLi4sLCwtra2ycnJubm5urq6vr6+0tLSx8fHx8fHz8/Pu7u7x8fHwcHBycnJ19fXubm5yMjIwsLCycnJy8vL7Ozs9fX1xcXF1tbWuLi4tra2urq6zMzMzc3NysrK6urqz8/P8fHx4+Pj6Ojo3d3d1dXV1NTUyMjIt7e3urq6rKyssbGxuLi4uLi4vLy8tbW1tLS0rq6uqqqqr6+vsbGxtra2tbW1u7u7vb29uLi4t7e3uLi4tra2sLCwu7u7p6en2trazMzMx8fHtbW1srKywsLCn5+fubm5rKys1tbWsbGxrKyss7Ozrq6urq6uoaGhrKyswsLCqqqqqqqqpaWlwMDAv7+/o6OjoKCgrq6usbGxoqKinp6eqKiopaWlmZmZ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5OTkpaWlx8fHycnJxcXFr6+vzMzM0dHR2NjYycnJx8fHxMTEzMzMzMzMwcHBwsLCtLS0wcHBk5OTvLy80NDQw8PDvr6+xcXFvr6+vb29w8PDwcHB4+Pj2dnZtLS0qqqqvb29wcHBv7+/vr6+ubm5v7+/wMDArKyswMDAu7u7w8PDqampsLCwra2twsLCs7Ozurq6tra2t7e3wcHBsrKytLS0vr6+qamp0tLSx8fH4eHhwcHB2NjYzc3N8PDwvr6+w8PD3Nzc0dHR/f391NTU2NjY4+Pjq6ur/f395eXlxMTE0NDQ5ubm/Pz8zMzM3t7e29vb2NjY////y8vLx8fHsrKyvb29tbW1p6envr6+s7OzrKysqamptra2s7OzpqamqqqqsrKytra2tbW1tLS0sbGxl5eXv7+/sbGxu7u7uLi4tLS0s7OzycnJysrKvb29ysrKoKCgx8fHj4+PwcHBsbGx9PT0srKyra2tr6+vx8fHsbGxxsbGqKiora2tra2tqqqqurq6tLS0r6+vu7u7srKypqamsrKyoKCgra2tsbGxpKSkqamp////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wMDAxsbGxcXFxMTEysrKz8/P09PT1dXVzs7O/v7+39/f////7u7ux8fHuLi4srKyu7u7mJiYwcHBwcHBwMDAxMTEvLy8wcHBuLi4uLi4vLy8wcHBtLS0yMjIurq6tbW1t7e3x8fHuLi4vr6+w8PDrq6utLS0ysrKsrKyubm5vr6+ubm5vLy8uLi4m5ubsLCwxsbGtra2wsLCycnJwMDAzc3NxsbGysrK0dHRz8/P1NTUycnJ0dHR39/fy8vL09PTzs7OxMTE5ubmtLS0////2tra0tLSycnJysrKy8vLyMjI1tbWx8fH0tLSxsbGycnJxsbG1tbW2tra4ODguLi4wMDAtra2uLi4ubm5r6+vwsLCurq6q6urr6+vo6Ojr6+vurq6sLCwwcHBurq6vb29v7+/uLi4vb29sLCwubm5vb29ubm5qKiop6enr6+vtbW1qKioxsbGuLi4tLS0sbGxs7Ozubm55OTkzMzMqqqqrq6uq6urs7Oztra2ra2tp6enra2tsrKytLS0sbGxt7e3p6enubm5vLy8oaGho6Ojp6enoaGhpKSk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ycnJwcHB29vbxMTExcXFxsbGzs7Ozs7O1tbWzc3N8fHxysrK6enpysrKycnJwcHBzMzMysrKubm5yMjIyMjIxcXFu7u7w8PDwMDAvLy8x8fHvb29vLy8t7e3tra2s7Oztra2vb29wMDAubm5wcHBubm5zs7O0NDQx8fHr6+vs7OzvLy80tLSsrKyyMjIvLy8q6ursbGxvr6+ycnJtLS0v7+/tLS0zs7O1tbW3t7ew8PD1tbWyMjI0NDQzs7Ox8fHxcXF1NTUxcXF9PT009PTx8fHwsLCyMjIvb29xcXFxMTE/v7+s7Oz7e3t19fXurq6uLi4vb29yMjI5eXl3d3du7u75eXlr6+vrq6ura2ts7OzsrKyrKyst7e3paWlqKiotbW1vb29srKywsLCr6+vsbGxsrKyp6enw8PDvLy8sLCwuLi4tbW1tra2tra2qampoqKira2to6Ojs7OzyMjIwcHBy8vLuLi4xsbGvLy8vLy8sLCwtbW1u7u7sbGxvLy8w8PDuLi4wsLCqqqqoaGhv7+/sLCwr6+vrq6uqqqqqKiooaGh3t7e////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3NzcwMDAxsbGycnJ09PTx8fHwMDA1tbWyMjI1NTU1dXV1dXVz8/PysrK2NjY1tbWzs7OxsbGx8fHx8fHurq6xcXFyMjIwcHByMjIwcHBzs7OxsbGxMTEw8PDvLy8vLy8wsLCvr6+u7u7wsLCq6ururq6uLi4wMDAwcHBvr6+z8/PsrKysrKyvb29sLCwxcXFsbGxu7u7vb29s7Ozv7+/uLi4uLi4y8vLtbW14+Pj0NDQxsbGy8vL6+vr2NjY8fHxysrK0tLS6enp4ODgt7e3yMjIw8PDy8vLwMDAy8vLy8vLz8/Pw8PD6enpp6enmJiYvLy8rq6u0NDQycnJwsLCy8vL0NDQ2trawMDApqamuLi4ra2tsrKyrq6uqampu7u7ra2ttbW1rKyssbGxvLy8u7u7r6+vrq6uuLi4vr6+srKyubm5vLy8vb29t7e3tra20dHR19fXtra2tra2uLi4yMjI09PTsbGx2dnZ0NDQyMjIzMzMsbGxkJCQra2tqqqqpqamp6enqqqqsbGxp6entLS0p6enuLi4mZmZurq6srKynZ2dr6+v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/PzysrKx8fHysrKwMDAx8fHyMjIy8vLzMzMz8/P0tLSy8vL0NDQ19fXubm529vb1NTUycnJv7+/ycnJvLy87e3twsLCw8PDuLi46+vryMjIwMDAvb29wcHBw8PDxMTExsbGvb29vr6+t7e3wsLCvr6+u7u7yMjIw8PDvb29vLy8vLy8wcHBvLy8vb29sbGxs7Ozx8fHvb29v7+/w8PDwMDAyMjIrq6uxcXFv7+/wcHBxcXFxcXFzc3Ntra2xsbG1tbW6enp5eXlz8/P0dHRx8fHwsLC0dHRt7e3tbW1sbGxqqqqurq6urq6m5ubrKysvb296+vrrKysvr6+wMDAvr6+vb29vr6+5ubmrq6ut7e3qqqqtLS0srKysrKyu7u7tLS0rq6un5+ftra2u7u7tbW1urq6ra2ttLS0ra2tsLCws7Ozqqqqtra2uLi45OTkubm5yMjIw8PDx8fHtLS0ra2trq6un5+fwMDAtLS0ycnJs7Ozzs7Ovb29srKysrKyu7u7tra2ra2tqKiorKystLS0tLS0ubm5pKSksLCwsrKyoqKirq6u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1dXVzMzMv7+/xMTE2dnZyMjIyMjIvr6+zc3Nzc3N3t7ezMzM0dHR3t7ezc3NyMjIycnJw8PD0NDQ4ODg3d3d39/f////xMTEzMzMwcHBx8fHyMjIwsLCycnJxsbGvr6+ubm5tLS0ra2tm5ubvr6+ubm5w8PDwsLCx8fHwMDAurq61dXV0NDQx8fHxcXFycnJxMTExsbGwMDAzMzMubm5wMDAx8fHy8vLyMjIz8/Pw8PDvr6+wMDAwMDA0NDQxcXFv7+/0NDQ8vLy1dXV29vbu7u7wsLCvLy8v7+/k5OTPj4+Dw8Pc3NzsLCwzc3NpqamwsLCxsbGvLy8uLi4xMTEwcHBxMTE2traurq6ubm5ra2ttLS0uLi4uLi4s7OzoKCgvb29yMjIv7+/srKywsLCtbW1sLCwtLS0qampurq6ra2txsbGsbGxsLCwu7u7tLS0srKys7Ozurq6wMDAqqqqr6+vs7OzwMDAtra2vr6+09PTtra2nZ2dtra2v7+/kJCQqqqqsrKytra2ra2tr6+vs7Ozra2tqamppKSktLS0ubm5wsLCq6ur////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7u7u2dnZ0tLSycnJwsLCzMzMw8PDwMDAxsbGx8fHzMzMz8/PzMzM39/fwcHB5eXlwsLC09PT0dHR7Ozs6enp2NjY0dHRx8fHz8/Pzs7OwsLCysrKxcXFz8/PxMTEwsLC+Pj4u7u7t7e3uLi40tLSwMDAurq64uLi0NDQw8PDzc3NxcXFycnJurq6sbGxwMDAzMzMvLy8wMDAt7e3xcXFwcHBwcHBz8/PzMzM4eHh09PTysrKzMzMycnJwsLCwsLCxcXFxsbGwsLC0dHR4ODgyMjIwMDAw8PDubm5l5eXKSkpra2tsrKyr6+vioqKsbGxvLy80tLSubm5wMDAvr6+xsbGy8vL6enpxcXFwMDAsrKyqqqqra2ttra2tbW1srKyp6enpKSkurq6sLCwhoaGubm5tbW11NTUq6urv7+/vr6+ra2tsrKyubm5paWltra2tra2tra2uLi4q6urubm5sbGxrq6us7OzwMDAq6uru7u7oaGhzs7OrKysra2tvLy8ycnJxMTEubm5rKysw8PDoaGhra2tubm5n5+fqqqqsbGxtra2tbW17u7u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f339/fysrK0tLSzs7O1tbW39/fwcHBw8PDxcXFvr6+z8/Pzc3Nz8/P0tLS7+/v////2NjY3t7e+/v74+Pj0tLS19fX2NjY8vLy5OTkxMTEwMDAx8fH8fHxwMDAxcXF+/v7u7u7v7+/4ODg0dHRzc3NyMjIxMTE09PTxcXFzMzMy8vLxsbGycnJyMjI7u7u3Nzc5eXl8vLyvr6+5OTkxcXFurq6xcXF6enp19fXxcXFwcHB1NTU1NTUvr6+ycnJw8PDx8fHz8/Px8fHyMjIxcXFwsLCsrKyZGRkrKysq6urrKyst7e3uLi4s7OzsLCwsbGxvr6+vr6+tra2srKyuLi4y8vLx8fHu7u7vb29ubm5ubm5vLy8pqamn5+fr6+vu7u7rKys1dXVtra2sbGxuLi4pKSkoaGhwMDAtLS0t7e3r6+vwMDAtbW1wcHBsLCwsLCwra2tr6+vubm5vb29tra2tbW1srKyq6urtbW1vb2909PT1NTU5+fn6+vrubm5tLS0tbW1qqqqtbW1ra2tpqamubm5ubm5paWlsrKypqamxsbGra2t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+fn50dHR1NTUx8fHvb2919fXzc3Nzc3NysrK////19fX3t7e////7e3txMTEqKio4ODgzc3NzMzM09PT0tLS8PDw3t7e39/f09PT0dHR1tbWwsLCu7u7y8vLwsLCw8PDxcXFvr6+xsbG+vr60NDQ09PT0dHR0tLSz8/P2traycnJx8fH09PTsLCwrq6uzs7O4eHh5ubmxcXF3Nzctra2urq6x8fHvLy8wcHBwMDAt7e3ycnJvb29xsbG0dHR2NjYw8PDyMjIv7+/yMjIxMTExsbGvr6+wMDAmZmZvr6+tLS0vr6+v7+/tLS0sbGxuLi4wMDAvLy8qKioxsbGqqqqt7e3wsLCsbGxwMDAwcHBt7e35OTktra2s7OzrKyssrKywcHBy8vLsrKytLS0t7e3uLi4zs7OsbGxsLCwuLi4t7e3ubm5tra2sbGxpaWltLS0tLS0qqqqsbGxsbGxrKystra2srKys7Ozw8PDwcHBra2ts7Ozrq6usbGxtra2r6+vsLCwrKyspqampKSkysrKwMDAoKCgw8PDtLS0ubm5qqqqqqqqvb29////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////srKy8PDw29vb0tLS0tLSzMzM1tbW1NTUy8vL29vb8PDwz8/Pz8/PzMzMx8fHy8vLv7+/zMzM0dHR4eHh6urq8PDw1NTU7u7u3t7e09PT1dXV0NDQyMjI0dHR0tLSxsbGw8PDwcHBwMDAuLi4urq6vr6+vb29ycnJx8fHx8fHxcXFxcXFvb29z8/Purq6vb29j4+Px8fHx8fHxsbGurq6xcXFwcHBx8fHwcHBwMDAy8vLtbW1xMTEurq6ysrKv7+/y8vLycnJ1dXVxsbGra2tlpaW0tLSvr6+u7u7wMDAsrKyw8PDvr6+urq6s7OzwMDAurq6t7e3vb29ubm5xsbGvr6+srKytbW1vb29r6+vvLy8x8fHrq6ut7e3tLS0t7e3vb29s7OzuLi4p6enubm5s7Ozrq6uqamptLS0ra2trKysu7u7srKysLCw7OzsuLi4p6ensLCws7OzsrKytbW1r6+vtLS0uLi4tLS0tbW1uLi4VFRUu7u7qKiotra2uLi4tbW1zs7Oz8/PxsbGu7u7qKioqKioz8/Pq6urpaWlp6envb29xsbGubm5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0NDQ9/f32NjY2NjYwsLCx8fHxMTEy8vLyMjIwMDAvr6+xcXFtra2tra2xMTEysrKzc3NyMjIxMTEvb293d3d4+Pj1NTUrKysy8vL09PTxsbGzMzMwsLCw8PDz8/PtLS0xcXFt7e3wcHBw8PDsbGxwsLC3t7ewMDAxMTEtra2urq6s7Ozv7+/srKysrKysLCwurq6u7u7w8PDtLS0wMDAw8PDlJSUuLi4tra2vb29vb29u7u7w8PDrKyswsLCycnJyMjIxMTEz8/Pu7u7ubm50NDQurq6r6+vvb29rq6uuLi4tLS08/Pzrq6usrKyuLi4sLCwvb29tLS0srKyubm5xcXFurq6urq6u7u7tLS0srKyq6ururq6ubm5tra2w8PDrq6uubm5wcHBrq6us7Ozvr6+uLi4q6urv7+/rq6uvb29s7OzwMDAv7+/qqqqqKiosrKyrKyspqamoKCgtLS0sLCwsrKysbGxtbW1rq6usbGxra2ttra2tLS0tbW1tbW1urq6v7+/sLCwpKSkoqKiubm52traqampqqqqp6ensbGxp6enp6enzs7O////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8PDwyMjIx8fHvLy8y8vLx8fHycnJxsbGycnJ0NDQv7+/0dHRwsLCwMDAycnJv7+/y8vLxcXFzc3Nv7+/urq6xsbGv7+/wcHBxcXFrq6urq6u3NzcwsLCzMzMu7u7wcHBzMzMysrKycnJy8vLu7u7vb29xMTEtLS0wcHBurq6vLy8urq6qKiovr6+vLy8tbW1wsLCsbGxubm5tra2wsLCwcHBvr6+tra22NjYwsLCy8vLtbW1yMjIvLy8w8PDubm5wMDAwsLCvb29urq6xMTEzMzMurq6s7OzsLCwuLi4r6+vrq6utbW1yMjIuLi4uLi4sbGxqamprq6utbW1rq6uvLy8v7+/tra2vb29r6+vwMDAs7Ozr6+vsLCwtbW1wMDAqampxMTEwMDAtLS0srKyuLi4ubm5u7u7v7+/tLS0s7Ozqqqqq6uruLi4vLy8oaGhoaGhsLCwtra2t7e3tra2uLi4srKytbW1wcHBu7u7s7Ozubm5qampt7e3ra2tqqqqycnJvLy8mJiY3d3dxcXFpqamqamptLS0qampoqKipaWlra2tqqqq////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6+vrzs7OzMzM0NDQxsbGzc3N09PT0dHRvr6+ycnJurq6uLi4tra2yMjIxsbGx8fHvLy8xsbGwcHBycnJurq6z8/Py8vLx8fHr6+vwsLCx8fHu7u7zs7OtbW1sbGxwMDAurq6u7u7wcHBuLi4x8fHt7e3ysrKra2tpKSkr6+vv7+/oKCgtLS0u7u7srKyubm5s7OzwsLCu7u7vr6+wMDAq6urubm5tra2uLi4q6urvb29uLi4wcHBvr6+x8fHyMjItra2wcHBv7+/xMTEw8PDq6uruLi4w8PDvLy8o6Ojw8PDurq6pKSkxcXFvLy8uLi4uLi4r6+voKCgwMDAqKiosLCwqqqqsbGxq6urt7e3tra2rq6urKyssLCws7Ozrq6ur6+vqqqqq6uruLi4tLS0tra2t7e3tbW1sbGxvr6+rKysvLy8yMjIv7+/ubm5wcHBs7Ozx8fHqKiopaWlrKysv7+/pKSkp6entra2qqqqtbW1srKyq6ursrKyubm5tra2sLCwra2tu7u7zMzMrKyssbGxt7e3rKyssrKyt7e3np6eq6urra2tr6+v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ysrKxMTEycnJzc3NysrKx8fHx8fHx8fHwMDAwcHBxsbGzMzMvr6+ycnJzs7Ov7+/t7e3w8PDycnJyMjIxsbGurq6vLy8tra2ysrKz8/Pw8PDwsLCvLy8wMDAwMDAwsLCw8PDurq6u7u7v7+/xsbGvLy8w8PDwcHBvr6+tLS0vb29ubm5vLy8pqamtLS0sLCww8PDxsbGxMTEvr6+s7OzxcXFurq6wcHBvLy8xMTEwMDAtLS0srKyvb29vLy8yMjItLS0ycnJurq6vr6+ycnJxMTEx8fHysrKvr6+sbGxwsLCt7e3yMjIvLy8tra2tbW1uLi4vr6+tLS0ra2to6Ojs7Ozt7e3sbGxqqqquLi4ra2trq6ur6+vsbGxs7OzsbGxsbGxpaWlpaWltra2tra2x8fHqamptLS0tbW1sLCwtra2w8PDtLS0r6+vtbW1srKyrKysq6urpKSkwsLCt7e3qKion5+fu7u7srKyoaGhtLS0vr6+rq6ut7e3ubm5wsLCzMzMvb29mpqa1NTUrq6ur6+vqKiosLCwq6urlpaWn5+fsbGxrKysr6+v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0dHR0dHRxcXFzMzM0tLSzs7OyMjIxcXFycnJxsbGra2tu7u7tbW1xMTEvr6+zMzMxcXFubm5x8fHxcXFwcHBu7u7yMjIrq6uzMzMvLy8xMTEv7+/wMDAsbGxw8PDxsbGwcHBwcHBw8PDzc3Nvb29u7u709PTvLy8vr6+xMTEtra2qKiowMDAvLy8wcHBvLy8vr6+uLi4t7e3yMjIubm5tbW1vb29urq6wsLCurq6xMTEvr6+wcHBtbW1w8PDx8fHxsbGubm5zc3Nw8PDsLCwwsLCysrKycnJvLy8t7e3vb29wMDAv7+/u7u7tra2urq6ubm5wMDAr6+vtLS0s7OzuLi4r6+vtbW1tLS0sLCwsrKyrq6uu7u7ra2ttLS0rKysr6+vqqqqra2tuLi4wcHBr6+vu7u7urq6t7e3ra2tt7e3t7e3ubm5s7OztLS0tbW1s7OzsbGxuLi4tLS0urq6t7e3sbGxxcXFvLy8rq6utra2sLCwubm5vLy8rq6upKSkrq6uurq6sbGxrKysycnJra2tp6ent7e3sLCws7Ozqqqqra2ttra20NDQ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ysrKyMjIz8/PxcXFxsbGycnJwcHB7OzstLS0z8/PysrK8PDwj4+PxsbG0NDQycnJycnJ1NTUxsbGw8PDvLy8wMDAx8fHs7OzvLy8x8fHxMTEvLy8sLCwxcXFoqKiqqqqwsLCxcXFubm5ycnJyMjIvLy8wsLCv7+/wsLCvb29t7e3ubm5xsbGwMDAvr6+xMTEu7u7vr6+sbGxv7+/vLy8yMjIxcXFubm5vLy8vLy8srKysLCwwcHBv7+/xMTEwcHBsLCwrKysx8fHvr6+xsbGwsLCvb29w8PDv7+/vLy8sLCwpKSkysrKvb29r6+vv7+/pKSktLS0uLi4tLS0q6urv7+/tra2tra2t7e3s7OzrKystLS0ysrKxsbGxMTEs7OztbW1rKyswcHBrKysrq6uo6OjwsLCxsbGr6+vv7+/s7OzvLy8srKys7Ozs7Oztra2xMTErq6utra2ra2tr6+vp6entbW1pqamsLCwqqqqpqamt7e3vb29r6+vt7e3r6+vtbW1sLCws7OzvLy8rKysurq6rq6ur6+vw8PDrKysqamprKysqKio////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6+vrwsLCxsbGz8/PysrKw8PDvLy8xsbGzc3N0tLSz8/Pu7u7xsbGn5+fioqK0NDQxMTEzMzM1tbWw8PDurq6y8vLysrKw8PDt7e3vb29xsbGw8PDxsbGwMDAtra2t7e3zMzMwsLCwcHBwcHBx8fH0dHRxMTEzMzMzc3NxcXFuLi4uLi4xMTEubm5urq6srKys7Ozvb29tLS0wMDAurq6wcHBxcXFs7Ozs7OzyMjIz8/PuLi4ubm5vb29ra2txsbGwcHBtLS0xsbGurq6vb29xMTEwMDAoaGhurq6xMTEwMDAvLy8u7u7v7+/+Pj4urq6wcHBuLi4srKyqKiosLCw0dHRwMDA9PT0rq6us7Ozq6urqqqqt7e3wMDA8/Pzt7e3uLi4qKiopqamv7+/u7u7q6ursbGxx8fHv7+/u7u7rKysurq6sbGxr6+vtLS0t7e3urq6r6+vurq6rq6upaWlvb29wMDAsbGxsLCwpqamtLS0vLy8oqKisbGxsrKyr6+vpaWluLi4sbGxz8/PsLCwsrKyv7+/qampsbGxnp6epKSkra2tnp6enJyc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////y8vLzMzM0dHRycnJubm5v7+/yMjIyMjIv7+/v7+/ycnJwsLCxcXFwMDAycnJyMjIysrKx8fHv7+/ysrKxsbGyMjIwsLCw8PDxsbGxsbGzs7Ovb29uLi4s7Ozurq6wsLCxcXFxsbGwMDAuLi4ycnJw8PDw8PDyMjIv7+/ycnJyMjIxcXFysrKxcXFycnJvLy8xcXFycnJycnJvLy8u7u7ubm5ysrKw8PDu7u7kpKSuLi4r6+vxMTEw8PDtbW1urq6wsLCuLi4vb29wMDAurq6wcHBurq6u7u7vLy8vLy8yMjIxMTEvLy8vr6+s7Ozrq6uurq6tbW1pqampqamtbW10tLSsLCws7Ozs7OzsrKytbW1vLy8v7+/5eXlzc3NxsbGs7OzlpaWq6urtbW1ubm5vb29uLi4wsLCrq6usrKyt7e3srKyu7u7srKyrKystbW1tra2r6+vuLi4paWluLi4ycnJr6+vrq6upqamrq6uuLi4uLi4r6+vvLy8uLi4v7+/oKCgra2ts7Ozubm5ra2ttra2u7u7xcXFwMDAtbW1n5+fm5ublZWVrKys////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8fHxcXFysrKzc3N0NDQy8vLwcHBy8vLy8vLx8fHy8vLtra2vr6+u7u7x8fHxcXFxcXFysrKx8fHxcXF1dXVwsLCwcHBwcHBvr6+w8PDycnJxcXFvr6+1NTUw8PD0dHR7u7uysrKwsLCxMTExsbGxsbGxMTEtLS0vb29uLi4wcHBwcHBxMTEwMDAw8PDwsLCxcXFy8vLx8fHzMzMyMjIv7+/v7+/yMjIt7e3vb29xMTEw8PDvr6+wsLCubm5t7e3wcHBv7+/0NDQvr6+wcHBw8PDw8PDwMDAv7+/s7Ozvr6+tra2vb29t7e3srKyra2ts7Ozurq6sbGxt7e3s7Ozs7OzqqqqtbW1np6esLCwt7e3srKyr6+vsLCwsLCwqampubm5sbGxnp6et7e3wcHBtbW1vLy8vb29s7Ozr6+vtbW1u7u7u7u7r6+vv7+/tLS0sLCwt7e3uLi4ra2tqqqqqamptLS0tLS0oaGhsLCwurq6r6+vqKiovr6+uLi4rKyssrKyq6urvr6+v7+/vLy8q6urnp6esrKyvr6+p6env7+/s7OzsrKy+fn5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2NjY0tLSzs7O1dXVzs7O09PTxsbGxcXFz8/PyMjIysrKxMTExcXFxcXFwsLCzs7Ozs7O19fXwsLCwMDAuLi4xMTEs7Ozw8PDwcHBysrKxcXFwMDAubm5ycnJxMTEzs7OxcXFu7u7xMTEwcHBvb29w8PDw8PDycnJv7+/vr6+sLCwr6+vvr6+tbW1t7e3wMDAycnJxsbGxMTEvr6+wsLCycnJvb29zc3NwsLCwcHBubm5ubm5w8PDycnJwMDAvb29zMzMz8/Pvb29xcXFt7e3vr6+v7+/zMzMwcHBvb29r6+vurq6r6+vrq6um5ubs7Ozs7OzrKyssrKysrKyvr6+vr6+vb29vb29sLCwp6enurq6sbGxqampt7e3ubm5ubm5s7Ozt7e3oqKitLS0s7OzvLy8pqamubm5u7u7xcXFwcHBvr6+s7OztLS0qKios7Ozrq6unp6eu7u7q6ursLCwmJiYs7Ozrq6usbGxsLCwrKysra2tqampq6ursbGxu7u7paWltbW1tbW1n5+fpKSkrq6urq6ur6+vsbGxubm5rKysq6uro6Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2dnZzc3Nzc3N1NTU0NDQ09PTzc3N2NjYyMjIysrKzs7OyMjIxsbGw8PDysrKxMTEx8fH4eHhysrK1NTUrq6uxcXFwMDAysrKx8fHxsbGy8vLy8vLw8PDzc3NwcHBxsbGx8fHxcXFxsbGwsLCx8fHuLi4vLy8w8PDycnJxMTEw8PDsLCwwcHBwcHBt7e3wsLCw8PDxMTEubm5v7+/x8fHw8PDu7u7wcHBwMDAx8fHu7u7tra2xMTEv7+/urq6ubm5t7e3wcHBysrKxsbGvr6+w8PDvLy8tbW1vb29ubm5vb29r6+vxcXFzc3Nvb29tLS0s7OzvLy8rq6usbGxubm5ra2ttLS0tra2vLy8o6OjsrKyrq6usbGxtbW1tra2i4uLiYmJtbW1wsLCsrKyrKyssbGxwcHBra2turq6w8PDtLS0tra20dHRra2ts7OzsbGxtLS0sbGxtbW1sLCwqamptbW1rq6urq6uqqqqoaGhq6ursLCws7Ozq6urqqqqsLCwqqqqpqamqampubm5s7OzpKSkwMDAvb29uLi4qqqqxMTEn5+fqKiopaWl////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0NDQzs7O1NTU1NTU0dHRz8/P0NDQz8/PyMjIwMDAzs7OysrKysrKycnJwMDAvb29wMDAuLi4vb29xsbGy8vLx8fHwcHBtLS0srKywMDAvr6+xcXFwsLCycnJxsbGx8fHxcXF2NjYvb29xcXFxMTEt7e3wsLCxMTExsbGxMTEyMjIrq6uxMTEw8PDu7u7tra2v7+/yMjIpaWlvLy8uLi4v7+/wMDAysrKxcXFx8fHubm5s7OzuLi4sbGxurq6sLCwxMTEtra2r6+vzs7OwsLCubm5vLy8tra2t7e3vLy8r6+vqampwcHBra2tu7u7xsbGvr6+s7Ozu7u7ubm5wMDAtLS0wcHBsbGxq6ursrKyu7u7srKyqampv7+/vLy8uLi4srKygYGBk5OTnJycs7Ozurq6srKyurq6rKyssrKyurq6t7e3q6urs7Ozpqamvb29wsLCqamppqamubm5t7e3rq6uq6urubm5xcXFqampsrKypqamvr6+vb29urq6rKysrKystbW1o6OjqampvLy8vr6+6enpwsLCra2tnJycr6+vqamprq6uwcHB////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+vr60tLSzMzM1tbWycnJ2NjY0NDQz8/P1NTUy8vLycnJzc3Nzs7OyMjIyMjIysrKzs7Ow8PDycnJyMjIysrKy8vL+/v7ycnJysrKvr6+vb29w8PDvb29v7+/wcHBxsbGxsbGwMDAycnJu7u7q6urvb29rq6uvb29xsbGx8fHvr6+vb29vb29wcHBurq6tLS0uLi4ubm5v7+/vb29ycnJv7+/v7+/2dnZv7+/u7u7s7Ozra2tvb29rq6uj4+PvLy8xcXFtLS0vb29w8PDx8fHu7u7xsbGubm5q6urvb29uLi4tbW1ra2ts7OztLS0wcHBvr6+v7+/vr6+wcHBu7u7sbGxra2tvLy8ubm5tLS0uLi4oaGhtra2sbGxvr6+qKios7Ozra2tAwMDpaWls7OzsLCwtbW1uLi4sLCwq6urvb29r6+vpaWlq6uroqKisbGxpaWlpqamv7+/urq6tra2ra2ttra20NDQq6urr6+vqamptLS0vr6+sbGxo6OjqqqqtbW1r6+vtra2sLCwubm5tra2urq6qampl5eXwsLCrq6uq6urwcHBpqam////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xsbGt7e3zc3Nz8/Px8fHy8vLwsLCx8fHzc3NycnJz8/PycnJx8fHwsLCyMjIxMTExMTEwcHB0NDQ1NTUycnJxMTExsbGu7u7wMDAvLy8x8fHwcHBzs7O1NTU+Pj4/Pz8s7OzwMDAzc3NwcHBxMTEs7Ozr6+vtra2vr6+tLS0wsLCu7u7vLy8wsLCwcHBwMDAv7+/ycnJs7OzwMDAx8fHvLy8vr6+vr6+vr6+uLi4urq6vLy8vLy8xcXFlpaWbW1ttLS0xMTEysrKx8fHv7+/vr6+q6ururq6uLi4qqqqvLy8t7e3ra2turq6sLCwwcHBwcHBurq6t7e3urq6t7e3uLi4vLy8tLS0x8fHqKiorKysxMTEtLS0pqamurq6srKyuLi4q6urMzMzFhYWsrKyrKysr6+vrq6uvr6+sLCwq6urvLy8urq6qqqqurq6r6+vrKysrq6usrKyuLi4tLS0oqKisrKylpaWXFxcsbGxrKyssbGxqqqqp6enqampiYmJJiYmfn5+KysrcHBwt7e3srKywcHBtLS0pqamqamprKysnJycqampqqqq////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yMjIz8/Pz8/Px8fHycnJysrK39/fw8PDwsLCxMTEubm5vb29wcHBw8PDy8vLycnJ0tLS1dXVwsLCzs7Oy8vLzs7Oy8vLxsbGwsLCxcXFysrKwsLCxsbG0dHR0NDQ9/f339/fxMTEubm5vLy8urq6ycnJvLy8tbW1wMDAx8fHwcHBvb29xMTEtra2vr6+srKyvr6+u7u7vLy8vr6+vr6+w8PDw8PDtra2tra2x8fHxcXFvLy8s7OzwMDAwcHBpaWltbW1lZWVm5ubwMDArq6uw8PDzs7OwsLCuLi4iIiIoqKiu7u7vLy8uLi4uLi4uLi4u7u7ubm5t7e3uLi4wcHBs7Ozvr6+wsLCsrKyqqqqra2ttLS0tLS0s7Ozt7e3ubm5r6+vqKioSUlJAAAAVlZWmpqatra2srKytbW1ubm5qKioq6urpaWltLS0vLy8ra2tp6ensbGxr6+vn5+fo6OjGxsbEhISAAAATk5OgoKCKioqioqKn5+fioqKqqqqnp6era2tpaWlpKSkpqamp6enkpKSm5ubuLi4ycnJqKioo6OjmJiYrq6urq6u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ysrKysrKxMTEzc3Nw8PDyMjIu7u7vb29u7u7wMDAvr6+xcXFwsLCv7+/vr6+w8PDxcXFy8vLzs7Otra2xcXFy8vLr6+vzc3Nubm5v7+/vLy8w8PDu7u7xcXFvLy8u7u7xsbGuLi4wMDArKysx8fHvr6+xMTEwsLCr6+vvLy8vLy8ubm52dnZyMjItbW1xMTEv7+/xMTEysrKt7e3xcXFvr6+uLi4yMjIwcHByMjIv7+/vLy8vLy8ubm5wsLCt7e3rq6uwMDAsbGxvb29wcHBxMTEqqqqvb29u7u7yMjIt7e3vr6+wMDAvb29u7u7urq6t7e3qqqqtra2ra2ttra2tLS0tLS0u7u7tbW1pKSkt7e3dXV1uLi4pKSktbW1ra2ttLS0t7e3sLCwhoaGAAAASEhIrq6ur6+vp6entbW1p6enu7u7r6+voKCgpKSksLCwp6ens7OzY2NjiIiIXFxcq6uroaGhtra2ra2tsLCwpKSkcXFxo6Ojmpqarq6urKystbW1paWlo6Ojn5+foqKivb29oqKir6+vq6ursbGxpaWlpKSkqampo6Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2trazc3Nz8/Pw8PDvr6+w8PDvLy8x8fHvr6+wcHBvb29zMzMycnJzs7OysrKt7e3t7e3v7+/urq6wsLCvb29t7e3t7e3vb29xcXFycnJ1dXVw8PDx8fHy8vLxcXFy8vLxsbGv7+/wMDAs7Ozu7u7tLS0tbW1rq6uq6ururq6yMjIvr6+x8fHyMjI4eHh7e3tzMzMwsLC6Ojoqampy8vLv7+/sbGxwMDAtbW1srKyurq6wMDAu7u7tbW1w8PDtra2vb29urq6tra2w8PDs7OzwsLCvb29tLS0wMDAtbW1vr6+0NDQvb29w8PDwMDAwsLCxMTEubm5v7+/uLi4rq6usrKytra2w8PDtLS0q6urqampe3t7WlpagoKCTk5Oqampt7e3NTU1u7u7NjY2AAAAAAAAHh4eIyMjr6+vqqqqpaWlrq6uoqKimpqaDw8PMzMzr6+vra2tubm5s7OzpqamsLCwr6+vubm5qampnp6eq6urq6uroKCgqqqqp6ennp6eqqqqnJycpaWln5+fpKSkp6entLS0qKionZ2dsrKyq6urtLS0qampxsbG5ubm////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xsbG09PTzs7Ozc3NzMzMycnJxcXFwcHBw8PDzMzM1dXVvLy8y8vLvr6+u7u7y8vLxMTEz8/PxcXFzc3NsrKyzs7Opqamx8fHvLy8xMTEw8PDwsLCw8PDw8PDxsbGwMDAs7Ozra2tsLCwqampvr6+sLCwo6OjycnJx8fHwsLCv7+/wcHBurq6ysrK0dHRxMTEwsLC4ODgz8/P5eXl1tbWs7Ozw8PDvLy8vb29wsLCp6enw8PDxMTEtLS0ycnJxMTEv7+/tbW1s7Oztra2sbGxtbW1r6+vw8PDs7OzxMTEysrKu7u7ubm5y8vLrq6utbW1t7e3sbGxu7u7x8fHrq6usLCwpqamtbW1t7e3wcHBuLi4srKys7Ozu7u7X19fjY2NXl5eioqKBwcHICAgs7Ozpqamrq6ura2tpKSkoKCgs7Ozr6+vsbGxjIyMtLS0s7Ozqamps7OzqampuLi4tbW1s7Ozp6enp6enpqamnZ2drq6up6enoaGhoKCgpaWlqampra2ttra2nJycn5+fnp6epqamvr6+tra2xsbGp6enpqamra2ttra2np6e////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0tLS0tLS2NjY1dXV19fX0NDQw8PDy8vLvr6+zMzMxsbGycnJv7+/urq6zs7OxMTEysrKzc3NtbW1s7OzxcXFwcHBx8fHycnJs7Oz0NDQwcHBxcXFs7OztbW1vb29uLi4wMDAr6+vy8vLv7+/wcHBvr6+xsbGtLS03t7erKysxMTEwMDAu7u7wcHBxsbGx8fH9PT009PTzMzMxsbGxMTEvr6+ubm5w8PDu7u7tbW1tLS0wMDAsbGxsrKyra2tx8fHt7e3tLS0ra2tsLCwsLCwqqqqr6+vubm5vb29tLS0yMjItra2ycnJrq6uoqKira2tvLy8vLy8vr6+oqKirq6uwcHBu7u7oaGhp6envb29r6+vT09PuLi4wcHBtLS0oaGhk5OTtra2q6urNDQ0u7u7tbW1vLy8vr6+t7e3srKyqampvb29m5ubtra2qamppqamrKysuLi4wsLCsrKyu7u7qampra2tqKiorq6uqqqqqqqqnJycw8PDsbGxpKSksrKyrKyspKSknp6elpaWn5+fubm5oqKio6OjqamppKSkra2tq6urqKioq6ur////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////y8vL0tLS0NDQ09PT1NTUycnJ09PTzc3NwcHBycnJzs7Otra2zMzMzc3NxsbGpqamsLCwuLi4x8fHv7+/w8PD0dHRxMTEwsLCysrKz8/Pw8PDuLi4wMDAuLi4wMDAra2ty8vL2travLy8xsbGt7e3wcHBtra2vr6+q6urubm5urq6wsLCvr6+vr6+vb29wcHBw8PDxcXFsbGxwcHBvb29wcHBr6+vvb29y8vLs7Ozw8PDx8fHtLS0uLi4vb29yMjIz8/Pqamprq6uubm5s7Ozvb29s7OzvLy8srKytbW1urq6rq6uvLy8ubm5t7e3rq6ut7e3urq6vLy8ra2tra2tk5OTq6ursrKyuLi4FhYWeHh4tbW1tbW1pqamsLCwjIyMqqqqu7u7srKyra2ts7OzpKSkpKSktbW1qqqqr6+vtra2vLy8srKyt7e3qKiorKysr6+vqqqqsbGxrq6uvb29t7e3qampq6urt7e3lZWVpKSkpKSkubm5qampnp6em5ubnZ2dn5+fl5eXlpaWpKSkpKSkpqamoKCgn5+flZWVoaGhwsLCl5eXoKCg////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19fX0NDQ1tbW0NDQ1NTU1dXVzMzMyMjIy8vLx8fHz8/Pz8/Pz8/Py8vLyMjI0dHRw8PDysrKyMjIy8vLvLy8xsbG0NDQv7+/zs7O4ODg0tLSx8fHx8fHu7u7u7u7xMTEvr6+v7+/urq6vr6+v7+/uLi4rq6uqamptbW1urq6tra2ubm5rKyswsLCqKioy8vLzMzMtra2uLi4w8PDpqamwMDAtLS0tLS0urq6tLS0tra2t7e3tra2uLi4urq6uLi4tra2rq6uurq6pKSkt7e3w8PDs7Oz7+/v5ubmurq6v7+/wMDAs7OztbW1tLS0sbGxtra2t7e3qqqquLi4mpqasLCwpKSkkJCQwMDAhYWFnJycsrKysLCwo6OjuLi4tLS0r6+vv7+/wMDA2trawMDAtbW1urq6tLS0vb29pKSkrKystra2tLS0rq6uqampubm5p6entra2qampnJycrq6unp6erKysqKiooqKiqKiorq6usbGxrq6umJiYo6OjoqKirq6urKyso6OjrKysmpqav7+/qqqqoKCgsrKyp6enqampuLi4rKys6urq////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6enpwcHBzMzM0NDQz8/PxsbG0NDQ2NjY19fXycnJyMjIyMjIzs7OysrKysrKxMTEzs7Oz8/PvLy809PTxsbGwsLC0NDQ0dHR5OTk19fX1dXV09PTxsbGxMTEycnJycnJsrKysrKyqamprKystra2ra2twcHBsbGxuLi4srKyv7+/p6ensrKyurq6r6+vurq6x8fHv7+/vr6+tra2vLy8vLy8xcXFxsbGxcXFyMjIurq6vr6+vr6+vr6+urq6yMjItbW1ubm5uLi4vb29vr6+srKywsLCwMDAt7e3xMTE29vb0tLSx8fHxMTEurq6w8PDt7e3t7e3sbGxrq6uu7u7sLCwLi4uTU1NtbW1oKCgs7Ozu7u7s7Ozr6+vqqqqsbGxvLy8qampsbGxtra24eHhwsLCvb29vr6+v7+/v7+/qampsLCwm5ubr6+vtLS0np6ew8PDsrKyubm5xMTEpaWlpaWlp6enubm5r6+vq6urpqamq6urpqamoaGhoaGhqqqqrq6uuLi4qKioo6OjnZ2doKCgtbW1oKCgrKysqampr6+vnZ2dqKiowMDA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1tbWxMTE2dnZ2dnZ39/f29vb1tbWyMjIzc3Nz8/Pz8/Py8vLyMjIxcXFwsLCx8fHt7e3zs7Ozs7O0dHRzc3NzMzMzc3N0dHR0dHRwcHB0dHRxcXFycnJv7+/wMDAxcXFubm5srKytLS0qqqqrq6utra2sbGxtra2qKiourq6sbGxra2tq6urt7e3wMDAubm5zc3NtLS0ra2tvLy8wsLCvb29sLCwubm5wcHBuLi4vb29ysrKtra2wcHBwcHBw8PDwMDAu7u7vr6+u7u7u7u7r6+vuLi4wMDAuLi44eHh3Nzcurq6vb29wsLCzs7OvLy8wMDAwcHBtbW1uLi4rKyslJSUv7+/qKiorKysrq6upKSkqqqqtbW1o6Ojrq6usLCwsrKyvb29s7OzuLi4r6+vt7e3ubm5o6Ojo6Ojvb29vb29rq6uubm5ra2tr6+vzc3N2dnZyMjIs7OzpKSkqqqqp6enu7u7rq6usLCwp6ensbGxrKystra2vb29srKysLCwtbW1oqKipaWllZWVuLi4tLS0sLCwkpKSp6enlJSUpaWlo6OjrKyspqam////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19fX0dHRwMDA1NTUy8vLxsbG9vb2yMjI0tLSu7u729vb0NDQ0dHRz8/Pz8/Px8fHysrKysrKzMzMx8fHxsbGzMzM6enpzs7OxcXF8PDwj4+Pvr6+vr6+xcXFzc3NwcHBxcXFwMDAurq6xsbGvLy8tra2uLi4ra2trq6uv7+/t7e3tLS0vLy8sLCwubm5urq6wMDAvb29xMTEwsLCrq6ura2tsrKywMDAs7Oztra2vr6+urq6tLS0u7u7vLy8wsLCvr6+sbGxtbW1u7u7v7+/sLCwu7u7uLi4wMDAwsLCvLy8urq6xcXFu7u7vb29tra2uLi4rKysr6+vubm5w8PDvLy8uLi4oaGhvLy8rq6upaWluLi4q6urr6+vrKysr6+voKCgqqqqvb29wcHBra2tubm5sLCwsrKyra2tqKiot7e3tLS0tLS0yMjIsbGxrKysurq6sLCwoqKip6enrKyswcHBtLS0p6ens7OztbW1oKCgpaWln5+fuLi4z8/PpqamsLCwqKiosbGxqqqqtLS0uLi4pqamsrKysbGxo6OjqamppqamnZ2dpKSk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+/vy8vL0NDQzs7O2dnZ0NDQx8fH2NjYzs7O0NDQ0NDQ09PTyMjIwsLC0dHR0NDQ0tLSw8PDycnJ0dHR39/f19fX0tLS0tLSysrKxsbGzc3Ny8vLz8/PxsbGv7+/yMjIwMDAv7+/ycnJvLy8yMjItLS0tLS0s7Ozvb29w8PDv7+/vr6+vr6+zc3NwcHBvLy8t7e309PTxsbGv7+/yMjIsLCwxcXFvLy8tra2tra2wsLCzMzMyMjItbW1w8PDp6ensbGxurq6x8fHu7u7vr6+tra2wcHBwcHBwMDAxsbGv7+/xsbGwsLCtra2t7e3s7OztbW1vr6+t7e3vLy8uLi4tLS0xMTEnJycq6urtLS0uLi4tbW1qqqqtLS0q6urqKiok5OTpKSkn5+fpqamtLS0ra2trq6uu7u7mZmZubm5m5ubr6+vmZmZpqamoaGhq6uroaGhoaGhsbGxpKSkoqKit7e3wMDAx8fHvb29qampp6enpKSkqKiora2tt7e3wMDAr6+vsLCwn5+fpaWlra2tsLCwl5eXpKSkhYWFo6OjpaWloKCglpaWlpaWtLS0////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0tLSyMjI0NDQ29vb2dnZ1dXVysrKz8/Pzs7Oz8/Pz8/PzMzM0NDQzc3N0tLSvb29zs7OysrKdXV1zs7OyMjIzMzMyMjIycnJ09PTwsLCz8/Pvb290NDQtbW1zs7Ozs7OvLy8y8vLxcXFvb29sLCwv7+/v7+/sbGxubm5ubm5tbW1tra2rq6utra2ra2tp6enpqamx8fHwcHBvb29wsLCu7u7ysrKtLS0urq6v7+/s7Ozw8PDwcHBtra2vb29wsLCt7e3wcHBuLi4vb29vr6+wcHBwcHBvb29u7u7vr6+v7+/tra2u7u7tLS06OjosrKyxMTEtbW1zc3NuLi4u7u7v7+/q6urrq6us7Ozrq6uurq6r6+vuLi4rq6utra2tLS0vLy8w8PDp6ensrKyrKyssbGxtra2oKCgtra2srKyxMTEtra2urq6srKysrKytLS0t7e3ubm5tra2tLS0srKypKSksbGxr6+vtra2o6Ojo6OjoqKirKyspKSkpaWlo6OjpaWlmpqasLCwp6enr6+vqKiomJiYn5+fj4+Pnp6empqanZ2dnJycpKSk////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1NTU0NDQxsbG19fX1tbW09PT1dXVzs7OzMzMxsbGxcXF1NTUy8vLy8vLz8/PyMjIzc3Nt7e3zMzMycnJz8/Pw8PDw8PDw8PDycnJxsbG09PT0dHRzs7OtLS0yMjIu7u7yMjIubm5xsbGz8/Pzc3NycnJtLS0q6urwMDAuLi4ubm5urq6ra2tu7u7tbW1qqqqvLy8vLy88/Pzt7e3w8PDq6urs7OzqKiourq6v7+/wMDA1tbWtLS0w8PDtra2v7+/u7u7tra2vb29tra2vb29yMjIwMDAvb29wcHBrKysuLi4ubm5urq6t7e3u7u7v7+/vLy85OTku7u7vLy8uLi4vb29vLy80NDQtra2r6+vp6ensLCwrq6utbW1qqqqpKSkubm5rq6ur6+vq6urv7+/sbGxrKystbW1qampu7u7yMjItra2xsbGtbW1paWltbW1tLS0pqamtLS0rKyspqamsLCws7OzpaWlxMTEsrKytLS0tLS0srKysbGxq6uroaGho6OjoKCgpaWltLS0mJiYo6Ojqqqqn5+fq6uroqKilZWVmZmZn5+flZWV////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8PDwMDAx8fHyMjIxMTEzs7O1NTU0NDQzMzM19fXw8PDxMTE0tLSysrK1NTUvr6+s7Ozy8vLzs7Oubm5ysrK1NTUycnJv7+/v7+/wsLCwsLCv7+/1dXV1dXVy8vLubm5wcHByMjIt7e3xMTEvLy8ycnJw8PDrq6uysrKx8fHra2trKystra2mpqaq6uru7u7wMDAwsLCvb29tra2urq6rKysvLy8wMDArq6uubm5srKyvb29ra2tuLi4ubm5vr6+yMjIwcHBxcXFuLi4xcXFra2tsLCwvb29ubm5wcHBra2ttra2ubm5srKysbGxwsLCsrKyv7+/v7+/vr6+ubm5vb29v7+/sLCwvLy8qamppqamwcHBvLy8t7e3oqKim5uburq6urq6wMDAo6Ojq6urwcHBsrKyra2tubm5ra2tu7u7paWltbW1t7e3sLCwu7u7r6+vp6ensbGxp6enrKysoqKisbGxr6+vs7OzpKSktLS0r6+voKCgnp6eqampmpqanJycsLCwsrKyoqKiubm5lpaWoKCgqKiolZWVkJCQkZGRnZ2dpKSkxcXF////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+/yMjIt7e3x8fHzc3Nz8/Px8fHw8PDyMjI0NDQ1NTU0dHR0dHR09PT09PTzs7Oz8/PzMzM1NTUxsbG09PT09PT0NDQycnJz8/PycnJz8/Purq6zs7Ox8fHv7+/xMTEzMzMxMTEycnJuLi4vr6+w8PDv7+/qqqqw8PDsbGxtbW1tra2vLy8tbW1tra2oqKisbGxwcHBr6+vvLy8y8vLurq6rKyssLCwvLy8q6urw8PDt7e3wMDAwsLCx8fHq6urwMDAu7u7uLi4ycnJvr6+ubm5urq6wsLCtLS0rq6ux8fHtra2tbW1v7+/tra2tra2wcHBv7+/vLy8tLS0urq6q6urtbW1paWlsbGxt7e3sbGxsrKyq6ursbGxoqKiq6urqampnp6ep6enl5eXrKyspqamrKystbW1tLS0s7OzpKSkrKyssLCwuLi4pKSkp6ensbGxt7e3rKysrKysurq6uLi4tbW1rKysvr6+r6+vm5ubrq6upaWln5+fsrKyq6urq6urr6+vrKysp6enqqqqmJiYqqqqs7OzmZmZrq6uqampqamppKSkqamp0NDQ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////zc3N0dHRwsLCw8PDyMjIxMTEy8vLycnJysrKyMjIycnJ1dXV0dHR0NDQ0tLSxcXF6+vrycnJxcXFwcHBzc3N09PTysrKycnJ0dHRzMzMz8/P0dHRy8vLubm5ysrKzMzMw8PD0tLSra2tvr6+wcHBq6urrq6us7Ozv7+/t7e3pKSkvb29urq6q6urqKiourq6ubm5t7e3srKyra2tra2twcHBsrKyvLy8s7OzwcHBqKiow8PDw8PDt7e3t7e3uLi4rq6uzc3NxMTEubm5xcXFtbW1u7u7ubm5urq6srKyw8PDurq6srKyvLy8tbW1urq6uLi4u7u7vb29tLS0srKyqamptra2u7u7xcXFrq6usbGxra2tsbGxs7OzwMDAnZ2dnJycpKSktbW1qqqqrq6uv7+/xMTEurq6urq6uLi4wMDAsrKyvb29pqamtbW1rKysrq6urKyswcHBsbGxrKyspaWlpqams7Ozra2tu7u7nJycpaWlqqqqoaGhpKSks7Ozrq6upaWlm5ubnJycoqKimpqaoaGho6Ojp6enr6+vpaWlra2tn5+fr6+v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yMjIwcHB0tLSw8PD1dXVxsbGvr6+x8fHxsbG0dHRxMTEzs7O0tLS19fX1tbW0NDQ0NDQ2dnZzMzM29vbw8PDyMjIxcXFwsLCysrKycnJxcXFz8/PxsbGuLi4sLCwtbW1ycnJxsbGxcXFy8vLvLy8ubm5urq6u7u7wsLCxMTEuLi4xcXFurq6tbW1urq6urq6rq6uoKCgm5ubq6ursrKysLCwt7e3sbGxtbW1tLS0qqqqqamptLS0ubm5u7u7ubm5u7u7rq6uuLi4xcXFtLS0xMTEra2tvLy8tra2wcHBvLy8wsLCs7Ozu7u7xcXFvLy8xsbGvLy8rq6uqampwsLCwsLCtLS0rKysrKystbW1tbW1ubm5tLS0vr6+tLS0q6urrq6usrKyuLi4vLy8vLy8wcHBubm5qampsbGxtra2tra2srKyyMjIubm5urq6s7Ozq6urpKSku7u7sLCwnZ2dqampq6urtLS0srKyqamps7Ozr6+vtLS0tra2r6+voqKikpKSnZ2dr6+vn5+frKysr6+vp6envLy8qKionJycm5ubkpKSm5ubn5+f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2traw8PDv7+/wcHBv7+/vb29t7e3s7OzxcXFvr6+xMTEyMjIw8PDycnJycnJxMTE1tbWz8/Pzc3NysrKy8vLz8/PysrKysrKy8vLxMTEyMjIvLy8vb29v7+/wsLCsLCwvr6+w8PDvLy8wsLCw8PDt7e3vr6+w8PDubm5wcHBsrKysrKytbW1wMDAvb29t7e3tbW1vb29srKyubm5urq6tLS0wMDAvLy8tra2rKysu7u7tra2srKyq6uruLi4wcHBu7u7v7+/srKywMDAtbW1tbW1rq6uvb29s7OzwMDAt7e3w8PDtra2wsLCra2tubm5vb29q6uryMjIvb29oaGhxcXFtLS0uLi4oqKiurq6vr6+sLCwwMDApqamtra2ra2tpKSksbGxp6entbW1t7e3ubm5urq6sLCwoaGhsLCwtLS0rKysxsbGpKSksrKytra2tLS0rKyspqamr6+vn5+fuLi4s7OzoKCgqqqqra2trq6uqqqqqqqqp6enp6enoKCgm5ubpKSkq6uro6OjpaWlra2ttbW1rq6um5ubsLCwq6urn5+fp6enr6+v1dXV////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ycnJycnJw8PDzMzMy8vLyMjIvb29w8PDxMTEyMjIxsbGycnJysrKx8fHy8vLyMjI0NDQx8fHysrKx8fHycnJzMzMx8fHxMTExcXFysrKwsLCyMjIzMzMyMjIxsbGw8PDxMTEvb29w8PDra2tyMjIyMjIs7OzqamptLS0t7e3tra2tLS0ubm5wMDAsrKyvb29v7+/urq6tra2urq6sbGxwcHBsLCwqqqqsrKyt7e3ubm5sLCwsrKyubm5sLCwo6Ojrq6utra2pKSkvr6+v7+/xcXFt7e3qqqqvLy8vb29urq6vr6+srKyvLy8urq6ra2trKyst7e3sbGxtLS0xcXFuLi4wsLCvb29r6+vyMjIuLi4uLi4urq6sbGxmpqavr6+t7e3t7e3tLS0ra2ttLS0sbGxoaGht7e3vr6+v7+/qqqqrq6uq6urt7e3sbGxubm5t7e3v7+/tbW1srKyrKyssbGxlJSUr6+vtbW1o6OjwMDAtbW1r6+vtLS0xMTEvr6+wsLCrKyso6Ojp6enqqqqsbGxra2tq6urra2tnZ2dnp6ek5OTl5eXp6en9vb2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+vr6x8fHxcXFysrKx8fHxMTE2dnZwsLCvb29vb29vr6+xcXFwcHBwcHBwsLCx8fHwsLCxMTE09PTy8vLycnJycnJv7+/zMzMx8fHw8PDw8PD0NDQx8fHzMzMxMTE1dXVxsbGvb29x8fHvLy8vb29ubm5uLi4tra2tbW1uLi4t7e3qqqqzs7OyMjIwMDAxsbGw8PDycnJurq6srKys7Ozt7e3sbGxtra2qqqqtLS0ubm5urq6uLi4v7+/tbW1paWlrKystra2sLCws7OzsbGxuLi4qqqq0tLSrKysvLy8wsLCt7e3r6+vsbGxxMTErq6uysrKv7+/r6+vtLS0pKSkycnJvLy8u7u7r6+vpqamw8PDurq6srKyvr6+oKCgnp6erKyspaWltbW1u7u7u7u7sLCwtLS0rq6uubm5vb29uLi4u7u7uLi4pKSkurq6urq6rKyssrKysrKyu7u7tbW1vb29uLi4u7u7qKior6+vpKSkpaWlsbGxuLi4tLS0q6urqKiotbW1tbW1qampr6+vqqqqg4ODs7OzpaWloqKisbGxoaGho6OjoqKiqamp////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wcHBzc3Nw8PDx8fHzc3Nx8fHv7+/w8PDxsbGvr6+0dHRwcHBurq6w8PDwsLCwsLCx8fHxcXFycnJx8fHxcXFxMTEysrKw8PD0NDQtbW1yMjI3Nzcz8/Pz8/Pzs7OwsLCtra2sLCwwMDAwMDAzs7Ok5OTs7OzwcHBwsLCmpqajY2NKCgonZ2d0NDQx8fHxsbGnJyc09PTwcHBu7u7urq6xMTEysrKwsLCsrKys7Ozt7e3uLi4x8fHra2trq6uurq6t7e3s7Ozvb29uLi4tra2wsLCvr6+tra2yMjIwMDAsbGxwsLCwcHBwMDAycnJyMjIurq6tLS0tbW1ycnJw8PDt7e3srKys7OzqqqqmpqapKSku7u7tra2vb29tbW1tbW1s7OzsbGxvb29v7+/wsLCrKysx8fHmpqatbW1tbW1uLi4xMTEwsLCyMjIvLy8sLCwtra2tbW1paWlwMDAq6urvLy8ubm5s7Ozmpqao6Ojurq6mZmZtbW1np6epKSkqKiotLS0r6+vp6ennZ2dq6urqqqqk5OTqqqqrq6unp6epaWlq6urnJycn5+fqamp//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + + MatchVariable + + MatchVariable + + 1 + false + + + + UnionDimension + + UnionDimension + + 0 + false + + + + + \ No newline at end of file From d756e653656b26ea7cbe492e3e7cb3dbe47383de Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 15:56:34 -0800 Subject: [PATCH 021/193] update Tag field --- image_services/opera/make_opera_services.py | 1 + 1 file changed, 1 insertion(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index e325a8df..9dc5f1b3 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -307,6 +307,7 @@ def main(): in_table=mosaic_dataset, fields=[ ['MaxPS', '610'], + ['Tag', '!Name!.split("_")[8]'], ], ) From 943d349e1ae20ad2c8458cd0f3c28ba04a2a3f94 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 16:10:31 -0800 Subject: [PATCH 022/193] correct Tag field element --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 9dc5f1b3..fb626723 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -307,7 +307,7 @@ def main(): in_table=mosaic_dataset, fields=[ ['MaxPS', '610'], - ['Tag', '!Name!.split("_")[8]'], + ['Tag', '!Name!.split("_")[9]'], ], ) From 2d29914a3b67c1f0e542d7530c4852c7c4a270ac Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 19 Oct 2023 16:21:17 -0800 Subject: [PATCH 023/193] add in polzarization field --- image_services/opera/make_opera_services.py | 1 + 1 file changed, 1 insertion(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index fb626723..1b6c467d 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -66,6 +66,7 @@ def get_raster_metadata(raster_path: str) -> dict: 'PixelType': get_pixel_type(info['bands'][0]['type']), 'SRS': get_projection(info['coordinateSystem']['wkt']), 'DownloadURL': download_url, + 'Polarization': name.split('_')[9], 'StartDate': acquisition_date, 'EndDate': acquisition_date, } From 7645ed2b5137093bcda39592b0b1c97b5e8e492c Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 16:38:36 -0800 Subject: [PATCH 024/193] remove ProductType references --- image_services/opera/make_opera_services.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 1b6c467d..2b51884c 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -100,7 +100,7 @@ def calculate_overview_fields(mosaic_dataset, local_path): print('Calculating field values for overview record') ds = os.path.join(local_path, mosaic_dataset) ds_cursor = arcpy.da.UpdateCursor(ds, ['Tag', 'MinPS', 'Category', 'StartDate', 'EndDate', 'GroupName', - 'Name', 'ProductType', 'Polarization', 'DownloadURL', + 'Name', 'Polarization', 'DownloadURL', 'URLDisplay']) logging.info('Calculating Overview Start and End Dates') @@ -122,10 +122,9 @@ def calculate_overview_fields(mosaic_dataset, local_path): row[3] = overview_start_date row[4] = overview_end_date row[5] = f'{ProdTypeOvField}_{PolOvField} Mosaic Overview' - row[7] = ProdTypeOvField - row[8] = PolOvField + row[7] = PolOvField + row[8] = DLOvField row[9] = DLOvField - row[10] = DLOvField ds_cursor.updateRow(row) print('Overview fields updated') From 9f79b0edce0cebc723c0cc0398bd61fde60853fc Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 16:51:02 -0800 Subject: [PATCH 025/193] add URLDisplay field --- image_services/opera/make_opera_services.py | 1 + 1 file changed, 1 insertion(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 2b51884c..740a1edc 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -66,6 +66,7 @@ def get_raster_metadata(raster_path: str) -> dict: 'PixelType': get_pixel_type(info['bands'][0]['type']), 'SRS': get_projection(info['coordinateSystem']['wkt']), 'DownloadURL': download_url, + 'URLDisplay': 'Display Text', 'Polarization': name.split('_')[9], 'StartDate': acquisition_date, 'EndDate': acquisition_date, From 30e5d474026ab1afa3f061cbd287de8eb36e0c42 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 16:53:26 -0800 Subject: [PATCH 026/193] add URL Display text --- image_services/opera/make_opera_services.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 740a1edc..6b48c5d0 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -66,7 +66,7 @@ def get_raster_metadata(raster_path: str) -> dict: 'PixelType': get_pixel_type(info['bands'][0]['type']), 'SRS': get_projection(info['coordinateSystem']['wkt']), 'DownloadURL': download_url, - 'URLDisplay': 'Display Text', + 'URLDisplay': download_url, 'Polarization': name.split('_')[9], 'StartDate': acquisition_date, 'EndDate': acquisition_date, @@ -309,6 +309,7 @@ def main(): fields=[ ['MaxPS', '610'], ['Tag', '!Name!.split("_")[9]'], + ['URLDisplay', 'Zoom in further to access download links for source rasters.'] ], ) From 175f565b0b6e1efa41d8b8a8222f30d2ab5a64f1 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 19 Oct 2023 16:54:18 -0800 Subject: [PATCH 027/193] edit URL Display text --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 6b48c5d0..04229c0c 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -66,7 +66,7 @@ def get_raster_metadata(raster_path: str) -> dict: 'PixelType': get_pixel_type(info['bands'][0]['type']), 'SRS': get_projection(info['coordinateSystem']['wkt']), 'DownloadURL': download_url, - 'URLDisplay': download_url, + 'URLDisplay': name, 'Polarization': name.split('_')[9], 'StartDate': acquisition_date, 'EndDate': acquisition_date, From b80eb15376c0e3f7fff99591330b88ea903a062b Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 19 Oct 2023 16:56:48 -0800 Subject: [PATCH 028/193] add arg for server connection file --- image_services/opera/make_opera_services.py | 1 + 1 file changed, 1 insertion(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 04229c0c..4f5a7f10 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -180,6 +180,7 @@ def main(): parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--working-directory', default=os.getcwd()) + parser.add_argument('--server-connection-file', default='/home/arcgis/server_connection.json') parser.add_argument('config_file') args = parser.parse_args() From cc06fe9b1eeb1f0146320a93b14b514aa7cd6bdc Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 19 Oct 2023 17:00:44 -0800 Subject: [PATCH 029/193] add arg for server connection file --- image_services/opera/make_opera_services.py | 1 - 1 file changed, 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 4f5a7f10..d4554d78 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -310,7 +310,6 @@ def main(): fields=[ ['MaxPS', '610'], ['Tag', '!Name!.split("_")[9]'], - ['URLDisplay', 'Zoom in further to access download links for source rasters.'] ], ) From afbe4840ee53b82aeb34256ec33272317d4f7799 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 20 Oct 2023 15:14:46 -0800 Subject: [PATCH 030/193] add URL Display to list of transmission fields --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index d4554d78..efccb869 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -284,7 +284,7 @@ def main(): cell_size=3, metadata_level='BASIC', transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;ZOrder;Dataset_ID;CenterX;' - 'CenterY;Tag;ProductName;GroupName;DownloadURL', + 'CenterY;Tag;ProductName;GroupName;DownloadURL;URLDisplay', use_time='ENABLED', start_time_field='StartDate', end_time_field='EndDate', From 912914315a4cd9c66c12c4926f7a036dff5d3906 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 20 Oct 2023 17:29:07 -0800 Subject: [PATCH 031/193] change pixel size for overviews and adjust source raster MaxPS and overview MinPS --- image_services/opera/make_opera_services.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index efccb869..b83acc7e 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -101,8 +101,7 @@ def calculate_overview_fields(mosaic_dataset, local_path): print('Calculating field values for overview record') ds = os.path.join(local_path, mosaic_dataset) ds_cursor = arcpy.da.UpdateCursor(ds, ['Tag', 'MinPS', 'Category', 'StartDate', 'EndDate', 'GroupName', - 'Name', 'Polarization', 'DownloadURL', - 'URLDisplay']) + 'Name', 'Polarization', 'DownloadURL', 'URLDisplay']) logging.info('Calculating Overview Start and End Dates') start_dates = [row[1] for row in arcpy.da.SearchCursor(mosaic_dataset, ['Tag', 'StartDate']) if row[0] != 'Dataset'] @@ -118,7 +117,7 @@ def calculate_overview_fields(mosaic_dataset, local_path): DLOvField = 'Zoom in further to access download link' row[0] = f'{ProdTypeOvField}_{PolOvField}__Overview' - row[1] = 600 + row[1] = 450 row[2] = 2 row[3] = overview_start_date row[4] = overview_end_date @@ -308,7 +307,7 @@ def main(): arcpy.management.CalculateFields( in_table=mosaic_dataset, fields=[ - ['MaxPS', '610'], + ['MaxPS', '460'], ['Tag', '!Name!.split("_")[9]'], ], ) @@ -316,7 +315,7 @@ def main(): local_overview = os.path.join(os.getcwd(), local_overview_filename) logging.info(f'Generating {local_overview}') - with arcpy.EnvManager(cellSize=600): + with arcpy.EnvManager(cellSize=450): arcpy.management.CopyRaster( in_raster=mosaic_dataset, out_rasterdataset=local_overview, From 9bcf22cc239455d2e4438aeb71f74cb200901463 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 23 Oct 2023 16:15:03 -0800 Subject: [PATCH 032/193] add raster store as overview tempfile location --- image_services/opera/make_opera_services.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index b83acc7e..848e2845 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -183,8 +183,9 @@ def main(): parser.add_argument('config_file') args = parser.parse_args() + raster_store = '/home/arcgis/raster_store/' bucket = 'hyp3-testing' - overview_path = '/vsis3/hyp3-nasa-disasters/overviews/' + overview_path = '/vsis3/asf-gis-services/overviews/' template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' @@ -311,15 +312,15 @@ def main(): ['Tag', '!Name!.split("_")[9]'], ], ) - - local_overview = os.path.join(os.getcwd(), local_overview_filename) - - logging.info(f'Generating {local_overview}') - with arcpy.EnvManager(cellSize=450): - arcpy.management.CopyRaster( - in_raster=mosaic_dataset, - out_rasterdataset=local_overview, - ) + with tempfile.TemporaryDirectory(dir=raster_store) as temp_dir: + local_overview = os.path.join(temp_dir, local_overview_filename) + + logging.info(f'Generating {local_overview}') + with arcpy.EnvManager(cellSize=450): + arcpy.management.CopyRaster( + in_raster=mosaic_dataset, + out_rasterdataset=local_overview, + ) logging.info(f'Moving CRF to {s3_overview}') subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) From ff8b5dbbaf69ab0b6116ec9aec2f11583c438452 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 23 Oct 2023 16:20:38 -0800 Subject: [PATCH 033/193] correct indent --- image_services/opera/make_opera_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 848e2845..7167e4ea 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -322,8 +322,8 @@ def main(): out_rasterdataset=local_overview, ) - logging.info(f'Moving CRF to {s3_overview}') - subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) + logging.info(f'Moving CRF to {s3_overview}') + subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) logging.info('Adding overview to mosaic dataset') arcpy.management.AddRastersToMosaicDataset( From 0bc31f71ec3c15f470d60c9f16fadd6d41ed4abe Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 20 Oct 2023 15:27:20 -0800 Subject: [PATCH 034/193] fix typo --- image_server/cloudformation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_server/cloudformation.yml b/image_server/cloudformation.yml index 66bca64c..ce872a14 100644 --- a/image_server/cloudformation.yml +++ b/image_server/cloudformation.yml @@ -158,7 +158,7 @@ Resources: Action: - s3:ListBucket - s3:GetBucketAcl - - s3:GetBucketLocataion + - s3:GetBucketLocation Resource: - arn:aws:s3:::* - Effect: Allow From 2ce858f869f3a44dcbc3f9274cf584ca1b667101 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 24 Oct 2023 09:57:38 -0800 Subject: [PATCH 035/193] update small errors --- image_services/opera/config/rtc_vh.json | 28 ++++++++++++++++++++- image_services/opera/make_opera_services.py | 2 +- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 5b8ce93b..cee922c6 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -7,5 +7,31 @@ "Sentinel1_RTC_dB_Stretch.rft.xml", "Sentinel1_RTC_Power.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml" + "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml", + "service_folder": "OPERA", + "service_name": "OPERA_RTC_VH", + "service_definition_overrides": { + "Type": "esriServiceDefinitionType_Replacement", + "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='usageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='waitTimeout']/Value": "120", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='IdleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='keepAliveInterval']/Value": "600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MinInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MaxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='UsageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='WaitTimeout']/Value": "120", + "ItemInfo/Title": "OPERA RTC VH", + "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "ItemInfo/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "ItemInfo/Snippet": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_VH_WMS", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='abstract']/Value": "WMS service for Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + + } } diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 7167e4ea..bd15634e 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -47,7 +47,7 @@ def remove_prefix(raster_path, prefix): def get_raster_metadata(raster_path: str) -> dict: - assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/VV/') + assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/') key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' name = Path(raster_path).stem From d3ff93c9e0b6c33cb68bf76f383cf2f64b32be77 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 24 Oct 2023 09:58:00 -0800 Subject: [PATCH 036/193] point to working dir --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index bd15634e..fe84f3fa 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -185,7 +185,7 @@ def main(): raster_store = '/home/arcgis/raster_store/' bucket = 'hyp3-testing' - overview_path = '/vsis3/asf-gis-services/overviews/' + overview_path = '/vsis3/hyp3-nasa-disasters/overviews/' template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' From 7edf0f16f8d0ca7cab6e1b71e5092fdd608ad551 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 24 Oct 2023 10:07:33 -0800 Subject: [PATCH 037/193] remove space --- image_services/opera/config/rtc_vh.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index cee922c6..310c70ba 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -31,7 +31,6 @@ "ItemInfo/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", "ItemInfo/Snippet": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_VH_WMS", - "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='abstract']/Value": "WMS service for Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", - + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='abstract']/Value": "WMS service for Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL)." } } From 8a2432ec34ea953338d37615bc73fa996f92d6cc Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 24 Oct 2023 10:41:55 -0800 Subject: [PATCH 038/193] fix jsons --- image_services/opera/config/rtc_hh.json | 29 +++++++++++++++++++++++-- image_services/opera/config/rtc_hv.json | 27 ++++++++++++++++++++++- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index bcc32211..0bfbcb93 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -7,5 +7,30 @@ "Sentinel1_RTC_dB_Stretch.rft.xml", "Sentinel1_RTC_Power.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml" -} + "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml", + "service_folder": "OPERA", + "service_name": "OPERA_RTC_HH", + "service_definition_overrides": { + "Type": "esriServiceDefinitionType_Replacement", + "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='usageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='waitTimeout']/Value": "120", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='IdleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='keepAliveInterval']/Value": "600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MinInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MaxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='UsageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='WaitTimeout']/Value": "120", + "ItemInfo/Title": "OPERA RTC HH", + "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "ItemInfo/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "ItemInfo/Snippet": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_HH_WMS", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='abstract']/Value": "WMS service for Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL)." + } +} \ No newline at end of file diff --git a/image_services/opera/config/rtc_hv.json b/image_services/opera/config/rtc_hv.json index d987ded9..98ca2c8d 100644 --- a/image_services/opera/config/rtc_hv.json +++ b/image_services/opera/config/rtc_hv.json @@ -7,5 +7,30 @@ "Sentinel1_RTC_dB_Stretch.rft.xml", "Sentinel1_RTC_Power.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml" + "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml", + "service_folder": "OPERA", + "service_name": "OPERA_RTC_HV", + "service_definition_overrides": { + "Type": "esriServiceDefinitionType_Replacement", + "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='usageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='waitTimeout']/Value": "120", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='IdleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='keepAliveInterval']/Value": "600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MinInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MaxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='UsageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='WaitTimeout']/Value": "120", + "ItemInfo/Title": "OPERA RTC HV", + "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "ItemInfo/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "ItemInfo/Snippet": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_HV_WMS", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='abstract']/Value": "WMS service for Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL)." + } } From f43d5c9815bbc0a6708572443bcea797264722c7 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 24 Oct 2023 13:53:06 -0800 Subject: [PATCH 039/193] add full range of RFTs to OPERA config files --- image_services/opera/config/rtc_hh.json | 10 ++++++---- image_services/opera/config/rtc_hv.json | 8 +++++--- image_services/opera/config/rtc_vh.json | 8 +++++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index 0bfbcb93..c7825df1 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -4,10 +4,12 @@ "s3_suffix": "_HH.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_dB_Stretch.rft.xml", - "Sentinel1_RTC_Power.rft.xml" + "Sentinel1_RTC_Power.rft.xml", + "Sentinel1_RTC_Amplitude.rft.xml", + "Sentinel1_RTC_dB.rft.xml", + "Sentinel1_RTC_dB_Stretch.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml", + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", "service_folder": "OPERA", "service_name": "OPERA_RTC_HH", "service_definition_overrides": { @@ -33,4 +35,4 @@ "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_HH_WMS", "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='abstract']/Value": "WMS service for Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL)." } -} \ No newline at end of file +} diff --git a/image_services/opera/config/rtc_hv.json b/image_services/opera/config/rtc_hv.json index 98ca2c8d..a1ad132b 100644 --- a/image_services/opera/config/rtc_hv.json +++ b/image_services/opera/config/rtc_hv.json @@ -4,10 +4,12 @@ "s3_suffix": "_HV.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_dB_Stretch.rft.xml", - "Sentinel1_RTC_Power.rft.xml" + "Sentinel1_RTC_Power.rft.xml", + "Sentinel1_RTC_Amplitude.rft.xml", + "Sentinel1_RTC_dB.rft.xml", + "Sentinel1_RTC_dB_Stretch.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml", + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", "service_folder": "OPERA", "service_name": "OPERA_RTC_HV", "service_definition_overrides": { diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 310c70ba..2405172e 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -4,10 +4,12 @@ "s3_suffix": "_VH.tif", "dataset_name": "OPERA_TEST", "raster_function_templates": [ - "Sentinel1_RTC_dB_Stretch.rft.xml", - "Sentinel1_RTC_Power.rft.xml" + "Sentinel1_RTC_Power.rft.xml", + "Sentinel1_RTC_Amplitude.rft.xml", + "Sentinel1_RTC_dB.rft.xml", + "Sentinel1_RTC_dB_Stretch.rft.xml" ], - "default_raster_function_template": "Sentinel1_RTC_Power.rft.xml", + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", "service_folder": "OPERA", "service_name": "OPERA_RTC_VH", "service_definition_overrides": { From a43b96be40998308daabbd3db51c86abf98ab220 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 31 Oct 2023 15:46:03 -0800 Subject: [PATCH 040/193] change csv filename to be tagged with the service name --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index fe84f3fa..894b827d 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -192,7 +192,7 @@ def main(): with open(args.config_file) as f: config = json.load(f) - csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') + csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["service_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' for template in config['raster_function_templates']]) From 2e8e6820f3a8022e354e20860725adc47e3d90c0 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 31 Oct 2023 15:47:04 -0800 Subject: [PATCH 041/193] Revert "change csv filename to be tagged with the service name" This reverts commit a43b96be40998308daabbd3db51c86abf98ab220. --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 894b827d..fe84f3fa 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -192,7 +192,7 @@ def main(): with open(args.config_file) as f: config = json.load(f) - csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["service_name"]}.csv') + csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' for template in config['raster_function_templates']]) From 38b1198b561193ae148a26836abdd603ec815b3b Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 31 Oct 2023 15:48:39 -0800 Subject: [PATCH 042/193] change dataset_name variable in OPERA configs to be unique --- image_services/opera/config/rtc_hh.json | 2 +- image_services/opera/config/rtc_hv.json | 2 +- image_services/opera/config/rtc_vh.json | 2 +- image_services/opera/config/rtc_vv.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index c7825df1..76d8c809 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -2,7 +2,7 @@ "project_name": "OPERA", "s3_prefix": "opera-rtc-image-service-prototype/HH", "s3_suffix": "_HH.tif", - "dataset_name": "OPERA_TEST", + "dataset_name": "OPERA_RTC_HH", "raster_function_templates": [ "Sentinel1_RTC_Power.rft.xml", "Sentinel1_RTC_Amplitude.rft.xml", diff --git a/image_services/opera/config/rtc_hv.json b/image_services/opera/config/rtc_hv.json index a1ad132b..4c3ac8af 100644 --- a/image_services/opera/config/rtc_hv.json +++ b/image_services/opera/config/rtc_hv.json @@ -2,7 +2,7 @@ "project_name": "OPERA", "s3_prefix": "opera-rtc-image-service-prototype/HV", "s3_suffix": "_HV.tif", - "dataset_name": "OPERA_TEST", + "dataset_name": "OPERA_RTC_HV", "raster_function_templates": [ "Sentinel1_RTC_Power.rft.xml", "Sentinel1_RTC_Amplitude.rft.xml", diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 2405172e..4e7211ea 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -2,7 +2,7 @@ "project_name": "OPERA", "s3_prefix": "opera-rtc-image-service-prototype/VH", "s3_suffix": "_VH.tif", - "dataset_name": "OPERA_TEST", + "dataset_name": "OPERA_RTC_VH", "raster_function_templates": [ "Sentinel1_RTC_Power.rft.xml", "Sentinel1_RTC_Amplitude.rft.xml", diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index cdc34ef5..690b4b0c 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -2,7 +2,7 @@ "project_name": "OPERA", "s3_prefix": "opera-rtc-image-service-prototype/VV", "s3_suffix": "_VV.tif", - "dataset_name": "OPERA_TEST", + "dataset_name": "OPERA_RTC_VV", "raster_function_templates": [ "Sentinel1_RTC_Power.rft.xml", "Sentinel1_RTC_Amplitude.rft.xml", From bbbb99af1d5986c06bc9ff6c992777a563c9b715 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 31 Oct 2023 15:48:58 -0800 Subject: [PATCH 043/193] add in geodatabase creation script --- image_services/opera/make_opera_dataset.py | 343 +++++++++++++++++++++ 1 file changed, 343 insertions(+) create mode 100644 image_services/opera/make_opera_dataset.py diff --git a/image_services/opera/make_opera_dataset.py b/image_services/opera/make_opera_dataset.py new file mode 100644 index 00000000..012eb3b4 --- /dev/null +++ b/image_services/opera/make_opera_dataset.py @@ -0,0 +1,343 @@ +import argparse +import csv +import datetime +import json +import logging +import os +import subprocess +import tempfile +from pathlib import Path +from typing import List + +import arcpy +import boto3 +from arcgis.gis.server import Server +from lxml import etree +from osgeo import gdal, osr +from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed + + +def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: + rasters = [] + s3 = boto3.client('s3') + paginator = s3.get_paginator('list_objects_v2') + for page in paginator.paginate(Bucket=bucket, Prefix=prefix): + for obj in page['Contents']: + if obj['Key'].endswith(suffix): + rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') + return rasters + + +def get_pixel_type(data_type: str) -> int: + if data_type == 'Byte': + return 3 + if data_type == 'Float32': + return 9 + raise ValueError(f'Unsupported data type: {data_type}') + + +def get_projection(srs_wkt: str) -> str: + srs = osr.SpatialReference() + srs.ImportFromWkt(srs_wkt) + return srs.GetAttrValue('AUTHORITY', 1) + + +def remove_prefix(raster_path, prefix): + return raster_path[len(prefix):] + + +def get_raster_metadata(raster_path: str) -> dict: + assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/') + key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') + download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' + name = Path(raster_path).stem + acquisition_date = name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] + info = gdal.Info(raster_path, format='json') + return { + 'Raster': info['description'], + 'Name': name, + 'xMin': info['cornerCoordinates']['lowerLeft'][0], + 'yMin': info['cornerCoordinates']['lowerLeft'][1], + 'xMax': info['cornerCoordinates']['upperRight'][0], + 'yMax': info['cornerCoordinates']['upperRight'][1], + 'nRows': info['size'][1], + 'nCols': info['size'][0], + 'nBands': len(info['bands']), + 'PixelType': get_pixel_type(info['bands'][0]['type']), + 'SRS': get_projection(info['coordinateSystem']['wkt']), + 'DownloadURL': download_url, + 'URLDisplay': name, + 'Polarization': name.split('_')[9], + 'StartDate': acquisition_date, + 'EndDate': acquisition_date, + } + + +def update_csv(csv_file: str, rasters: List[str]): + if os.path.isfile(csv_file): + with open(csv_file) as f: + records = [record for record in csv.DictReader(f)] + else: + records = [] + logging.info(f'Found {len(records)} items in {csv_file}') + + existing_rasters = [record['Raster'] for record in records] + new_rasters = set(rasters) - set(existing_rasters) + + logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') + for raster in new_rasters: + record = get_raster_metadata(raster) + records.append(record) + + records = sorted(records, key=lambda x: x['Raster']) + with open(csv_file, 'w', newline='') as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) + writer.writeheader() + writer.writerows(records) + + +def calculate_overview_fields(mosaic_dataset, local_path): + # This function calculates custom attribute values for the overview record + print('Calculating field values for overview record') + ds = os.path.join(local_path, mosaic_dataset) + ds_cursor = arcpy.da.UpdateCursor(ds, ['Tag', 'MinPS', 'Category', 'StartDate', 'EndDate', 'GroupName', + 'Name', 'Polarization', 'DownloadURL', 'URLDisplay']) + + logging.info('Calculating Overview Start and End Dates') + start_dates = [row[1] for row in arcpy.da.SearchCursor(mosaic_dataset, ['Tag', 'StartDate']) if row[0] != 'Dataset'] + overview_start_date = min(start_dates).replace(microsecond=0) + datetime.timedelta(hours=-8) + overview_end_date = max(start_dates).replace(microsecond=0) + datetime.timedelta(hours=8) + + if ds_cursor is not None: + print('Updating Overview Field Values') + for row in ds_cursor: + if row[0] == 'Dataset': + _, ProdTypeOvField, PolOvField, _, _, _ = row[6].split('_') + + DLOvField = 'Zoom in further to access download link' + + row[0] = f'{ProdTypeOvField}_{PolOvField}__Overview' + row[1] = 450 + row[2] = 2 + row[3] = overview_start_date + row[4] = overview_end_date + row[5] = f'{ProdTypeOvField}_{PolOvField} Mosaic Overview' + row[7] = PolOvField + row[8] = DLOvField + row[9] = DLOvField + + ds_cursor.updateRow(row) + print('Overview fields updated') + del ds_cursor + + +def add_property(property_set: etree.Element, property_key: str, property_value: str) -> None: + xsi_type = etree.QName('http://www.w3.org/2001/XMLSchema-instance', 'type') + prop = etree.SubElement(property_set, 'PropertySetProperty', {xsi_type: 'typens:PropertySetProperty'}) + etree.SubElement(prop, 'Key').text = property_key + etree.SubElement(prop, 'Value', {xsi_type: 'xs:string'}).text = property_value + + +def build_wms_extension() -> etree.Element: + xsi_type = etree.QName("http://www.w3.org/2001/XMLSchema-instance", "type") + + svc_extension = etree.Element('SVCExtension', {xsi_type: 'typens:SVCExtension'}) + + etree.SubElement(svc_extension, 'Enabled').text = 'true' + etree.SubElement(svc_extension, 'TypeName').text = 'WMSServer' + + property_set = etree.SubElement(svc_extension, 'Props', {xsi_type: 'typens:PropertySet'}) + property_array = etree.SubElement(property_set, 'PropertyArray', {xsi_type: 'typens:ArrayOfPropertySetProperty'}) + add_property(property_array, 'name', 'WMS') + add_property(property_array, 'contactOrganization', 'Alaska Satellite Facility') + add_property(property_array, 'address', '2156 Koyukuk Drive') + add_property(property_array, 'addressType', 'physical') + add_property(property_array, 'city', 'Fairbanks') + add_property(property_array, 'stateOrProvince', 'Alaska') + add_property(property_array, 'country', 'US') + add_property(property_array, 'contactVoiceTelephone', '907-474-5041') + add_property(property_array, 'contactElectronicMailAddress', 'uso@asf.alaska.edu') + add_property(property_array, 'accessConstraints', + 'There are no restrictions on the use of this data, but it must be acknowledged or ' + 'cited as follows: "This imagery was generated by ASF DAAC HyP3 using GAMMA software. ' + 'Contains modified Copernicus Sentinel data, processed by ESA."') + add_property(property_array, 'title', '') + add_property(property_array, 'abstract', '') + + info_property_set = etree.SubElement(svc_extension, 'Info', {xsi_type: 'typens:PropertySet'}) + info_property_array = etree.SubElement(info_property_set, 'PropertyArray', + {xsi_type: 'typens:ArrayOfPropertySetProperty'}) + add_property(info_property_array, 'WebEnabled', 'true') + add_property(info_property_array, 'WebCapabilities', + 'GetCapabilities,GetMap,GetFeatureInfo,GetStyles,GetLegendGraphic,GetSchemaExtension') + + return svc_extension + + +def main(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s') + + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument('--working-directory', default=os.getcwd()) + parser.add_argument('--server-connection-file', default='/home/arcgis/server_connection.json') + parser.add_argument('config_file') + args = parser.parse_args() + + raster_store = '/home/arcgis/raster_store/' + bucket = 'hyp3-testing' + overview_path = '/vsis3/hyp3-nasa-disasters/overviews/' + + template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' + + with open(args.config_file) as f: + config = json.load(f) + + csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') + + raster_function_template = ''.join([f'{template_directory / template};' + for template in config['raster_function_templates']]) + if config['default_raster_function_template'] != 'None': + default_raster_function_template = str(template_directory / config['default_raster_function_template']) + else: + default_raster_function_template = 'None' + + arcpy.env.parallelProcessingFactor = '75%' + + try: + rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) + update_csv(csv_file, rasters) + + for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, + before_sleep=before_sleep_log(logging, logging.WARNING)): + with attempt: + today = datetime.datetime.now(datetime.timezone.utc).strftime('%y%m%d_%H%M') + output_name = f'{config["project_name"]}_{config["dataset_name"]}_{today}' + overview_name = f'{output_name}_overview' + local_overview_filename = f'{overview_name}.crf' + s3_overview = f'{overview_path}{overview_name}.crf' + service_definition = os.path.join(args.working_directory, f'{output_name}.sd') + + logging.info('Creating geodatabase') + geodatabase = arcpy.management.CreateFileGDB( + out_folder_path=args.working_directory, + out_name=f'{output_name}.gdb', + ) + + logging.info('Creating mosaic dataset') + mosaic_dataset = str(arcpy.management.CreateMosaicDataset( + in_workspace=geodatabase, + in_mosaicdataset_name=config['dataset_name'], + coordinate_system=3857, + )) + + logging.info(f'Adding source rasters to {mosaic_dataset}') + arcpy.management.AddRastersToMosaicDataset( + in_mosaic_dataset=mosaic_dataset, + raster_type='Table', + input_path=csv_file, + ) + + logging.info(f'Building raster footprints for {mosaic_dataset}') + arcpy.management.BuildFootprints( + in_mosaic_dataset=mosaic_dataset, + reset_footprint='NONE', + min_data_value=0, + max_data_value=4294967295, + approx_num_vertices=12, + update_boundary='UPDATE_BOUNDARY', + ) + + logging.info(f'Building {mosaic_dataset} dataset boundary') + arcpy.management.BuildBoundary( + in_mosaic_dataset=mosaic_dataset, + append_to_existing='OVERWRITE', + simplification_method='NONE', + ) + + logging.info(f'Setting properties for {mosaic_dataset}') + arcpy.management.SetMosaicDatasetProperties( + in_mosaic_dataset=mosaic_dataset, + rows_maximum_imagesize=5000, + columns_maximum_imagesize=5000, + allowed_compressions='JPEG;NONE;LZ77', + default_compression_type='JPEG', + JPEG_quality=80, + resampling_type='NEAREST', + LERC_Tolerance=0.01, + clip_to_footprints='CLIP', + clip_to_boundary='CLIP', + color_correction='NOT_APPLY', + footprints_may_contain_nodata='FOOTPRINTS_MAY_CONTAIN_NODATA', + allowed_mensuration_capabilities='BASIC', + default_mensuration_capabilities='BASIC', + allowed_mosaic_methods='Center;NorthWest;Nadir;LockRaster;ByAttribute;Seamline;None', + default_mosaic_method='ByAttribute', + order_field='StartDate', + order_base='1/1/2050 12:00:00 AM', + sorting_order='Ascending', + mosaic_operator='FIRST', + blend_width=10, + view_point_x=300, + view_point_y=300, + max_num_per_mosaic=50, + cell_size_tolerance=1.8, + cell_size=3, + metadata_level='BASIC', + transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;ZOrder;Dataset_ID;CenterX;' + 'CenterY;Tag;ProductName;GroupName;DownloadURL;URLDisplay', + use_time='ENABLED', + start_time_field='StartDate', + end_time_field='EndDate', + max_num_of_download_items=50, + max_num_of_records_returned=2000, + processing_templates=f'{raster_function_template}None', + default_processing_template=default_raster_function_template, + ) + + logging.info('Calculating cell size ranges') + arcpy.management.CalculateCellSizeRanges( + in_mosaic_dataset=mosaic_dataset, + do_compute_min='NO_MIN_CELL_SIZES', + do_compute_max='NO_MAX_CELL_SIZES', + max_range_factor=10, + cell_size_tolerance_factor=0.8, + update_missing_only='UPDATE_ALL', + ) + + logging.info(f'Calculating custom field values in {mosaic_dataset}') + arcpy.management.CalculateFields( + in_table=mosaic_dataset, + fields=[ + ['MaxPS', '460'], + ['Tag', '!Name!.split("_")[9]'], + ], + ) + with tempfile.TemporaryDirectory(dir=raster_store) as temp_dir: + local_overview = os.path.join(temp_dir, local_overview_filename) + + logging.info(f'Generating {local_overview}') + with arcpy.EnvManager(cellSize=450): + arcpy.management.CopyRaster( + in_raster=mosaic_dataset, + out_rasterdataset=local_overview, + ) + + logging.info(f'Moving CRF to {s3_overview}') + subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) + + logging.info('Adding overview to mosaic dataset') + arcpy.management.AddRastersToMosaicDataset( + in_mosaic_dataset=mosaic_dataset, + raster_type='Raster Dataset', + input_path=s3_overview, + ) + + calculate_overview_fields(mosaic_dataset, args.working_directory) + + except arcpy.ExecuteError: + logging.error(arcpy.GetMessages()) + raise + + +if __name__ == '__main__': + main() From c1263fd2c0cad69b439d65f97fa4777d92a8b9b7 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 31 Oct 2023 16:08:21 -0800 Subject: [PATCH 044/193] remove script --- image_services/opera/make_opera_dataset.py | 343 --------------------- 1 file changed, 343 deletions(-) delete mode 100644 image_services/opera/make_opera_dataset.py diff --git a/image_services/opera/make_opera_dataset.py b/image_services/opera/make_opera_dataset.py deleted file mode 100644 index 012eb3b4..00000000 --- a/image_services/opera/make_opera_dataset.py +++ /dev/null @@ -1,343 +0,0 @@ -import argparse -import csv -import datetime -import json -import logging -import os -import subprocess -import tempfile -from pathlib import Path -from typing import List - -import arcpy -import boto3 -from arcgis.gis.server import Server -from lxml import etree -from osgeo import gdal, osr -from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed - - -def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: - rasters = [] - s3 = boto3.client('s3') - paginator = s3.get_paginator('list_objects_v2') - for page in paginator.paginate(Bucket=bucket, Prefix=prefix): - for obj in page['Contents']: - if obj['Key'].endswith(suffix): - rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') - return rasters - - -def get_pixel_type(data_type: str) -> int: - if data_type == 'Byte': - return 3 - if data_type == 'Float32': - return 9 - raise ValueError(f'Unsupported data type: {data_type}') - - -def get_projection(srs_wkt: str) -> str: - srs = osr.SpatialReference() - srs.ImportFromWkt(srs_wkt) - return srs.GetAttrValue('AUTHORITY', 1) - - -def remove_prefix(raster_path, prefix): - return raster_path[len(prefix):] - - -def get_raster_metadata(raster_path: str) -> dict: - assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/') - key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') - download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' - name = Path(raster_path).stem - acquisition_date = name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] - info = gdal.Info(raster_path, format='json') - return { - 'Raster': info['description'], - 'Name': name, - 'xMin': info['cornerCoordinates']['lowerLeft'][0], - 'yMin': info['cornerCoordinates']['lowerLeft'][1], - 'xMax': info['cornerCoordinates']['upperRight'][0], - 'yMax': info['cornerCoordinates']['upperRight'][1], - 'nRows': info['size'][1], - 'nCols': info['size'][0], - 'nBands': len(info['bands']), - 'PixelType': get_pixel_type(info['bands'][0]['type']), - 'SRS': get_projection(info['coordinateSystem']['wkt']), - 'DownloadURL': download_url, - 'URLDisplay': name, - 'Polarization': name.split('_')[9], - 'StartDate': acquisition_date, - 'EndDate': acquisition_date, - } - - -def update_csv(csv_file: str, rasters: List[str]): - if os.path.isfile(csv_file): - with open(csv_file) as f: - records = [record for record in csv.DictReader(f)] - else: - records = [] - logging.info(f'Found {len(records)} items in {csv_file}') - - existing_rasters = [record['Raster'] for record in records] - new_rasters = set(rasters) - set(existing_rasters) - - logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') - for raster in new_rasters: - record = get_raster_metadata(raster) - records.append(record) - - records = sorted(records, key=lambda x: x['Raster']) - with open(csv_file, 'w', newline='') as csvfile: - writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) - writer.writeheader() - writer.writerows(records) - - -def calculate_overview_fields(mosaic_dataset, local_path): - # This function calculates custom attribute values for the overview record - print('Calculating field values for overview record') - ds = os.path.join(local_path, mosaic_dataset) - ds_cursor = arcpy.da.UpdateCursor(ds, ['Tag', 'MinPS', 'Category', 'StartDate', 'EndDate', 'GroupName', - 'Name', 'Polarization', 'DownloadURL', 'URLDisplay']) - - logging.info('Calculating Overview Start and End Dates') - start_dates = [row[1] for row in arcpy.da.SearchCursor(mosaic_dataset, ['Tag', 'StartDate']) if row[0] != 'Dataset'] - overview_start_date = min(start_dates).replace(microsecond=0) + datetime.timedelta(hours=-8) - overview_end_date = max(start_dates).replace(microsecond=0) + datetime.timedelta(hours=8) - - if ds_cursor is not None: - print('Updating Overview Field Values') - for row in ds_cursor: - if row[0] == 'Dataset': - _, ProdTypeOvField, PolOvField, _, _, _ = row[6].split('_') - - DLOvField = 'Zoom in further to access download link' - - row[0] = f'{ProdTypeOvField}_{PolOvField}__Overview' - row[1] = 450 - row[2] = 2 - row[3] = overview_start_date - row[4] = overview_end_date - row[5] = f'{ProdTypeOvField}_{PolOvField} Mosaic Overview' - row[7] = PolOvField - row[8] = DLOvField - row[9] = DLOvField - - ds_cursor.updateRow(row) - print('Overview fields updated') - del ds_cursor - - -def add_property(property_set: etree.Element, property_key: str, property_value: str) -> None: - xsi_type = etree.QName('http://www.w3.org/2001/XMLSchema-instance', 'type') - prop = etree.SubElement(property_set, 'PropertySetProperty', {xsi_type: 'typens:PropertySetProperty'}) - etree.SubElement(prop, 'Key').text = property_key - etree.SubElement(prop, 'Value', {xsi_type: 'xs:string'}).text = property_value - - -def build_wms_extension() -> etree.Element: - xsi_type = etree.QName("http://www.w3.org/2001/XMLSchema-instance", "type") - - svc_extension = etree.Element('SVCExtension', {xsi_type: 'typens:SVCExtension'}) - - etree.SubElement(svc_extension, 'Enabled').text = 'true' - etree.SubElement(svc_extension, 'TypeName').text = 'WMSServer' - - property_set = etree.SubElement(svc_extension, 'Props', {xsi_type: 'typens:PropertySet'}) - property_array = etree.SubElement(property_set, 'PropertyArray', {xsi_type: 'typens:ArrayOfPropertySetProperty'}) - add_property(property_array, 'name', 'WMS') - add_property(property_array, 'contactOrganization', 'Alaska Satellite Facility') - add_property(property_array, 'address', '2156 Koyukuk Drive') - add_property(property_array, 'addressType', 'physical') - add_property(property_array, 'city', 'Fairbanks') - add_property(property_array, 'stateOrProvince', 'Alaska') - add_property(property_array, 'country', 'US') - add_property(property_array, 'contactVoiceTelephone', '907-474-5041') - add_property(property_array, 'contactElectronicMailAddress', 'uso@asf.alaska.edu') - add_property(property_array, 'accessConstraints', - 'There are no restrictions on the use of this data, but it must be acknowledged or ' - 'cited as follows: "This imagery was generated by ASF DAAC HyP3 using GAMMA software. ' - 'Contains modified Copernicus Sentinel data, processed by ESA."') - add_property(property_array, 'title', '') - add_property(property_array, 'abstract', '') - - info_property_set = etree.SubElement(svc_extension, 'Info', {xsi_type: 'typens:PropertySet'}) - info_property_array = etree.SubElement(info_property_set, 'PropertyArray', - {xsi_type: 'typens:ArrayOfPropertySetProperty'}) - add_property(info_property_array, 'WebEnabled', 'true') - add_property(info_property_array, 'WebCapabilities', - 'GetCapabilities,GetMap,GetFeatureInfo,GetStyles,GetLegendGraphic,GetSchemaExtension') - - return svc_extension - - -def main(): - logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s') - - parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--working-directory', default=os.getcwd()) - parser.add_argument('--server-connection-file', default='/home/arcgis/server_connection.json') - parser.add_argument('config_file') - args = parser.parse_args() - - raster_store = '/home/arcgis/raster_store/' - bucket = 'hyp3-testing' - overview_path = '/vsis3/hyp3-nasa-disasters/overviews/' - - template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' - - with open(args.config_file) as f: - config = json.load(f) - - csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') - - raster_function_template = ''.join([f'{template_directory / template};' - for template in config['raster_function_templates']]) - if config['default_raster_function_template'] != 'None': - default_raster_function_template = str(template_directory / config['default_raster_function_template']) - else: - default_raster_function_template = 'None' - - arcpy.env.parallelProcessingFactor = '75%' - - try: - rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) - update_csv(csv_file, rasters) - - for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, - before_sleep=before_sleep_log(logging, logging.WARNING)): - with attempt: - today = datetime.datetime.now(datetime.timezone.utc).strftime('%y%m%d_%H%M') - output_name = f'{config["project_name"]}_{config["dataset_name"]}_{today}' - overview_name = f'{output_name}_overview' - local_overview_filename = f'{overview_name}.crf' - s3_overview = f'{overview_path}{overview_name}.crf' - service_definition = os.path.join(args.working_directory, f'{output_name}.sd') - - logging.info('Creating geodatabase') - geodatabase = arcpy.management.CreateFileGDB( - out_folder_path=args.working_directory, - out_name=f'{output_name}.gdb', - ) - - logging.info('Creating mosaic dataset') - mosaic_dataset = str(arcpy.management.CreateMosaicDataset( - in_workspace=geodatabase, - in_mosaicdataset_name=config['dataset_name'], - coordinate_system=3857, - )) - - logging.info(f'Adding source rasters to {mosaic_dataset}') - arcpy.management.AddRastersToMosaicDataset( - in_mosaic_dataset=mosaic_dataset, - raster_type='Table', - input_path=csv_file, - ) - - logging.info(f'Building raster footprints for {mosaic_dataset}') - arcpy.management.BuildFootprints( - in_mosaic_dataset=mosaic_dataset, - reset_footprint='NONE', - min_data_value=0, - max_data_value=4294967295, - approx_num_vertices=12, - update_boundary='UPDATE_BOUNDARY', - ) - - logging.info(f'Building {mosaic_dataset} dataset boundary') - arcpy.management.BuildBoundary( - in_mosaic_dataset=mosaic_dataset, - append_to_existing='OVERWRITE', - simplification_method='NONE', - ) - - logging.info(f'Setting properties for {mosaic_dataset}') - arcpy.management.SetMosaicDatasetProperties( - in_mosaic_dataset=mosaic_dataset, - rows_maximum_imagesize=5000, - columns_maximum_imagesize=5000, - allowed_compressions='JPEG;NONE;LZ77', - default_compression_type='JPEG', - JPEG_quality=80, - resampling_type='NEAREST', - LERC_Tolerance=0.01, - clip_to_footprints='CLIP', - clip_to_boundary='CLIP', - color_correction='NOT_APPLY', - footprints_may_contain_nodata='FOOTPRINTS_MAY_CONTAIN_NODATA', - allowed_mensuration_capabilities='BASIC', - default_mensuration_capabilities='BASIC', - allowed_mosaic_methods='Center;NorthWest;Nadir;LockRaster;ByAttribute;Seamline;None', - default_mosaic_method='ByAttribute', - order_field='StartDate', - order_base='1/1/2050 12:00:00 AM', - sorting_order='Ascending', - mosaic_operator='FIRST', - blend_width=10, - view_point_x=300, - view_point_y=300, - max_num_per_mosaic=50, - cell_size_tolerance=1.8, - cell_size=3, - metadata_level='BASIC', - transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;ZOrder;Dataset_ID;CenterX;' - 'CenterY;Tag;ProductName;GroupName;DownloadURL;URLDisplay', - use_time='ENABLED', - start_time_field='StartDate', - end_time_field='EndDate', - max_num_of_download_items=50, - max_num_of_records_returned=2000, - processing_templates=f'{raster_function_template}None', - default_processing_template=default_raster_function_template, - ) - - logging.info('Calculating cell size ranges') - arcpy.management.CalculateCellSizeRanges( - in_mosaic_dataset=mosaic_dataset, - do_compute_min='NO_MIN_CELL_SIZES', - do_compute_max='NO_MAX_CELL_SIZES', - max_range_factor=10, - cell_size_tolerance_factor=0.8, - update_missing_only='UPDATE_ALL', - ) - - logging.info(f'Calculating custom field values in {mosaic_dataset}') - arcpy.management.CalculateFields( - in_table=mosaic_dataset, - fields=[ - ['MaxPS', '460'], - ['Tag', '!Name!.split("_")[9]'], - ], - ) - with tempfile.TemporaryDirectory(dir=raster_store) as temp_dir: - local_overview = os.path.join(temp_dir, local_overview_filename) - - logging.info(f'Generating {local_overview}') - with arcpy.EnvManager(cellSize=450): - arcpy.management.CopyRaster( - in_raster=mosaic_dataset, - out_rasterdataset=local_overview, - ) - - logging.info(f'Moving CRF to {s3_overview}') - subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) - - logging.info('Adding overview to mosaic dataset') - arcpy.management.AddRastersToMosaicDataset( - in_mosaic_dataset=mosaic_dataset, - raster_type='Raster Dataset', - input_path=s3_overview, - ) - - calculate_overview_fields(mosaic_dataset, args.working_directory) - - except arcpy.ExecuteError: - logging.error(arcpy.GetMessages()) - raise - - -if __name__ == '__main__': - main() From 27885923981e16dc1ca9fa372783fa9224e98aec Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 31 Oct 2023 16:20:51 -0800 Subject: [PATCH 045/193] change dataset_name variable in OPERA configs to remove extra OPERA --- image_services/opera/config/rtc_hh.json | 2 +- image_services/opera/config/rtc_hv.json | 2 +- image_services/opera/config/rtc_vh.json | 2 +- image_services/opera/config/rtc_vv.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index 76d8c809..1f8e352c 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -2,7 +2,7 @@ "project_name": "OPERA", "s3_prefix": "opera-rtc-image-service-prototype/HH", "s3_suffix": "_HH.tif", - "dataset_name": "OPERA_RTC_HH", + "dataset_name": "RTC_HH", "raster_function_templates": [ "Sentinel1_RTC_Power.rft.xml", "Sentinel1_RTC_Amplitude.rft.xml", diff --git a/image_services/opera/config/rtc_hv.json b/image_services/opera/config/rtc_hv.json index 4c3ac8af..331ff83b 100644 --- a/image_services/opera/config/rtc_hv.json +++ b/image_services/opera/config/rtc_hv.json @@ -2,7 +2,7 @@ "project_name": "OPERA", "s3_prefix": "opera-rtc-image-service-prototype/HV", "s3_suffix": "_HV.tif", - "dataset_name": "OPERA_RTC_HV", + "dataset_name": "RTC_HV", "raster_function_templates": [ "Sentinel1_RTC_Power.rft.xml", "Sentinel1_RTC_Amplitude.rft.xml", diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 4e7211ea..1e851e39 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -2,7 +2,7 @@ "project_name": "OPERA", "s3_prefix": "opera-rtc-image-service-prototype/VH", "s3_suffix": "_VH.tif", - "dataset_name": "OPERA_RTC_VH", + "dataset_name": "RTC_VH", "raster_function_templates": [ "Sentinel1_RTC_Power.rft.xml", "Sentinel1_RTC_Amplitude.rft.xml", diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index 690b4b0c..7bbfc037 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -2,7 +2,7 @@ "project_name": "OPERA", "s3_prefix": "opera-rtc-image-service-prototype/VV", "s3_suffix": "_VV.tif", - "dataset_name": "OPERA_RTC_VV", + "dataset_name": "RTC_VV", "raster_function_templates": [ "Sentinel1_RTC_Power.rft.xml", "Sentinel1_RTC_Amplitude.rft.xml", From bc3075ce7af42182d44406ce80f76ae58b2ae2d4 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 31 Oct 2023 17:11:36 -0800 Subject: [PATCH 046/193] clean up attribute field calculations --- image_services/opera/make_opera_services.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index fe84f3fa..283cea82 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -70,6 +70,7 @@ def get_raster_metadata(raster_path: str) -> dict: 'Polarization': name.split('_')[9], 'StartDate': acquisition_date, 'EndDate': acquisition_date, + 'GroupName': name.rsplit('_', 1)[0], } @@ -112,11 +113,11 @@ def calculate_overview_fields(mosaic_dataset, local_path): print('Updating Overview Field Values') for row in ds_cursor: if row[0] == 'Dataset': - _, ProdTypeOvField, PolOvField, _, _, _ = row[6].split('_') + ProjectName, ProdTypeOvField, PolOvField, _, _, _ = row[6].split('_') DLOvField = 'Zoom in further to access download link' - row[0] = f'{ProdTypeOvField}_{PolOvField}__Overview' + row[0] = f'{ProjectName}_{ProdTypeOvField}_{PolOvField}_Overview' row[1] = 450 row[2] = 2 row[3] = overview_start_date @@ -283,8 +284,8 @@ def main(): cell_size_tolerance=1.8, cell_size=3, metadata_level='BASIC', - transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;ZOrder;Dataset_ID;CenterX;' - 'CenterY;Tag;ProductName;GroupName;DownloadURL;URLDisplay', + transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;Dataset_ID;CenterX;' + 'CenterY;Tag;GroupName;Polarization;DownloadURL;URLDisplay', use_time='ENABLED', start_time_field='StartDate', end_time_field='EndDate', From 7509b7159b75d9fa7a540717ee081db9acda94e8 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 31 Oct 2023 17:27:07 -0800 Subject: [PATCH 047/193] improve tag text --- image_services/opera/make_opera_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 283cea82..5b8497b2 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -122,7 +122,7 @@ def calculate_overview_fields(mosaic_dataset, local_path): row[2] = 2 row[3] = overview_start_date row[4] = overview_end_date - row[5] = f'{ProdTypeOvField}_{PolOvField} Mosaic Overview' + row[5] = f'{ProjectName}_{ProdTypeOvField}_{PolOvField} Mosaic Overview' row[7] = PolOvField row[8] = DLOvField row[9] = DLOvField @@ -310,7 +310,7 @@ def main(): in_table=mosaic_dataset, fields=[ ['MaxPS', '460'], - ['Tag', '!Name!.split("_")[9]'], + ['Tag', '"_".join(!Name!.split("_")[0:3] + [!Name!.split("_")[9]])'], ], ) with tempfile.TemporaryDirectory(dir=raster_store) as temp_dir: From 2aa65f49f605d9ea2d1de7f3a66f9d0ef6b26a3f Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 31 Oct 2023 17:35:10 -0800 Subject: [PATCH 048/193] set GroupName attribute text --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 5b8497b2..0908ef1d 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -70,7 +70,6 @@ def get_raster_metadata(raster_path: str) -> dict: 'Polarization': name.split('_')[9], 'StartDate': acquisition_date, 'EndDate': acquisition_date, - 'GroupName': name.rsplit('_', 1)[0], } @@ -311,6 +310,7 @@ def main(): fields=[ ['MaxPS', '460'], ['Tag', '"_".join(!Name!.split("_")[0:3] + [!Name!.split("_")[9]])'], + ['GroupName', '!Name!.rsplit("_", 1)[0]'], ], ) with tempfile.TemporaryDirectory(dir=raster_store) as temp_dir: From e6a7ea38f69b40e4b80970879a37656d3f5c2e38 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Wed, 1 Nov 2023 07:54:51 -0800 Subject: [PATCH 049/193] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b147ca6..b4cf6bec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.6.6] ### Added -- Scripts to generate OPERA services using EDC-hosted source rasters in the `asf-cumulus-prod-opera-products` S3 bucket +- Scripts to generate OPERA RTC services ## [0.6.5] ### Changed From ab30db93df727d3e806b68c2f64c23c64076f20e Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 1 Nov 2023 10:50:45 -0800 Subject: [PATCH 050/193] add new line --- image_services/opera/make_opera_services.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 0908ef1d..2d8b3dff 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -51,7 +51,8 @@ def get_raster_metadata(raster_path: str) -> dict: key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' name = Path(raster_path).stem - acquisition_date = name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] + acquisition_date = name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + \ + ':' + name[45:47] info = gdal.Info(raster_path, format='json') return { 'Raster': info['description'], @@ -284,7 +285,7 @@ def main(): cell_size=3, metadata_level='BASIC', transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;Dataset_ID;CenterX;' - 'CenterY;Tag;GroupName;Polarization;DownloadURL;URLDisplay', + 'CenterY;Tag;GroupName;Polarization;DownloadURL;URLDisplay', use_time='ENABLED', start_time_field='StartDate', end_time_field='EndDate', From 172bc8d8f79c74c8ab4a2a2f22b1e42d732377d0 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 1 Nov 2023 11:21:47 -0800 Subject: [PATCH 051/193] reformat for flake8 --- image_services/opera/make_opera_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 2d8b3dff..3cd581e2 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -51,8 +51,8 @@ def get_raster_metadata(raster_path: str) -> dict: key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' name = Path(raster_path).stem - acquisition_date = name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + \ - ':' + name[45:47] + acquisition_date = \ + name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] info = gdal.Info(raster_path, format='json') return { 'Raster': info['description'], From 786184cd16e1e8e120da663279bc1c311ff5528a Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Wed, 1 Nov 2023 15:27:07 -0800 Subject: [PATCH 052/193] start a new script that's just for publishing locally --- image_services/opera/make_opera_database.py | 346 ++++++++++++++++++++ 1 file changed, 346 insertions(+) create mode 100644 image_services/opera/make_opera_database.py diff --git a/image_services/opera/make_opera_database.py b/image_services/opera/make_opera_database.py new file mode 100644 index 00000000..1c424c28 --- /dev/null +++ b/image_services/opera/make_opera_database.py @@ -0,0 +1,346 @@ +import argparse +import csv +import datetime +import json +import logging +import os +import subprocess +import tempfile +from pathlib import Path +from typing import List + +import arcpy +import boto3 +from arcgis.gis.server import Server +from lxml import etree +from osgeo import gdal, osr +from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed + + +def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: + rasters = [] + s3 = boto3.client('s3') + paginator = s3.get_paginator('list_objects_v2') + for page in paginator.paginate(Bucket=bucket, Prefix=prefix): + for obj in page['Contents']: + if obj['Key'].endswith(suffix): + rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') + return rasters + + +def get_pixel_type(data_type: str) -> int: + if data_type == 'Byte': + return 3 + if data_type == 'Float32': + return 9 + raise ValueError(f'Unsupported data type: {data_type}') + + +def get_projection(srs_wkt: str) -> str: + srs = osr.SpatialReference() + srs.ImportFromWkt(srs_wkt) + return srs.GetAttrValue('AUTHORITY', 1) + + +def remove_prefix(raster_path, prefix): + return raster_path[len(prefix):] + + +def get_raster_metadata(raster_path: str) -> dict: + assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/') + key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') + download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' + name = Path(raster_path).stem + acquisition_date = \ + name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] + info = gdal.Info(raster_path, format='json') + return { + 'Raster': info['description'], + 'Name': name, + 'xMin': info['cornerCoordinates']['lowerLeft'][0], + 'yMin': info['cornerCoordinates']['lowerLeft'][1], + 'xMax': info['cornerCoordinates']['upperRight'][0], + 'yMax': info['cornerCoordinates']['upperRight'][1], + 'nRows': info['size'][1], + 'nCols': info['size'][0], + 'nBands': len(info['bands']), + 'PixelType': get_pixel_type(info['bands'][0]['type']), + 'SRS': get_projection(info['coordinateSystem']['wkt']), + 'DownloadURL': download_url, + 'URLDisplay': name, + 'Polarization': name.split('_')[9], + 'StartDate': acquisition_date, + 'EndDate': acquisition_date, + } + + +def update_csv(csv_file: str, rasters: List[str]): + if os.path.isfile(csv_file): + with open(csv_file) as f: + records = [record for record in csv.DictReader(f)] + else: + records = [] + logging.info(f'Found {len(records)} items in {csv_file}') + + existing_rasters = [record['Raster'] for record in records] + new_rasters = set(rasters) - set(existing_rasters) + + logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') + for raster in new_rasters: + record = get_raster_metadata(raster) + records.append(record) + + records = sorted(records, key=lambda x: x['Raster']) + with open(csv_file, 'w', newline='') as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) + writer.writeheader() + writer.writerows(records) + + +def calculate_overview_fields(mosaic_dataset, local_path): + # This function calculates custom attribute values for the overview record + print('Calculating field values for overview record') + ds = os.path.join(local_path, mosaic_dataset) + ds_cursor = arcpy.da.UpdateCursor(ds, ['Tag', 'MinPS', 'Category', 'StartDate', 'EndDate', 'GroupName', + 'Name', 'Polarization', 'DownloadURL', 'URLDisplay']) + + logging.info('Calculating Overview Start and End Dates') + start_dates = [row[1] for row in arcpy.da.SearchCursor(mosaic_dataset, ['Tag', 'StartDate']) if row[0] != 'Dataset'] + overview_start_date = min(start_dates).replace(microsecond=0) + datetime.timedelta(hours=-8) + overview_end_date = max(start_dates).replace(microsecond=0) + datetime.timedelta(hours=8) + + if ds_cursor is not None: + print('Updating Overview Field Values') + for row in ds_cursor: + if row[0] == 'Dataset': + ProjectName, ProdTypeOvField, PolOvField, _, _, _ = row[6].split('_') + + DLOvField = 'Zoom in further to access download link' + + row[0] = f'{ProjectName}_{ProdTypeOvField}_{PolOvField}_Overview' + row[1] = 450 + row[2] = 2 + row[3] = overview_start_date + row[4] = overview_end_date + row[5] = f'{ProjectName}_{ProdTypeOvField}_{PolOvField} Mosaic Overview' + row[7] = PolOvField + row[8] = DLOvField + row[9] = DLOvField + + ds_cursor.updateRow(row) + print('Overview fields updated') + del ds_cursor + + +def add_property(property_set: etree.Element, property_key: str, property_value: str) -> None: + xsi_type = etree.QName('http://www.w3.org/2001/XMLSchema-instance', 'type') + prop = etree.SubElement(property_set, 'PropertySetProperty', {xsi_type: 'typens:PropertySetProperty'}) + etree.SubElement(prop, 'Key').text = property_key + etree.SubElement(prop, 'Value', {xsi_type: 'xs:string'}).text = property_value + + +def build_wms_extension() -> etree.Element: + xsi_type = etree.QName("http://www.w3.org/2001/XMLSchema-instance", "type") + + svc_extension = etree.Element('SVCExtension', {xsi_type: 'typens:SVCExtension'}) + + etree.SubElement(svc_extension, 'Enabled').text = 'true' + etree.SubElement(svc_extension, 'TypeName').text = 'WMSServer' + + property_set = etree.SubElement(svc_extension, 'Props', {xsi_type: 'typens:PropertySet'}) + property_array = etree.SubElement(property_set, 'PropertyArray', {xsi_type: 'typens:ArrayOfPropertySetProperty'}) + add_property(property_array, 'name', 'WMS') + add_property(property_array, 'contactOrganization', 'Alaska Satellite Facility') + add_property(property_array, 'address', '2156 Koyukuk Drive') + add_property(property_array, 'addressType', 'physical') + add_property(property_array, 'city', 'Fairbanks') + add_property(property_array, 'stateOrProvince', 'Alaska') + add_property(property_array, 'country', 'US') + add_property(property_array, 'contactVoiceTelephone', '907-474-5041') + add_property(property_array, 'contactElectronicMailAddress', 'uso@asf.alaska.edu') + add_property(property_array, 'accessConstraints', + 'There are no restrictions on the use of this data, but it must be acknowledged or ' + 'cited as follows: "This imagery was generated by ASF DAAC HyP3 using GAMMA software. ' + 'Contains modified Copernicus Sentinel data, processed by ESA."') + add_property(property_array, 'title', '') + add_property(property_array, 'abstract', '') + + info_property_set = etree.SubElement(svc_extension, 'Info', {xsi_type: 'typens:PropertySet'}) + info_property_array = etree.SubElement(info_property_set, 'PropertyArray', + {xsi_type: 'typens:ArrayOfPropertySetProperty'}) + add_property(info_property_array, 'WebEnabled', 'true') + add_property(info_property_array, 'WebCapabilities', + 'GetCapabilities,GetMap,GetFeatureInfo,GetStyles,GetLegendGraphic,GetSchemaExtension') + + return svc_extension + + +def main(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s') + + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument('--working-directory', default=os.getcwd()) + parser.add_argument('--server-connection-file', default='/home/arcgis/server_connection.json') + parser.add_argument('config_file') + args = parser.parse_args() + + os.environ['AWS_PROFILE'] = 'hyp3' + raster_store = os.getcwd() + r'\raster_store' + bucket = 'hyp3-testing' + overview_path = '/vsis3/hyp3-nasa-disasters/overviews/' + + template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' + + with open(args.config_file) as f: + config = json.load(f) + + csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') + + raster_function_template = ''.join([f'{template_directory / template};' + for template in config['raster_function_templates']]) + if config['default_raster_function_template'] != 'None': + default_raster_function_template = str(template_directory / config['default_raster_function_template']) + else: + default_raster_function_template = 'None' + + arcpy.env.parallelProcessingFactor = '75%' + + try: + rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) + update_csv(csv_file, rasters) + + for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, + before_sleep=before_sleep_log(logging, logging.WARNING)): + with attempt: + today = datetime.datetime.now(datetime.timezone.utc).strftime('%y%m%d_%H%M') + output_name = f'{config["project_name"]}_{config["dataset_name"]}_{today}' + overview_name = f'{output_name}_overview' + local_overview_filename = f'{overview_name}.crf' + s3_overview = f'{overview_path}{overview_name}.crf' + service_definition = os.path.join(args.working_directory, f'{output_name}.sd') + + logging.info('Creating geodatabase') + geodatabase = arcpy.management.CreateFileGDB( + out_folder_path=args.working_directory, + out_name=f'{output_name}.gdb', + ) + + logging.info('Creating mosaic dataset') + mosaic_dataset = str(arcpy.management.CreateMosaicDataset( + in_workspace=geodatabase, + in_mosaicdataset_name=config['dataset_name'], + coordinate_system=3857, + )) + + logging.info(f'Adding source rasters to {mosaic_dataset}') + arcpy.management.AddRastersToMosaicDataset( + in_mosaic_dataset=mosaic_dataset, + raster_type='Table', + input_path=csv_file, + ) + + logging.info(f'Building raster footprints for {mosaic_dataset}') + arcpy.management.BuildFootprints( + in_mosaic_dataset=mosaic_dataset, + reset_footprint='NONE', + min_data_value=0, + max_data_value=4294967295, + approx_num_vertices=12, + update_boundary='UPDATE_BOUNDARY', + ) + + logging.info(f'Building {mosaic_dataset} dataset boundary') + arcpy.management.BuildBoundary( + in_mosaic_dataset=mosaic_dataset, + append_to_existing='OVERWRITE', + simplification_method='NONE', + ) + + logging.info(f'Setting properties for {mosaic_dataset}') + arcpy.management.SetMosaicDatasetProperties( + in_mosaic_dataset=mosaic_dataset, + rows_maximum_imagesize=5000, + columns_maximum_imagesize=5000, + allowed_compressions='JPEG;NONE;LZ77', + default_compression_type='JPEG', + JPEG_quality=80, + resampling_type='NEAREST', + LERC_Tolerance=0.01, + clip_to_footprints='CLIP', + clip_to_boundary='CLIP', + color_correction='NOT_APPLY', + footprints_may_contain_nodata='FOOTPRINTS_MAY_CONTAIN_NODATA', + allowed_mensuration_capabilities='BASIC', + default_mensuration_capabilities='BASIC', + allowed_mosaic_methods='Center;NorthWest;Nadir;LockRaster;ByAttribute;Seamline;None', + default_mosaic_method='ByAttribute', + order_field='StartDate', + order_base='1/1/2050 12:00:00 AM', + sorting_order='Ascending', + mosaic_operator='FIRST', + blend_width=10, + view_point_x=300, + view_point_y=300, + max_num_per_mosaic=50, + cell_size_tolerance=1.8, + cell_size=3, + metadata_level='BASIC', + transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;Dataset_ID;CenterX;' + 'CenterY;Tag;GroupName;Polarization;DownloadURL;URLDisplay', + use_time='ENABLED', + start_time_field='StartDate', + end_time_field='EndDate', + max_num_of_download_items=50, + max_num_of_records_returned=2000, + processing_templates=f'{raster_function_template}None', + default_processing_template=default_raster_function_template, + ) + + logging.info('Calculating cell size ranges') + arcpy.management.CalculateCellSizeRanges( + in_mosaic_dataset=mosaic_dataset, + do_compute_min='NO_MIN_CELL_SIZES', + do_compute_max='NO_MAX_CELL_SIZES', + max_range_factor=10, + cell_size_tolerance_factor=0.8, + update_missing_only='UPDATE_ALL', + ) + + logging.info(f'Calculating custom field values in {mosaic_dataset}') + arcpy.management.CalculateFields( + in_table=mosaic_dataset, + fields=[ + ['MaxPS', '460'], + ['Tag', '"_".join(!Name!.split("_")[0:3] + [!Name!.split("_")[9]])'], + ['GroupName', '!Name!.rsplit("_", 1)[0]'], + ], + ) + with tempfile.TemporaryDirectory(dir=raster_store) as temp_dir: + local_overview = os.path.join(temp_dir, local_overview_filename) + + logging.info(f'Generating {local_overview}') + with arcpy.EnvManager(cellSize=450): + arcpy.management.CopyRaster( + in_raster=mosaic_dataset, + out_rasterdataset=local_overview, + ) + + logging.info(f'Moving CRF to {s3_overview}') + subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) + + logging.info('Adding overview to mosaic dataset') + arcpy.management.AddRastersToMosaicDataset( + in_mosaic_dataset=mosaic_dataset, + raster_type='Raster Dataset', + input_path=s3_overview, + ) + + logging.info('Populate overview attributes') + calculate_overview_fields(mosaic_dataset, args.working_directory) + except arcpy.ExecuteError: + logging.error(arcpy.GetMessages()) + raise + + +if __name__ == '__main__': + main() \ No newline at end of file From 64339029383df52c6209f5acf32e4b09bf2e9a0d Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 1 Nov 2023 16:21:04 -0800 Subject: [PATCH 053/193] add in metadata generation for all services --- image_services/opera/metadata/create_metadata.py | 0 .../metadata_text/OPERA_RTC_HH_metadata.txt | 14 ++++++++++++++ .../metadata_text/OPERA_RTC_HV_metadata.txt | 14 ++++++++++++++ .../metadata_text/OPERA_RTC_VH_metadata.txt | 14 ++++++++++++++ .../metadata_text/OPERA_RTC_VV_metadata.txt | 14 ++++++++++++++ .../opera/metadata/templates/rtc_metadata.txt.j2 | 14 ++++++++++++++ 6 files changed, 70 insertions(+) create mode 100644 image_services/opera/metadata/create_metadata.py create mode 100644 image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt create mode 100644 image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt create mode 100644 image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt create mode 100644 image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt create mode 100644 image_services/opera/metadata/templates/rtc_metadata.txt.j2 diff --git a/image_services/opera/metadata/create_metadata.py b/image_services/opera/metadata/create_metadata.py new file mode 100644 index 00000000..e69de29b diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt new file mode 100644 index 00000000..f103b004 --- /dev/null +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt @@ -0,0 +1,14 @@ +Title: + OPERA RTC HH + +Tags: +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL + +Summary: +OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) + +Description: +OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. + +Credits: +OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt new file mode 100644 index 00000000..0e9aebe6 --- /dev/null +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt @@ -0,0 +1,14 @@ +Title: + OPERA RTC HV + +Tags: +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL + +Summary: +OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) + +Description: +OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. + +Credits: +OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt new file mode 100644 index 00000000..9c2040a5 --- /dev/null +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt @@ -0,0 +1,14 @@ +Title: + OPERA RTC VH + +Tags: +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL + +Summary: +OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) + +Description: +OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. + +Credits: +OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt new file mode 100644 index 00000000..bca85c40 --- /dev/null +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt @@ -0,0 +1,14 @@ +Title: + OPERA RTC VV + +Tags: +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL + +Summary: +OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) + +Description: +OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. + +Credits: +OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file diff --git a/image_services/opera/metadata/templates/rtc_metadata.txt.j2 b/image_services/opera/metadata/templates/rtc_metadata.txt.j2 new file mode 100644 index 00000000..17dd9211 --- /dev/null +++ b/image_services/opera/metadata/templates/rtc_metadata.txt.j2 @@ -0,0 +1,14 @@ +Title: + OPERA RTC {{ polarization }} + +Tags: +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL + +Summary: +OPERA Level-2 Radiometric Terrain Corrected (RTC) products in {{ polarization }} polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) + +Description: +OPERA Level-2 Radiometric Terrain Corrected (RTC) products in {{ polarization }} polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the {{ polarization }} polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. + +Credits: +OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file From 5dc55916d24896defc6df45af7fbc76ddc4e4b1f Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 1 Nov 2023 16:28:35 -0800 Subject: [PATCH 054/193] remove unsused package --- image_services/opera/make_opera_database.py | 1 - 1 file changed, 1 deletion(-) diff --git a/image_services/opera/make_opera_database.py b/image_services/opera/make_opera_database.py index 1c424c28..8ca38e97 100644 --- a/image_services/opera/make_opera_database.py +++ b/image_services/opera/make_opera_database.py @@ -11,7 +11,6 @@ import arcpy import boto3 -from arcgis.gis.server import Server from lxml import etree from osgeo import gdal, osr from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed From 150ef6eb199f3587baa14f91c0f273a34bfa4004 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 1 Nov 2023 16:41:40 -0800 Subject: [PATCH 055/193] remove errant service_definition --- image_services/opera/make_opera_database.py | 1 - 1 file changed, 1 deletion(-) diff --git a/image_services/opera/make_opera_database.py b/image_services/opera/make_opera_database.py index 8ca38e97..5460f802 100644 --- a/image_services/opera/make_opera_database.py +++ b/image_services/opera/make_opera_database.py @@ -216,7 +216,6 @@ def main(): overview_name = f'{output_name}_overview' local_overview_filename = f'{overview_name}.crf' s3_overview = f'{overview_path}{overview_name}.crf' - service_definition = os.path.join(args.working_directory, f'{output_name}.sd') logging.info('Creating geodatabase') geodatabase = arcpy.management.CreateFileGDB( From 8299f63ffa8580689482637c0f81ab332fccd884 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 10:19:06 -0800 Subject: [PATCH 056/193] edit script to use data from larger AOI --- image_services/opera/config/rtc_vh.json | 2 +- image_services/opera/make_opera_services.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 1e851e39..233b8a02 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -1,6 +1,6 @@ { "project_name": "OPERA", - "s3_prefix": "opera-rtc-image-service-prototype/VH", + "s3_prefix": "opera-rtc-image-service-na/VH", "s3_suffix": "_VH.tif", "dataset_name": "RTC_VH", "raster_function_templates": [ diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 3cd581e2..bb6a2e66 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -47,7 +47,7 @@ def remove_prefix(raster_path, prefix): def get_raster_metadata(raster_path: str) -> dict: - assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/') + assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-na/') key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' name = Path(raster_path).stem @@ -186,7 +186,7 @@ def main(): raster_store = '/home/arcgis/raster_store/' bucket = 'hyp3-testing' - overview_path = '/vsis3/hyp3-nasa-disasters/overviews/' + overview_path = '/vsis3/gis-service-overviews/' template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' From 10a3617743b4ffc9abffce361253bf881c7cc747 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 10:35:20 -0800 Subject: [PATCH 057/193] remove extra prefix portion --- image_services/opera/config/rtc_vh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 233b8a02..499c2d67 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -1,6 +1,6 @@ { "project_name": "OPERA", - "s3_prefix": "opera-rtc-image-service-na/VH", + "s3_prefix": "opera-rtc-image-service-na", "s3_suffix": "_VH.tif", "dataset_name": "RTC_VH", "raster_function_templates": [ From 65949e4e4f217397eb1fc7547628d865e844c059 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 11:15:56 -0800 Subject: [PATCH 058/193] edit config for VV --- image_services/opera/config/rtc_vv.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index 7bbfc037..df14e3c3 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -1,6 +1,6 @@ { "project_name": "OPERA", - "s3_prefix": "opera-rtc-image-service-prototype/VV", + "s3_prefix": "opera-rtc-image-service-na", "s3_suffix": "_VV.tif", "dataset_name": "RTC_VV", "raster_function_templates": [ From 1ba042986af5d434e2ff698ea14938b94340400b Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 12:10:07 -0800 Subject: [PATCH 059/193] edit credit statement for OPERA services --- image_services/opera/config/rtc_hh.json | 4 ++-- image_services/opera/config/rtc_hv.json | 4 ++-- image_services/opera/config/rtc_vh.json | 4 ++-- image_services/opera/config/rtc_vv.json | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index 1f8e352c..f1f2cf13 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -16,7 +16,7 @@ "Type": "esriServiceDefinitionType_Replacement", "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", - "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", @@ -29,7 +29,7 @@ "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='UsageTimeout']/Value": "1200", "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='WaitTimeout']/Value": "120", "ItemInfo/Title": "OPERA RTC HH", - "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", "ItemInfo/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", "ItemInfo/Snippet": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_HH_WMS", diff --git a/image_services/opera/config/rtc_hv.json b/image_services/opera/config/rtc_hv.json index 331ff83b..ac481b06 100644 --- a/image_services/opera/config/rtc_hv.json +++ b/image_services/opera/config/rtc_hv.json @@ -16,7 +16,7 @@ "Type": "esriServiceDefinitionType_Replacement", "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", - "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", @@ -29,7 +29,7 @@ "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='UsageTimeout']/Value": "1200", "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='WaitTimeout']/Value": "120", "ItemInfo/Title": "OPERA RTC HV", - "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", "ItemInfo/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", "ItemInfo/Snippet": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_HV_WMS", diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 499c2d67..b03a2c6d 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -16,7 +16,7 @@ "Type": "esriServiceDefinitionType_Replacement", "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", - "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", @@ -29,7 +29,7 @@ "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='UsageTimeout']/Value": "1200", "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='WaitTimeout']/Value": "120", "ItemInfo/Title": "OPERA RTC VH", - "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", "ItemInfo/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", "ItemInfo/Snippet": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_VH_WMS", diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index df14e3c3..3d36b621 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -16,7 +16,7 @@ "Type": "esriServiceDefinitionType_Replacement", "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", - "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", @@ -29,7 +29,7 @@ "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='UsageTimeout']/Value": "1200", "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='WaitTimeout']/Value": "120", "ItemInfo/Title": "OPERA RTC VV", - "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", "ItemInfo/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", "ItemInfo/Snippet": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_VV_WMS", From f9914c1dd3412a2ecc573910155e24c35f0712f1 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 14:31:11 -0800 Subject: [PATCH 060/193] write records to csv as they are appended --- image_services/opera/make_opera_services.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index bb6a2e66..143e5fbc 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -86,15 +86,13 @@ def update_csv(csv_file: str, rasters: List[str]): new_rasters = set(rasters) - set(existing_rasters) logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') - for raster in new_rasters: - record = get_raster_metadata(raster) - records.append(record) - - records = sorted(records, key=lambda x: x['Raster']) with open(csv_file, 'w', newline='') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) writer.writeheader() - writer.writerows(records) + + for raster in new_rasters: + record = get_raster_metadata(raster) + writer.writerows(record) def calculate_overview_fields(mosaic_dataset, local_path): From abc1b5be9503f7898c23a7ca249667392fe3da64 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 14:32:04 -0800 Subject: [PATCH 061/193] add logging --- image_services/opera/make_opera_services.py | 1 + 1 file changed, 1 insertion(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 143e5fbc..0f476667 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -92,6 +92,7 @@ def update_csv(csv_file: str, rasters: List[str]): for raster in new_rasters: record = get_raster_metadata(raster) + logging.info(f'Adding {raster} to {csv_file}') writer.writerows(record) From b0d28e6574c3179eb5e9e7a092a155a79e149390 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 14:42:15 -0800 Subject: [PATCH 062/193] correct variable --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 0f476667..f670bdf6 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -93,7 +93,7 @@ def update_csv(csv_file: str, rasters: List[str]): for raster in new_rasters: record = get_raster_metadata(raster) logging.info(f'Adding {raster} to {csv_file}') - writer.writerows(record) + writer.writerows(raster) def calculate_overview_fields(mosaic_dataset, local_path): From c43c25f48cced3543abf3ed6be2f41647cde63c8 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 14:55:08 -0800 Subject: [PATCH 063/193] remove write header command --- image_services/opera/make_opera_services.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index f670bdf6..2df0bd02 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -87,13 +87,13 @@ def update_csv(csv_file: str, rasters: List[str]): logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') with open(csv_file, 'w', newline='') as csvfile: - writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) - writer.writeheader() - for raster in new_rasters: record = get_raster_metadata(raster) + writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) logging.info(f'Adding {raster} to {csv_file}') - writer.writerows(raster) + writer.writerows(record) + + # writer.writeheader() def calculate_overview_fields(mosaic_dataset, local_path): From d0157baac4583024bfe05ab67b148c72caedb418 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 14:57:48 -0800 Subject: [PATCH 064/193] change fieldnames reference --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 2df0bd02..1ca8d187 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -89,7 +89,7 @@ def update_csv(csv_file: str, rasters: List[str]): with open(csv_file, 'w', newline='') as csvfile: for raster in new_rasters: record = get_raster_metadata(raster) - writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) + writer = csv.DictWriter(csvfile, fieldnames=record.keys(), lineterminator=os.linesep) logging.info(f'Adding {raster} to {csv_file}') writer.writerows(record) From 8856acb4e17bfa708f600e07848fbf17bad7e1bb Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 14:59:32 -0800 Subject: [PATCH 065/193] change fieldnames reference --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 1ca8d187..dd25aee0 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -89,7 +89,7 @@ def update_csv(csv_file: str, rasters: List[str]): with open(csv_file, 'w', newline='') as csvfile: for raster in new_rasters: record = get_raster_metadata(raster) - writer = csv.DictWriter(csvfile, fieldnames=record.keys(), lineterminator=os.linesep) + writer = csv.DictWriter(csvfile, fieldnames=record[0].keys(), lineterminator=os.linesep) logging.info(f'Adding {raster} to {csv_file}') writer.writerows(record) From f85fb84308c82302d086ac3463aff4b9529b6753 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 15:02:55 -0800 Subject: [PATCH 066/193] shenaniganry --- image_services/opera/make_opera_services.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index dd25aee0..8a9844d5 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -88,8 +88,10 @@ def update_csv(csv_file: str, rasters: List[str]): logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') with open(csv_file, 'w', newline='') as csvfile: for raster in new_rasters: + new_record = [] record = get_raster_metadata(raster) - writer = csv.DictWriter(csvfile, fieldnames=record[0].keys(), lineterminator=os.linesep) + new_record.append(record) + writer = csv.DictWriter(csvfile, fieldnames=newrecord[0].keys(), lineterminator=os.linesep) logging.info(f'Adding {raster} to {csv_file}') writer.writerows(record) From 21768f8bccc6721bb3a2c7514140a1bcc0b032c7 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 15:04:21 -0800 Subject: [PATCH 067/193] add missing underscore --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 8a9844d5..19336f6a 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -91,7 +91,7 @@ def update_csv(csv_file: str, rasters: List[str]): new_record = [] record = get_raster_metadata(raster) new_record.append(record) - writer = csv.DictWriter(csvfile, fieldnames=newrecord[0].keys(), lineterminator=os.linesep) + writer = csv.DictWriter(csvfile, fieldnames=new_record[0].keys(), lineterminator=os.linesep) logging.info(f'Adding {raster} to {csv_file}') writer.writerows(record) From c967b6f8ee4dc245bc43db64d9047580d3585475 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 15:06:06 -0800 Subject: [PATCH 068/193] more shenaniganry --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 19336f6a..87da9126 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -93,7 +93,7 @@ def update_csv(csv_file: str, rasters: List[str]): new_record.append(record) writer = csv.DictWriter(csvfile, fieldnames=new_record[0].keys(), lineterminator=os.linesep) logging.info(f'Adding {raster} to {csv_file}') - writer.writerows(record) + writer.writerows(new_record[0]) # writer.writeheader() From 3ed9726c08817d0d6b938b7b81f36446de4a7793 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 3 Nov 2023 17:11:45 -0800 Subject: [PATCH 069/193] some additional changes in collaboration with Andrew --- image_services/opera/make_opera_services.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 87da9126..00db56a7 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -86,16 +86,14 @@ def update_csv(csv_file: str, rasters: List[str]): new_rasters = set(rasters) - set(existing_rasters) logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') - with open(csv_file, 'w', newline='') as csvfile: + with open(csv_file, 'a', newline='') as csvfile: + header_record = get_raster_metadata(new_rasters[0]) + writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) + writer.writeheader() for raster in new_rasters: - new_record = [] record = get_raster_metadata(raster) - new_record.append(record) - writer = csv.DictWriter(csvfile, fieldnames=new_record[0].keys(), lineterminator=os.linesep) logging.info(f'Adding {raster} to {csv_file}') - writer.writerows(new_record[0]) - - # writer.writeheader() + writer.writerows(record) def calculate_overview_fields(mosaic_dataset, local_path): From 037c2931e2ba56b81b6fa4db221b616eb63e49b9 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 3 Nov 2023 17:26:16 -0800 Subject: [PATCH 070/193] add in aws exploration changes --- image_server/cloudformation.yml | 12 +----------- image_services/opera/make_opera_services.py | 2 +- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/image_server/cloudformation.yml b/image_server/cloudformation.yml index ce872a14..9cfe1949 100644 --- a/image_server/cloudformation.yml +++ b/image_server/cloudformation.yml @@ -17,9 +17,6 @@ Parameters: SshCidrIp: Type: String - Bucket: - Type: String - ImageId: Type: AWS::EC2::Image::Id Default: ami-0b1ddcef10ffe54fb @@ -28,10 +25,6 @@ Parameters: Type: String Default: m6i.2xlarge - OverviewPrefix: - Type: String - Default: overviews/ - SecretArn: Type: String @@ -171,10 +164,7 @@ Resources: - Effect: Allow Action: s3:PutObject Resource: - - !Sub "arn:aws:s3:::${Bucket}/${OverviewPrefix}*" - - !Sub "arn:aws:s3:::hyp3-examples/${OverviewPrefix}*" - - !Sub "arn:aws:s3:::hyp3-pdc-data/${OverviewPrefix}*" - - arn:aws:s3:::asf-gis-services/public/* + - arn:aws:s3:::*/overviews/* - Effect: Allow Action: secretsmanager:GetSecretValue Resource: !Ref SecretArn diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 3cd581e2..d99d83d6 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -186,7 +186,7 @@ def main(): raster_store = '/home/arcgis/raster_store/' bucket = 'hyp3-testing' - overview_path = '/vsis3/hyp3-nasa-disasters/overviews/' + overview_path = '/vsis3/gis-service-overviews/overviews/' template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' From 56776cbf0bde44c2bdf25807e5020ebe49962e62 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 6 Nov 2023 15:41:05 -0900 Subject: [PATCH 071/193] change header variable --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 00db56a7..10142a76 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -87,7 +87,7 @@ def update_csv(csv_file: str, rasters: List[str]): logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') with open(csv_file, 'a', newline='') as csvfile: - header_record = get_raster_metadata(new_rasters[0]) + header_record = get_raster_metadata(records[0]) writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) writer.writeheader() for raster in new_rasters: From 1482e15e8ab18e377748026dec6e2fe576a7a7f0 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 6 Nov 2023 16:04:56 -0900 Subject: [PATCH 072/193] add sample record for header reference --- image_services/opera/make_opera_services.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 10142a76..e03d405f 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -86,10 +86,14 @@ def update_csv(csv_file: str, rasters: List[str]): new_rasters = set(rasters) - set(existing_rasters) logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') + + sample_record = next(iter(new_rasters)) + header_record = get_raster_metadata(sample_record) + with open(csv_file, 'a', newline='') as csvfile: - header_record = get_raster_metadata(records[0]) writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) writer.writeheader() + for raster in new_rasters: record = get_raster_metadata(raster) logging.info(f'Adding {raster} to {csv_file}') From c018ec14f12782f1b8794b83f3b2eb53c8fd9a2a Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 6 Nov 2023 16:06:44 -0900 Subject: [PATCH 073/193] change assert to prototype path --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index e03d405f..1252b5d8 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -47,7 +47,7 @@ def remove_prefix(raster_path, prefix): def get_raster_metadata(raster_path: str) -> dict: - assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-na/') + assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/') key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' name = Path(raster_path).stem From 488561ed6f945cc278c63617df8f9957d6899de4 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 6 Nov 2023 16:11:28 -0900 Subject: [PATCH 074/193] add new dictwriter --- image_services/opera/make_opera_services.py | 1 + 1 file changed, 1 insertion(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 1252b5d8..6debbe84 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -96,6 +96,7 @@ def update_csv(csv_file: str, rasters: List[str]): for raster in new_rasters: record = get_raster_metadata(raster) + writer = csv.DictWriter(csvfile, fieldnames=record.keys(), lineterminator=os.linesep) logging.info(f'Adding {raster} to {csv_file}') writer.writerows(record) From d99f16daa45a491a5d1c58cf0a5132c5cb8c348f Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 6 Nov 2023 16:16:47 -0900 Subject: [PATCH 075/193] remove extra s --- image_services/opera/make_opera_services.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 6debbe84..79d539e3 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -96,9 +96,8 @@ def update_csv(csv_file: str, rasters: List[str]): for raster in new_rasters: record = get_raster_metadata(raster) - writer = csv.DictWriter(csvfile, fieldnames=record.keys(), lineterminator=os.linesep) logging.info(f'Adding {raster} to {csv_file}') - writer.writerows(record) + writer.writerow(record) def calculate_overview_fields(mosaic_dataset, local_path): From 6f6746f15520697965129b0706a0ef0436114d22 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 6 Nov 2023 16:22:07 -0900 Subject: [PATCH 076/193] correct overview path --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 79d539e3..9d7dab1e 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -189,7 +189,7 @@ def main(): raster_store = '/home/arcgis/raster_store/' bucket = 'hyp3-testing' - overview_path = '/vsis3/gis-service-overviews/' + overview_path = '/vsis3/gis-service-overviews/overviews' template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' From 92d5ad3ba0daf25ac47625393ccd21296b27e78a Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 6 Nov 2023 16:38:00 -0900 Subject: [PATCH 077/193] combine a bit and add logical statements --- image_services/opera/make_opera_services.py | 24 ++++++++++----------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 9d7dab1e..1836fade 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -85,19 +85,17 @@ def update_csv(csv_file: str, rasters: List[str]): existing_rasters = [record['Raster'] for record in records] new_rasters = set(rasters) - set(existing_rasters) - logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') - - sample_record = next(iter(new_rasters)) - header_record = get_raster_metadata(sample_record) - - with open(csv_file, 'a', newline='') as csvfile: - writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) - writer.writeheader() - - for raster in new_rasters: - record = get_raster_metadata(raster) - logging.info(f'Adding {raster} to {csv_file}') - writer.writerow(record) + if new_rasters: + logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') + header_record = get_raster_metadata(next(iter(new_rasters))) + with open(csv_file, 'a', newline='') as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) + if not existing_rasters: + writer.writeheader() + for raster in new_rasters: + record = get_raster_metadata(raster) + logging.info(f'Adding {raster} to {csv_file}') + writer.writerow(record) def calculate_overview_fields(mosaic_dataset, local_path): From 122cf271751b07a33cec2c142f52d5c0a406086a Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 6 Nov 2023 16:42:05 -0900 Subject: [PATCH 078/193] centralize bucket variable declarations --- image_services/opera/make_opera_services.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 1836fade..830e2614 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -46,9 +46,9 @@ def remove_prefix(raster_path, prefix): return raster_path[len(prefix):] -def get_raster_metadata(raster_path: str) -> dict: - assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/') - key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') +def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: + assert raster_path.startswith(f'/vsis3/{bucket}/{s3_prefix}/') + key = remove_prefix(raster_path, f'/vsis3/{bucket}/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' name = Path(raster_path).stem acquisition_date = \ @@ -74,7 +74,7 @@ def get_raster_metadata(raster_path: str) -> dict: } -def update_csv(csv_file: str, rasters: List[str]): +def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): if os.path.isfile(csv_file): with open(csv_file) as f: records = [record for record in csv.DictReader(f)] @@ -87,13 +87,13 @@ def update_csv(csv_file: str, rasters: List[str]): if new_rasters: logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') - header_record = get_raster_metadata(next(iter(new_rasters))) + header_record = get_raster_metadata(next(iter(new_rasters)), bucket, s3_prefix) with open(csv_file, 'a', newline='') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) if not existing_rasters: writer.writeheader() for raster in new_rasters: - record = get_raster_metadata(raster) + record = get_raster_metadata(raster, bucket, s3_prefix) logging.info(f'Adding {raster} to {csv_file}') writer.writerow(record) @@ -207,7 +207,7 @@ def main(): try: rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) - update_csv(csv_file, rasters) + update_csv(csv_file, rasters, bucket, config['s3_prefix']) for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, before_sleep=before_sleep_log(logging, logging.WARNING)): From 4650084a42938a8bf82d8013d99bc96757193fd5 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 6 Nov 2023 16:47:51 -0900 Subject: [PATCH 079/193] add missing path separator --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 830e2614..2f8b08a3 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -187,7 +187,7 @@ def main(): raster_store = '/home/arcgis/raster_store/' bucket = 'hyp3-testing' - overview_path = '/vsis3/gis-service-overviews/overviews' + overview_path = '/vsis3/gis-service-overviews/overviews/' template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' From 77ff35f931128feda5c41b3bb0a1d8ef2db9c31c Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 6 Nov 2023 16:56:56 -0900 Subject: [PATCH 080/193] add logging statement when no new records are added --- image_services/opera/make_opera_services.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 2f8b08a3..e4647ac1 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -96,6 +96,8 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): record = get_raster_metadata(raster, bucket, s3_prefix) logging.info(f'Adding {raster} to {csv_file}') writer.writerow(record) + else: + logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') def calculate_overview_fields(mosaic_dataset, local_path): From 6f78cb2776a31efe535dd638a226de8f8b276140 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 6 Nov 2023 16:58:53 -0900 Subject: [PATCH 081/193] move logging statement for adding records --- image_services/opera/make_opera_services.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index e4647ac1..997ea409 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -85,8 +85,10 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): existing_rasters = [record['Raster'] for record in records] new_rasters = set(rasters) - set(existing_rasters) + logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') + if new_rasters: - logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') + header_record = get_raster_metadata(next(iter(new_rasters)), bucket, s3_prefix) with open(csv_file, 'a', newline='') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) @@ -96,8 +98,6 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): record = get_raster_metadata(raster, bucket, s3_prefix) logging.info(f'Adding {raster} to {csv_file}') writer.writerow(record) - else: - logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') def calculate_overview_fields(mosaic_dataset, local_path): From b94f2097e048162e291adac74cd58c47e0f1a998 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 7 Nov 2023 09:57:58 -0900 Subject: [PATCH 082/193] update bucket, raster_store, and overview_path to pull from config --- image_services/opera/make_opera_services.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 997ea409..e4f34b3f 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -187,10 +187,6 @@ def main(): parser.add_argument('config_file') args = parser.parse_args() - raster_store = '/home/arcgis/raster_store/' - bucket = 'hyp3-testing' - overview_path = '/vsis3/gis-service-overviews/overviews/' - template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' with open(args.config_file) as f: @@ -208,8 +204,8 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' try: - rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) - update_csv(csv_file, rasters, bucket, config['s3_prefix']) + rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) + update_csv(csv_file, rasters, config['bucket'], config['s3_prefix']) for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, before_sleep=before_sleep_log(logging, logging.WARNING)): @@ -218,7 +214,7 @@ def main(): output_name = f'{config["project_name"]}_{config["dataset_name"]}_{today}' overview_name = f'{output_name}_overview' local_overview_filename = f'{overview_name}.crf' - s3_overview = f'{overview_path}{overview_name}.crf' + s3_overview = f'{config["overview_path"]}{overview_name}.crf' service_definition = os.path.join(args.working_directory, f'{output_name}.sd') logging.info('Creating geodatabase') @@ -317,7 +313,7 @@ def main(): ['GroupName', '!Name!.rsplit("_", 1)[0]'], ], ) - with tempfile.TemporaryDirectory(dir=raster_store) as temp_dir: + with tempfile.TemporaryDirectory(dir=config['raster_store']) as temp_dir: local_overview = os.path.join(temp_dir, local_overview_filename) logging.info(f'Generating {local_overview}') From 832adfb7de7bbb1ad2ec6e87213ce2987c037bfe Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 7 Nov 2023 10:05:49 -0900 Subject: [PATCH 083/193] add additional variables to config files --- image_services/opera/config/rtc_hh.json | 3 +++ image_services/opera/config/rtc_hv.json | 3 +++ image_services/opera/config/rtc_vh.json | 5 ++++- image_services/opera/config/rtc_vv.json | 5 ++++- image_services/opera/make_opera_services.py | 3 +-- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index f1f2cf13..23716f85 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -1,5 +1,8 @@ { "project_name": "OPERA", + "raster_store": "/home/arcgis/raster_store/", + "bucket": "asf-cumulus-prod-opera-products", + "overview_path": "/vsis3/gis-service-overviews/overviews/", "s3_prefix": "opera-rtc-image-service-prototype/HH", "s3_suffix": "_HH.tif", "dataset_name": "RTC_HH", diff --git a/image_services/opera/config/rtc_hv.json b/image_services/opera/config/rtc_hv.json index ac481b06..dd8a0f98 100644 --- a/image_services/opera/config/rtc_hv.json +++ b/image_services/opera/config/rtc_hv.json @@ -1,5 +1,8 @@ { "project_name": "OPERA", + "raster_store": "/home/arcgis/raster_store/", + "bucket": "asf-cumulus-prod-opera-products", + "overview_path": "/vsis3/gis-service-overviews/overviews/", "s3_prefix": "opera-rtc-image-service-prototype/HV", "s3_suffix": "_HV.tif", "dataset_name": "RTC_HV", diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index b03a2c6d..3b8bb78a 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -1,6 +1,9 @@ { "project_name": "OPERA", - "s3_prefix": "opera-rtc-image-service-na", + "raster_store": "/home/arcgis/raster_store/", + "bucket": "asf-cumulus-prod-opera-products", + "overview_path": "/vsis3/gis-service-overviews/overviews/", + "s3_prefix": "", "s3_suffix": "_VH.tif", "dataset_name": "RTC_VH", "raster_function_templates": [ diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index 3d36b621..3fc6779a 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -1,6 +1,9 @@ { "project_name": "OPERA", - "s3_prefix": "opera-rtc-image-service-na", + "raster_store": "/home/arcgis/raster_store/", + "bucket": "asf-cumulus-prod-opera-products", + "overview_path": "/vsis3/gis-service-overviews/overviews/", + "s3_prefix": "", "s3_suffix": "_VV.tif", "dataset_name": "RTC_VV", "raster_function_templates": [ diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 997ea409..12c33236 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -84,11 +84,9 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): existing_rasters = [record['Raster'] for record in records] new_rasters = set(rasters) - set(existing_rasters) - logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') if new_rasters: - header_record = get_raster_metadata(next(iter(new_rasters)), bucket, s3_prefix) with open(csv_file, 'a', newline='') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) @@ -100,6 +98,7 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): writer.writerow(record) + def calculate_overview_fields(mosaic_dataset, local_path): # This function calculates custom attribute values for the overview record print('Calculating field values for overview record') From d47a4e63c92b901a6f7e73ec62dfdd00eb7e7e9b Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 7 Nov 2023 12:33:37 -0900 Subject: [PATCH 084/193] pull rasters from URLs instead of s3 bucket --- image_services/opera/make_opera_services.py | 28 +++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 06d9c180..109bf8ed 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -17,15 +17,21 @@ from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed -def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: - rasters = [] - s3 = boto3.client('s3') - paginator = s3.get_paginator('list_objects_v2') - for page in paginator.paginate(Bucket=bucket, Prefix=prefix): - for obj in page['Contents']: - if obj['Key'].endswith(suffix): - rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') - return rasters +#def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: +# rasters = [] +# s3 = boto3.client('s3') +# paginator = s3.get_paginator('list_objects_v2') +# for page in paginator.paginate(Bucket=bucket, Prefix=prefix): +# for obj in page['Contents']: +# if obj['Key'].endswith(suffix): +# rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') +# return rasters + + +def get_rasters(url_file): + with open(url_file, newline='') as urlfile: + records = urlfile.read().split('\n')[:-1] + return records def get_pixel_type(data_type: str) -> int: @@ -191,6 +197,7 @@ def main(): with open(args.config_file) as f: config = json.load(f) + url_file = '/home/arcgis/gis-services/image_services/opera/urls.txt' csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' @@ -203,7 +210,8 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' try: - rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) + #rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) + rasters = get_rasters(url_file) update_csv(csv_file, rasters, config['bucket'], config['s3_prefix']) for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, From 04779f8c5282b25089be2546bdd8adf7c979391e Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 7 Nov 2023 15:54:56 -0900 Subject: [PATCH 085/193] get rid of hard coded s3 bucket stuff --- image_services/opera/make_opera_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 109bf8ed..2c957587 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -53,13 +53,13 @@ def remove_prefix(raster_path, prefix): def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: - assert raster_path.startswith(f'/vsis3/{bucket}/{s3_prefix}/') + #assert raster_path.startswith(f'/vsis3/{bucket}/{s3_prefix}/') key = remove_prefix(raster_path, f'/vsis3/{bucket}/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' name = Path(raster_path).stem acquisition_date = \ name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] - info = gdal.Info(raster_path, format='json') + info = gdal.Info(f'vsicurl/{raster_path}', format='json') return { 'Raster': info['description'], 'Name': name, From e86d48343bae8c376fd29ba27a48159e6ccc1bda Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 7 Nov 2023 15:57:21 -0900 Subject: [PATCH 086/193] add missing slash --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 2c957587..ffba7dd1 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -59,7 +59,7 @@ def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: name = Path(raster_path).stem acquisition_date = \ name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] - info = gdal.Info(f'vsicurl/{raster_path}', format='json') + info = gdal.Info(f'/vsicurl/{raster_path}', format='json') return { 'Raster': info['description'], 'Name': name, From c989c04a56cf0630e1dd73d2ff7dfc5f82d28eb9 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 8 Nov 2023 15:51:53 -0900 Subject: [PATCH 087/193] sort and rewrite csv --- image_services/opera/make_opera_services.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index ffba7dd1..707ed876 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -93,6 +93,7 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') if new_rasters: + records = [] header_record = get_raster_metadata(next(iter(new_rasters)), bucket, s3_prefix) with open(csv_file, 'a', newline='') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) @@ -100,9 +101,16 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): writer.writeheader() for raster in new_rasters: record = get_raster_metadata(raster, bucket, s3_prefix) + records.append(record) logging.info(f'Adding {raster} to {csv_file}') writer.writerow(record) + records = sorted(records, key=lambda x: x['Raster']) + with open(csv_file, 'w', newline='') as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) + writer.writeheader() + writer.writerows(records) + def calculate_overview_fields(mosaic_dataset, local_path): From bb3811a8d8e78d6843051a54c722d78318b9eccc Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 8 Nov 2023 16:44:49 -0900 Subject: [PATCH 088/193] add in second csv read and read --- image_services/opera/make_opera_services.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 707ed876..90a10295 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -93,7 +93,6 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') if new_rasters: - records = [] header_record = get_raster_metadata(next(iter(new_rasters)), bucket, s3_prefix) with open(csv_file, 'a', newline='') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) @@ -101,13 +100,14 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): writer.writeheader() for raster in new_rasters: record = get_raster_metadata(raster, bucket, s3_prefix) - records.append(record) logging.info(f'Adding {raster} to {csv_file}') writer.writerow(record) + with open(csv_file) as f: + records = [record for record in csv.DictReader(f)] records = sorted(records, key=lambda x: x['Raster']) with open(csv_file, 'w', newline='') as csvfile: - writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) + writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) writer.writeheader() writer.writerows(records) From 2b1cc9874e3704f70e811358cb9789efcb88c92a Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 9 Nov 2023 17:07:40 -0900 Subject: [PATCH 089/193] format comment --- image_services/opera/make_opera_services.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 90a10295..551ebe79 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -17,8 +17,8 @@ from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed -#def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: -# rasters = [] +# def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: +# rasters = [] # s3 = boto3.client('s3') # paginator = s3.get_paginator('list_objects_v2') # for page in paginator.paginate(Bucket=bucket, Prefix=prefix): @@ -112,7 +112,6 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): writer.writerows(records) - def calculate_overview_fields(mosaic_dataset, local_path): # This function calculates custom attribute values for the overview record print('Calculating field values for overview record') From 540343370dd4cde015160a717b6a1815d6365c99 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 9 Nov 2023 17:09:55 -0900 Subject: [PATCH 090/193] change stretch settings for opera default rft --- .../Sentinel1_RTC_dB_Stretch.rft.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml b/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml index b204e803..f503640d 100644 --- a/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml +++ b/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml @@ -1,7 +1,7 @@ + xmlns:typens='http://www.esri.com/schemas/ArcGIS/3.1.0'> Sentinel-1 RTC dB Stretch Sentinel-1 RTC data in dB scale with a stretch applied StretchType - 0 + 5 false - -25 + -20 0 -8 -6 From 35b63592390463e6b75bf36a047bc2677f6764a8 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 9 Nov 2023 17:17:56 -0900 Subject: [PATCH 091/193] edit vh config file for NA mosaic test run --- image_services/opera/config/rtc_vh.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 3b8bb78a..68a1c22a 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -1,9 +1,9 @@ { "project_name": "OPERA", "raster_store": "/home/arcgis/raster_store/", - "bucket": "asf-cumulus-prod-opera-products", + "bucket": "opera-rtc-image-service-na", "overview_path": "/vsis3/gis-service-overviews/overviews/", - "s3_prefix": "", + "s3_prefix": "opera-rtc-image-service-na", "s3_suffix": "_VH.tif", "dataset_name": "RTC_VH", "raster_function_templates": [ From e804170f8cac021d726758097894b2ddc15b9f7a Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 9 Nov 2023 17:20:09 -0900 Subject: [PATCH 092/193] revert code to use test bucket for populating md --- image_services/opera/make_opera_services.py | 28 ++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 551ebe79..3527657f 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -17,21 +17,21 @@ from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed -# def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: -# rasters = [] -# s3 = boto3.client('s3') -# paginator = s3.get_paginator('list_objects_v2') -# for page in paginator.paginate(Bucket=bucket, Prefix=prefix): -# for obj in page['Contents']: -# if obj['Key'].endswith(suffix): -# rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') -# return rasters +def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: + rasters = [] + s3 = boto3.client('s3') + paginator = s3.get_paginator('list_objects_v2') + for page in paginator.paginate(Bucket=bucket, Prefix=prefix): + for obj in page['Contents']: + if obj['Key'].endswith(suffix): + rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') + return rasters -def get_rasters(url_file): - with open(url_file, newline='') as urlfile: - records = urlfile.read().split('\n')[:-1] - return records +# def get_rasters(url_file): +# with open(url_file, newline='') as urlfile: +# records = urlfile.read().split('\n')[:-1] +# return records def get_pixel_type(data_type: str) -> int: @@ -53,7 +53,7 @@ def remove_prefix(raster_path, prefix): def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: - #assert raster_path.startswith(f'/vsis3/{bucket}/{s3_prefix}/') + assert raster_path.startswith(f'/vsis3/{bucket}/{s3_prefix}/') key = remove_prefix(raster_path, f'/vsis3/{bucket}/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' name = Path(raster_path).stem From 1aa9618b51b1b7eaf2588d583a448c75cb78972f Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 9 Nov 2023 17:27:06 -0900 Subject: [PATCH 093/193] revert code to use test bucket for populating md --- image_services/opera/make_opera_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 3527657f..e98df114 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -217,8 +217,8 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' try: - #rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) - rasters = get_rasters(url_file) + rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) + # rasters = get_rasters(url_file) update_csv(csv_file, rasters, config['bucket'], config['s3_prefix']) for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, From 5e7efd204cb0b17e3df771aab41a0c9cae66b9dd Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Thu, 9 Nov 2023 17:30:17 -0900 Subject: [PATCH 094/193] set test bucket for populating md --- image_services/opera/config/rtc_vh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 68a1c22a..ba513e91 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -1,7 +1,7 @@ { "project_name": "OPERA", "raster_store": "/home/arcgis/raster_store/", - "bucket": "opera-rtc-image-service-na", + "bucket": "hyp3-testing", "overview_path": "/vsis3/gis-service-overviews/overviews/", "s3_prefix": "opera-rtc-image-service-na", "s3_suffix": "_VH.tif", From 32f1016db49b364c025fc46f50ae58957f975f20 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 11:54:53 -0900 Subject: [PATCH 095/193] remove individual logging step --- image_services/opera/make_opera_services.py | 1 - 1 file changed, 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index e98df114..2d358304 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -100,7 +100,6 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): writer.writeheader() for raster in new_rasters: record = get_raster_metadata(raster, bucket, s3_prefix) - logging.info(f'Adding {raster} to {csv_file}') writer.writerow(record) with open(csv_file) as f: From 8568e59e62e8fb81374186008145645d9a7852ef Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 11:56:50 -0900 Subject: [PATCH 096/193] remove code for running url-based functions --- image_services/opera/make_opera_services.py | 30 ++++++++------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 551ebe79..73f654cb 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -17,21 +17,15 @@ from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed -# def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: -# rasters = [] -# s3 = boto3.client('s3') -# paginator = s3.get_paginator('list_objects_v2') -# for page in paginator.paginate(Bucket=bucket, Prefix=prefix): -# for obj in page['Contents']: -# if obj['Key'].endswith(suffix): -# rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') -# return rasters - - -def get_rasters(url_file): - with open(url_file, newline='') as urlfile: - records = urlfile.read().split('\n')[:-1] - return records +def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: + rasters = [] + s3 = boto3.client('s3') + paginator = s3.get_paginator('list_objects_v2') + for page in paginator.paginate(Bucket=bucket, Prefix=prefix): + for obj in page['Contents']: + if obj['Key'].endswith(suffix): + rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') + return rasters def get_pixel_type(data_type: str) -> int: @@ -53,7 +47,7 @@ def remove_prefix(raster_path, prefix): def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: - #assert raster_path.startswith(f'/vsis3/{bucket}/{s3_prefix}/') + assert raster_path.startswith(f'/vsis3/{bucket}/{s3_prefix}/') key = remove_prefix(raster_path, f'/vsis3/{bucket}/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' name = Path(raster_path).stem @@ -100,7 +94,6 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): writer.writeheader() for raster in new_rasters: record = get_raster_metadata(raster, bucket, s3_prefix) - logging.info(f'Adding {raster} to {csv_file}') writer.writerow(record) with open(csv_file) as f: @@ -217,8 +210,7 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' try: - #rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) - rasters = get_rasters(url_file) + rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) update_csv(csv_file, rasters, config['bucket'], config['s3_prefix']) for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, From 3a54edeba7d17c52ae6755744adabe100f6b32f1 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 12:06:22 -0900 Subject: [PATCH 097/193] amend config file for the VV service to point at the prototype dataset --- image_services/opera/config/rtc_vh.json | 2 +- image_services/opera/config/rtc_vv.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 3b8bb78a..9598045d 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -1,7 +1,7 @@ { "project_name": "OPERA", "raster_store": "/home/arcgis/raster_store/", - "bucket": "asf-cumulus-prod-opera-products", + "bucket": "hyp3-testing", "overview_path": "/vsis3/gis-service-overviews/overviews/", "s3_prefix": "", "s3_suffix": "_VH.tif", diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index 3fc6779a..e7d8e8e4 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -1,9 +1,9 @@ { "project_name": "OPERA", "raster_store": "/home/arcgis/raster_store/", - "bucket": "asf-cumulus-prod-opera-products", + "bucket": "hyp3-testing", "overview_path": "/vsis3/gis-service-overviews/overviews/", - "s3_prefix": "", + "s3_prefix": "opera-rtc-image-service-prototype/VV", "s3_suffix": "_VV.tif", "dataset_name": "RTC_VV", "raster_function_templates": [ From cfa83cb19eeb0ec4fb0c35cf0e633d754b5000c6 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 12:07:22 -0900 Subject: [PATCH 098/193] amend config file for the VH service to point at the na dataset --- image_services/opera/config/rtc_vh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 9598045d..9539449e 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -3,7 +3,7 @@ "raster_store": "/home/arcgis/raster_store/", "bucket": "hyp3-testing", "overview_path": "/vsis3/gis-service-overviews/overviews/", - "s3_prefix": "", + "s3_prefix": "opera-rtc-image-service-na/VH", "s3_suffix": "_VH.tif", "dataset_name": "RTC_VH", "raster_function_templates": [ From 7294acfb737c250bbeeb059ab1bcba06b1316894 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 12:09:24 -0900 Subject: [PATCH 099/193] fix indent --- image_services/opera/make_opera_services.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 73f654cb..c07a0029 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -18,14 +18,14 @@ def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: - rasters = [] - s3 = boto3.client('s3') - paginator = s3.get_paginator('list_objects_v2') - for page in paginator.paginate(Bucket=bucket, Prefix=prefix): - for obj in page['Contents']: - if obj['Key'].endswith(suffix): - rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') - return rasters + rasters = [] + s3 = boto3.client('s3') + paginator = s3.get_paginator('list_objects_v2') + for page in paginator.paginate(Bucket=bucket, Prefix=prefix): + for obj in page['Contents']: + if obj['Key'].endswith(suffix): + rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') + return rasters def get_pixel_type(data_type: str) -> int: From b8608dd123c7915725c221f4c54b59f30718301b Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 12:13:30 -0900 Subject: [PATCH 100/193] remove vsicurl reference --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index c07a0029..dd14ec44 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -53,7 +53,7 @@ def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: name = Path(raster_path).stem acquisition_date = \ name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] - info = gdal.Info(f'/vsicurl/{raster_path}', format='json') + info = gdal.Info(raster_path, format='json') return { 'Raster': info['description'], 'Name': name, From 16601760c75e4c2f67342e72f9ff7c7db69525f4 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 12:14:46 -0900 Subject: [PATCH 101/193] remove reference to URL file --- image_services/opera/make_opera_services.py | 1 - 1 file changed, 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index dd14ec44..5e0ba231 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -197,7 +197,6 @@ def main(): with open(args.config_file) as f: config = json.load(f) - url_file = '/home/arcgis/gis-services/image_services/opera/urls.txt' csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' From c3915a0bfe93677f9f1412ed6aa2383bdd7990f6 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 12:19:43 -0900 Subject: [PATCH 102/193] set HH and HV configs to point at test data --- image_services/opera/config/rtc_hh.json | 2 +- image_services/opera/config/rtc_hv.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index 23716f85..c96619d9 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -1,7 +1,7 @@ { "project_name": "OPERA", "raster_store": "/home/arcgis/raster_store/", - "bucket": "asf-cumulus-prod-opera-products", + "bucket": "hyp3-testing", "overview_path": "/vsis3/gis-service-overviews/overviews/", "s3_prefix": "opera-rtc-image-service-prototype/HH", "s3_suffix": "_HH.tif", diff --git a/image_services/opera/config/rtc_hv.json b/image_services/opera/config/rtc_hv.json index dd8a0f98..18337112 100644 --- a/image_services/opera/config/rtc_hv.json +++ b/image_services/opera/config/rtc_hv.json @@ -1,7 +1,7 @@ { "project_name": "OPERA", "raster_store": "/home/arcgis/raster_store/", - "bucket": "asf-cumulus-prod-opera-products", + "bucket": "hyp3-testing", "overview_path": "/vsis3/gis-service-overviews/overviews/", "s3_prefix": "opera-rtc-image-service-prototype/HV", "s3_suffix": "_HV.tif", From cd059d646fe73cdc1274b860f6dc72ff7cff25a3 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 12:23:33 -0900 Subject: [PATCH 103/193] correct formatting --- image_services/opera/make_opera_database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_database.py b/image_services/opera/make_opera_database.py index 5460f802..a68c9ff6 100644 --- a/image_services/opera/make_opera_database.py +++ b/image_services/opera/make_opera_database.py @@ -341,4 +341,4 @@ def main(): if __name__ == '__main__': - main() \ No newline at end of file + main() From 7019b1df037549ce63e8737626f2a8da67cd0c6f Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 13:54:55 -0900 Subject: [PATCH 104/193] set sort order based on EndDate --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 5e0ba231..64d7e473 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -100,7 +100,7 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): records = [record for record in csv.DictReader(f)] records = sorted(records, key=lambda x: x['Raster']) with open(csv_file, 'w', newline='') as csvfile: - writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) + writer = csv.DictWriter(csvfile, fieldnames=records[-1].keys(), lineterminator=os.linesep) writer.writeheader() writer.writerows(records) From ebfb26db403e6a35ec9b81c1c0079f4175ba96e2 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 13:57:45 -0900 Subject: [PATCH 105/193] add logging statement --- image_services/opera/make_opera_services.py | 1 + 1 file changed, 1 insertion(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 64d7e473..dce0bd80 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -98,6 +98,7 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): with open(csv_file) as f: records = [record for record in csv.DictReader(f)] + logging.info(f'Sorting rasters in {csv_file}') records = sorted(records, key=lambda x: x['Raster']) with open(csv_file, 'w', newline='') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=records[-1].keys(), lineterminator=os.linesep) From 759c6a24c747da8b7fd8eb59382ec3853871be09 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 14:29:29 -0900 Subject: [PATCH 106/193] move sort function out of the new_rasters loop --- image_services/opera/make_opera_services.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index dce0bd80..c2cd65fe 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -96,14 +96,14 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): record = get_raster_metadata(raster, bucket, s3_prefix) writer.writerow(record) - with open(csv_file) as f: - records = [record for record in csv.DictReader(f)] - logging.info(f'Sorting rasters in {csv_file}') - records = sorted(records, key=lambda x: x['Raster']) - with open(csv_file, 'w', newline='') as csvfile: - writer = csv.DictWriter(csvfile, fieldnames=records[-1].keys(), lineterminator=os.linesep) - writer.writeheader() - writer.writerows(records) + with open(csv_file) as f: + records = [record for record in csv.DictReader(f)] + logging.info(f'Sorting rasters in {csv_file}') + records = sorted(records, key=lambda x: x['Raster']) + with open(csv_file, 'w', newline='') as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=records[-1].keys(), lineterminator=os.linesep) + writer.writeheader() + writer.writerows(records) def calculate_overview_fields(mosaic_dataset, local_path): From 42c26716911eab3e6be044bc270cbdef88c912c0 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 14:41:23 -0900 Subject: [PATCH 107/193] sort csv by EndDate --- image_services/opera/make_opera_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index c2cd65fe..0d6b0ee3 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -99,9 +99,9 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): with open(csv_file) as f: records = [record for record in csv.DictReader(f)] logging.info(f'Sorting rasters in {csv_file}') - records = sorted(records, key=lambda x: x['Raster']) + records = sorted(records, key=lambda x: x['EndDate']) with open(csv_file, 'w', newline='') as csvfile: - writer = csv.DictWriter(csvfile, fieldnames=records[-1].keys(), lineterminator=os.linesep) + writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) writer.writeheader() writer.writerows(records) From ced38562e253cb81e346c68649dc668cb9767e69 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 16:01:43 -0900 Subject: [PATCH 108/193] change HH config to use NA dataset --- image_services/opera/config/rtc_hh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index c96619d9..f4c42b6d 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -3,7 +3,7 @@ "raster_store": "/home/arcgis/raster_store/", "bucket": "hyp3-testing", "overview_path": "/vsis3/gis-service-overviews/overviews/", - "s3_prefix": "opera-rtc-image-service-prototype/HH", + "s3_prefix": "opera-rtc-image-service-na/HH", "s3_suffix": "_HH.tif", "dataset_name": "RTC_HH", "raster_function_templates": [ From 70b2d50d14bfd6bb74a056cd4dd1a1ea950da4cd Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 16:29:33 -0900 Subject: [PATCH 109/193] change default stretch type to percent clip --- .../Sentinel1_RTC_dB_Stretch.rft.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml b/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml index f503640d..c73b7ba2 100644 --- a/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml +++ b/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml @@ -150,7 +150,7 @@ id='ID25'> StretchType - 5 + 6 false MaxPercent - 0.5 + 0.25 false Date: Fri, 10 Nov 2023 16:38:09 -0900 Subject: [PATCH 110/193] correct prefix for HH NA config --- image_services/opera/config/rtc_hh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index f4c42b6d..950ec8e1 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -3,7 +3,7 @@ "raster_store": "/home/arcgis/raster_store/", "bucket": "hyp3-testing", "overview_path": "/vsis3/gis-service-overviews/overviews/", - "s3_prefix": "opera-rtc-image-service-na/HH", + "s3_prefix": "opera-rtc-image-service-na", "s3_suffix": "_HH.tif", "dataset_name": "RTC_HH", "raster_function_templates": [ From 5d43605b0f9cd92b48e1d328bcdc8e34ab008fc7 Mon Sep 17 00:00:00 2001 From: Heidi Kristenson <61886203+hjkristenson@users.noreply.github.com> Date: Fri, 10 Nov 2023 16:40:44 -0900 Subject: [PATCH 111/193] correct prefix for VH NA config --- image_services/opera/config/rtc_vh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 9539449e..ba513e91 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -3,7 +3,7 @@ "raster_store": "/home/arcgis/raster_store/", "bucket": "hyp3-testing", "overview_path": "/vsis3/gis-service-overviews/overviews/", - "s3_prefix": "opera-rtc-image-service-na/VH", + "s3_prefix": "opera-rtc-image-service-na", "s3_suffix": "_VH.tif", "dataset_name": "RTC_VH", "raster_function_templates": [ From f924db11bb0d5d424f40c8aa7b368ffdf6129ad9 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 10 Nov 2023 16:48:16 -0900 Subject: [PATCH 112/193] set default stretch rft to use DRA --- .../raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml b/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml index c73b7ba2..a4bc03ad 100644 --- a/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml +++ b/image_services/opera/raster_function_templates/Sentinel1_RTC_dB_Stretch.rft.xml @@ -206,7 +206,7 @@ id='ID33'> DRA - false + true false Date: Fri, 10 Nov 2023 17:52:50 -0900 Subject: [PATCH 113/193] rearrange to include URLS) --- image_services/opera/make_opera_database.py | 344 -------------------- image_services/opera/make_opera_services.py | 30 +- 2 files changed, 19 insertions(+), 355 deletions(-) delete mode 100644 image_services/opera/make_opera_database.py diff --git a/image_services/opera/make_opera_database.py b/image_services/opera/make_opera_database.py deleted file mode 100644 index a68c9ff6..00000000 --- a/image_services/opera/make_opera_database.py +++ /dev/null @@ -1,344 +0,0 @@ -import argparse -import csv -import datetime -import json -import logging -import os -import subprocess -import tempfile -from pathlib import Path -from typing import List - -import arcpy -import boto3 -from lxml import etree -from osgeo import gdal, osr -from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed - - -def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: - rasters = [] - s3 = boto3.client('s3') - paginator = s3.get_paginator('list_objects_v2') - for page in paginator.paginate(Bucket=bucket, Prefix=prefix): - for obj in page['Contents']: - if obj['Key'].endswith(suffix): - rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') - return rasters - - -def get_pixel_type(data_type: str) -> int: - if data_type == 'Byte': - return 3 - if data_type == 'Float32': - return 9 - raise ValueError(f'Unsupported data type: {data_type}') - - -def get_projection(srs_wkt: str) -> str: - srs = osr.SpatialReference() - srs.ImportFromWkt(srs_wkt) - return srs.GetAttrValue('AUTHORITY', 1) - - -def remove_prefix(raster_path, prefix): - return raster_path[len(prefix):] - - -def get_raster_metadata(raster_path: str) -> dict: - assert raster_path.startswith('/vsis3/hyp3-testing/opera-rtc-image-service-prototype/') - key = remove_prefix(raster_path, '/vsis3/hyp3-testing/') - download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' - name = Path(raster_path).stem - acquisition_date = \ - name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] - info = gdal.Info(raster_path, format='json') - return { - 'Raster': info['description'], - 'Name': name, - 'xMin': info['cornerCoordinates']['lowerLeft'][0], - 'yMin': info['cornerCoordinates']['lowerLeft'][1], - 'xMax': info['cornerCoordinates']['upperRight'][0], - 'yMax': info['cornerCoordinates']['upperRight'][1], - 'nRows': info['size'][1], - 'nCols': info['size'][0], - 'nBands': len(info['bands']), - 'PixelType': get_pixel_type(info['bands'][0]['type']), - 'SRS': get_projection(info['coordinateSystem']['wkt']), - 'DownloadURL': download_url, - 'URLDisplay': name, - 'Polarization': name.split('_')[9], - 'StartDate': acquisition_date, - 'EndDate': acquisition_date, - } - - -def update_csv(csv_file: str, rasters: List[str]): - if os.path.isfile(csv_file): - with open(csv_file) as f: - records = [record for record in csv.DictReader(f)] - else: - records = [] - logging.info(f'Found {len(records)} items in {csv_file}') - - existing_rasters = [record['Raster'] for record in records] - new_rasters = set(rasters) - set(existing_rasters) - - logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') - for raster in new_rasters: - record = get_raster_metadata(raster) - records.append(record) - - records = sorted(records, key=lambda x: x['Raster']) - with open(csv_file, 'w', newline='') as csvfile: - writer = csv.DictWriter(csvfile, fieldnames=records[0].keys(), lineterminator=os.linesep) - writer.writeheader() - writer.writerows(records) - - -def calculate_overview_fields(mosaic_dataset, local_path): - # This function calculates custom attribute values for the overview record - print('Calculating field values for overview record') - ds = os.path.join(local_path, mosaic_dataset) - ds_cursor = arcpy.da.UpdateCursor(ds, ['Tag', 'MinPS', 'Category', 'StartDate', 'EndDate', 'GroupName', - 'Name', 'Polarization', 'DownloadURL', 'URLDisplay']) - - logging.info('Calculating Overview Start and End Dates') - start_dates = [row[1] for row in arcpy.da.SearchCursor(mosaic_dataset, ['Tag', 'StartDate']) if row[0] != 'Dataset'] - overview_start_date = min(start_dates).replace(microsecond=0) + datetime.timedelta(hours=-8) - overview_end_date = max(start_dates).replace(microsecond=0) + datetime.timedelta(hours=8) - - if ds_cursor is not None: - print('Updating Overview Field Values') - for row in ds_cursor: - if row[0] == 'Dataset': - ProjectName, ProdTypeOvField, PolOvField, _, _, _ = row[6].split('_') - - DLOvField = 'Zoom in further to access download link' - - row[0] = f'{ProjectName}_{ProdTypeOvField}_{PolOvField}_Overview' - row[1] = 450 - row[2] = 2 - row[3] = overview_start_date - row[4] = overview_end_date - row[5] = f'{ProjectName}_{ProdTypeOvField}_{PolOvField} Mosaic Overview' - row[7] = PolOvField - row[8] = DLOvField - row[9] = DLOvField - - ds_cursor.updateRow(row) - print('Overview fields updated') - del ds_cursor - - -def add_property(property_set: etree.Element, property_key: str, property_value: str) -> None: - xsi_type = etree.QName('http://www.w3.org/2001/XMLSchema-instance', 'type') - prop = etree.SubElement(property_set, 'PropertySetProperty', {xsi_type: 'typens:PropertySetProperty'}) - etree.SubElement(prop, 'Key').text = property_key - etree.SubElement(prop, 'Value', {xsi_type: 'xs:string'}).text = property_value - - -def build_wms_extension() -> etree.Element: - xsi_type = etree.QName("http://www.w3.org/2001/XMLSchema-instance", "type") - - svc_extension = etree.Element('SVCExtension', {xsi_type: 'typens:SVCExtension'}) - - etree.SubElement(svc_extension, 'Enabled').text = 'true' - etree.SubElement(svc_extension, 'TypeName').text = 'WMSServer' - - property_set = etree.SubElement(svc_extension, 'Props', {xsi_type: 'typens:PropertySet'}) - property_array = etree.SubElement(property_set, 'PropertyArray', {xsi_type: 'typens:ArrayOfPropertySetProperty'}) - add_property(property_array, 'name', 'WMS') - add_property(property_array, 'contactOrganization', 'Alaska Satellite Facility') - add_property(property_array, 'address', '2156 Koyukuk Drive') - add_property(property_array, 'addressType', 'physical') - add_property(property_array, 'city', 'Fairbanks') - add_property(property_array, 'stateOrProvince', 'Alaska') - add_property(property_array, 'country', 'US') - add_property(property_array, 'contactVoiceTelephone', '907-474-5041') - add_property(property_array, 'contactElectronicMailAddress', 'uso@asf.alaska.edu') - add_property(property_array, 'accessConstraints', - 'There are no restrictions on the use of this data, but it must be acknowledged or ' - 'cited as follows: "This imagery was generated by ASF DAAC HyP3 using GAMMA software. ' - 'Contains modified Copernicus Sentinel data, processed by ESA."') - add_property(property_array, 'title', '') - add_property(property_array, 'abstract', '') - - info_property_set = etree.SubElement(svc_extension, 'Info', {xsi_type: 'typens:PropertySet'}) - info_property_array = etree.SubElement(info_property_set, 'PropertyArray', - {xsi_type: 'typens:ArrayOfPropertySetProperty'}) - add_property(info_property_array, 'WebEnabled', 'true') - add_property(info_property_array, 'WebCapabilities', - 'GetCapabilities,GetMap,GetFeatureInfo,GetStyles,GetLegendGraphic,GetSchemaExtension') - - return svc_extension - - -def main(): - logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s') - - parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--working-directory', default=os.getcwd()) - parser.add_argument('--server-connection-file', default='/home/arcgis/server_connection.json') - parser.add_argument('config_file') - args = parser.parse_args() - - os.environ['AWS_PROFILE'] = 'hyp3' - raster_store = os.getcwd() + r'\raster_store' - bucket = 'hyp3-testing' - overview_path = '/vsis3/hyp3-nasa-disasters/overviews/' - - template_directory = Path(__file__).parent.absolute() / 'raster_function_templates' - - with open(args.config_file) as f: - config = json.load(f) - - csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') - - raster_function_template = ''.join([f'{template_directory / template};' - for template in config['raster_function_templates']]) - if config['default_raster_function_template'] != 'None': - default_raster_function_template = str(template_directory / config['default_raster_function_template']) - else: - default_raster_function_template = 'None' - - arcpy.env.parallelProcessingFactor = '75%' - - try: - rasters = get_rasters(bucket, config['s3_prefix'], config['s3_suffix']) - update_csv(csv_file, rasters) - - for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, - before_sleep=before_sleep_log(logging, logging.WARNING)): - with attempt: - today = datetime.datetime.now(datetime.timezone.utc).strftime('%y%m%d_%H%M') - output_name = f'{config["project_name"]}_{config["dataset_name"]}_{today}' - overview_name = f'{output_name}_overview' - local_overview_filename = f'{overview_name}.crf' - s3_overview = f'{overview_path}{overview_name}.crf' - - logging.info('Creating geodatabase') - geodatabase = arcpy.management.CreateFileGDB( - out_folder_path=args.working_directory, - out_name=f'{output_name}.gdb', - ) - - logging.info('Creating mosaic dataset') - mosaic_dataset = str(arcpy.management.CreateMosaicDataset( - in_workspace=geodatabase, - in_mosaicdataset_name=config['dataset_name'], - coordinate_system=3857, - )) - - logging.info(f'Adding source rasters to {mosaic_dataset}') - arcpy.management.AddRastersToMosaicDataset( - in_mosaic_dataset=mosaic_dataset, - raster_type='Table', - input_path=csv_file, - ) - - logging.info(f'Building raster footprints for {mosaic_dataset}') - arcpy.management.BuildFootprints( - in_mosaic_dataset=mosaic_dataset, - reset_footprint='NONE', - min_data_value=0, - max_data_value=4294967295, - approx_num_vertices=12, - update_boundary='UPDATE_BOUNDARY', - ) - - logging.info(f'Building {mosaic_dataset} dataset boundary') - arcpy.management.BuildBoundary( - in_mosaic_dataset=mosaic_dataset, - append_to_existing='OVERWRITE', - simplification_method='NONE', - ) - - logging.info(f'Setting properties for {mosaic_dataset}') - arcpy.management.SetMosaicDatasetProperties( - in_mosaic_dataset=mosaic_dataset, - rows_maximum_imagesize=5000, - columns_maximum_imagesize=5000, - allowed_compressions='JPEG;NONE;LZ77', - default_compression_type='JPEG', - JPEG_quality=80, - resampling_type='NEAREST', - LERC_Tolerance=0.01, - clip_to_footprints='CLIP', - clip_to_boundary='CLIP', - color_correction='NOT_APPLY', - footprints_may_contain_nodata='FOOTPRINTS_MAY_CONTAIN_NODATA', - allowed_mensuration_capabilities='BASIC', - default_mensuration_capabilities='BASIC', - allowed_mosaic_methods='Center;NorthWest;Nadir;LockRaster;ByAttribute;Seamline;None', - default_mosaic_method='ByAttribute', - order_field='StartDate', - order_base='1/1/2050 12:00:00 AM', - sorting_order='Ascending', - mosaic_operator='FIRST', - blend_width=10, - view_point_x=300, - view_point_y=300, - max_num_per_mosaic=50, - cell_size_tolerance=1.8, - cell_size=3, - metadata_level='BASIC', - transmission_fields='Name;StartDate;EndDate;MinPS;MaxPS;LowPS;HighPS;Date;Dataset_ID;CenterX;' - 'CenterY;Tag;GroupName;Polarization;DownloadURL;URLDisplay', - use_time='ENABLED', - start_time_field='StartDate', - end_time_field='EndDate', - max_num_of_download_items=50, - max_num_of_records_returned=2000, - processing_templates=f'{raster_function_template}None', - default_processing_template=default_raster_function_template, - ) - - logging.info('Calculating cell size ranges') - arcpy.management.CalculateCellSizeRanges( - in_mosaic_dataset=mosaic_dataset, - do_compute_min='NO_MIN_CELL_SIZES', - do_compute_max='NO_MAX_CELL_SIZES', - max_range_factor=10, - cell_size_tolerance_factor=0.8, - update_missing_only='UPDATE_ALL', - ) - - logging.info(f'Calculating custom field values in {mosaic_dataset}') - arcpy.management.CalculateFields( - in_table=mosaic_dataset, - fields=[ - ['MaxPS', '460'], - ['Tag', '"_".join(!Name!.split("_")[0:3] + [!Name!.split("_")[9]])'], - ['GroupName', '!Name!.rsplit("_", 1)[0]'], - ], - ) - with tempfile.TemporaryDirectory(dir=raster_store) as temp_dir: - local_overview = os.path.join(temp_dir, local_overview_filename) - - logging.info(f'Generating {local_overview}') - with arcpy.EnvManager(cellSize=450): - arcpy.management.CopyRaster( - in_raster=mosaic_dataset, - out_rasterdataset=local_overview, - ) - - logging.info(f'Moving CRF to {s3_overview}') - subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) - - logging.info('Adding overview to mosaic dataset') - arcpy.management.AddRastersToMosaicDataset( - in_mosaic_dataset=mosaic_dataset, - raster_type='Raster Dataset', - input_path=s3_overview, - ) - - logging.info('Populate overview attributes') - calculate_overview_fields(mosaic_dataset, args.working_directory) - except arcpy.ExecuteError: - logging.error(arcpy.GetMessages()) - raise - - -if __name__ == '__main__': - main() diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 0d6b0ee3..0bb06d57 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -17,15 +17,21 @@ from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed -def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: - rasters = [] - s3 = boto3.client('s3') - paginator = s3.get_paginator('list_objects_v2') - for page in paginator.paginate(Bucket=bucket, Prefix=prefix): - for obj in page['Contents']: - if obj['Key'].endswith(suffix): - rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') - return rasters +# def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: +# rasters = [] +# s3 = boto3.client('s3') +# paginator = s3.get_paginator('list_objects_v2') +# for page in paginator.paginate(Bucket=bucket, Prefix=prefix): +# for obj in page['Contents']: +# if obj['Key'].endswith(suffix): +# rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') +# return rasters + + +def get_rasters(url_file): + with open(url_file, newline='') as urlfile: + records = urlfile.read().split('\n')[:-1] + return records def get_pixel_type(data_type: str) -> int: @@ -47,7 +53,7 @@ def remove_prefix(raster_path, prefix): def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: - assert raster_path.startswith(f'/vsis3/{bucket}/{s3_prefix}/') + #assert raster_path.startswith(f'/vsis3/{bucket}/{s3_prefix}/') key = remove_prefix(raster_path, f'/vsis3/{bucket}/') download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' name = Path(raster_path).stem @@ -198,6 +204,7 @@ def main(): with open(args.config_file) as f: config = json.load(f) + url_file = '/home/arcgis/gis-services/image_services/opera/urls.txt' csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' @@ -210,7 +217,8 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' try: - rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) + #rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) + rasters = get_rasters(url_file) update_csv(csv_file, rasters, config['bucket'], config['s3_prefix']) for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, From 47a89855b4a670fa829d64baaa5f4f388e732885 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 10 Nov 2023 18:02:33 -0900 Subject: [PATCH 114/193] add in cookie jar --- image_services/opera/make_opera_services.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 0bb06d57..e762d216 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -205,6 +205,10 @@ def main(): config = json.load(f) url_file = '/home/arcgis/gis-services/image_services/opera/urls.txt' + cookie_file = Path.home() / 'cookies.txt' + os.environ['GDAL_HTTP_COOKIEFILE'] = str(cookie_file) + os.environ['GDAL_HTTP_COOKIEJAR'] = str(cookie_file) + csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' From d0ae9da22e06bd9fd119236f342442064f13074d Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 10 Nov 2023 18:06:24 -0900 Subject: [PATCH 115/193] TEMPORARY: add path for my computer --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index e762d216..4c2d2ec7 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -204,7 +204,7 @@ def main(): with open(args.config_file) as f: config = json.load(f) - url_file = '/home/arcgis/gis-services/image_services/opera/urls.txt' + url_file = '/home/arcgis/jrsmale/gis-services/image_services/opera/urls.txt' cookie_file = Path.home() / 'cookies.txt' os.environ['GDAL_HTTP_COOKIEFILE'] = str(cookie_file) os.environ['GDAL_HTTP_COOKIEJAR'] = str(cookie_file) From 6f0a4c7c9b5b48b65662bcbd3ac241c947b9e5d2 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 10 Nov 2023 18:13:16 -0900 Subject: [PATCH 116/193] add in vsicurl --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 4c2d2ec7..fb15ad93 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -59,7 +59,7 @@ def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: name = Path(raster_path).stem acquisition_date = \ name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] - info = gdal.Info(raster_path, format='json') + info = gdal.Info(f'/vsicurl/{raster_path}', format='json') return { 'Raster': info['description'], 'Name': name, From 7d2be006fd080712699f403c9cdaa617442e6382 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 10 Nov 2023 19:51:10 -0900 Subject: [PATCH 117/193] return raster urls with visicurl --- image_services/opera/make_opera_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index fb15ad93..d2822b20 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -31,7 +31,7 @@ def get_rasters(url_file): with open(url_file, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] - return records + return [([f'/viscurl/{record}' for record in records])] def get_pixel_type(data_type: str) -> int: @@ -59,7 +59,7 @@ def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: name = Path(raster_path).stem acquisition_date = \ name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] - info = gdal.Info(f'/vsicurl/{raster_path}', format='json') + info = gdal.Info(raster_path, format='json') return { 'Raster': info['description'], 'Name': name, From 91c5116b401a92cc6efa6111fbc21b1166d434f6 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 10 Nov 2023 19:53:42 -0900 Subject: [PATCH 118/193] return raster urls with visicurl --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index d2822b20..66aec480 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -31,7 +31,7 @@ def get_rasters(url_file): with open(url_file, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] - return [([f'/viscurl/{record}' for record in records])] + return [f'/viscurl/{record}' for record in records] def get_pixel_type(data_type: str) -> int: From 76f029697166a82365ef6a2e5a01f328e7f7084d Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 10 Nov 2023 19:54:26 -0900 Subject: [PATCH 119/193] fix misspelling --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 66aec480..2b404395 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -31,7 +31,7 @@ def get_rasters(url_file): with open(url_file, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] - return [f'/viscurl/{record}' for record in records] + return [f'/vsicurl/{record}' for record in records] def get_pixel_type(data_type: str) -> int: From 0f51fd9974d893d5b81d2fb14d5a31bffb2c4291 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 13 Nov 2023 15:22:32 -0900 Subject: [PATCH 120/193] conceptual framework for url file generation --- image_services/opera/config/rtc_vv.json | 2 +- image_services/opera/make_opera_services.py | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index e7d8e8e4..f3048e0d 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -19,7 +19,7 @@ "Type": "esriServiceDefinitionType_Replacement", "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", - "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA.", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 2b404395..623feb39 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -28,10 +28,18 @@ # return rasters +def add_urls(): + # code to find URLs for new acquisitions since the last update and write them to a url_file.txt + # - CMR query or asf_search results + # - crawl the EDC opera S3 bucket + return [url_file] + url_file = '/home/arcgis/jrsmale/gis-services/image_services/opera/vsis3_urls.txt' + + def get_rasters(url_file): with open(url_file, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] - return [f'/vsicurl/{record}' for record in records] + return [f'{record}' for record in records] def get_pixel_type(data_type: str) -> int: @@ -204,11 +212,11 @@ def main(): with open(args.config_file) as f: config = json.load(f) - url_file = '/home/arcgis/jrsmale/gis-services/image_services/opera/urls.txt' cookie_file = Path.home() / 'cookies.txt' os.environ['GDAL_HTTP_COOKIEFILE'] = str(cookie_file) os.environ['GDAL_HTTP_COOKIEJAR'] = str(cookie_file) + url_file = add_urls() csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' From 10944e2b6815a174ad404398121226adcee5a155 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 13 Nov 2023 16:40:40 -0900 Subject: [PATCH 121/193] add in changes talked about with Anderw --- image_services/opera/make_opera_services.py | 41 ++++++++++++++++----- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 623feb39..40879067 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -12,6 +12,7 @@ import arcpy import boto3 from arcgis.gis.server import Server +import asf_search from lxml import etree from osgeo import gdal, osr from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed @@ -28,12 +29,34 @@ # return rasters -def add_urls(): - # code to find URLs for new acquisitions since the last update and write them to a url_file.txt - # - CMR query or asf_search results - # - crawl the EDC opera S3 bucket - return [url_file] - url_file = '/home/arcgis/jrsmale/gis-services/image_services/opera/vsis3_urls.txt' +def add_urls(start_date: str = '2023-10-25T08:00:00Z'): + ## TODO: Determine an appropriate start date + ## TODO: get rid of or update the interesects with option + options = { + 'intersectsWith': 'POLYGON((-78.5937 37.5232,-74.494 37.5232,-74.494 39.8807,-78.5937 39.8807,-78.5937 ' + '37.5232))', + 'dataset': 'OPERA-S1', + 'start': start_date, + 'processingLevel': 'RTC', + 'polarization': 'VH', + } + results = asf_search.search(**options) + + urls = [] + for result in results: + for item in result.umm['RelatedUrls']: + url = item['URL'] + if url.startswith('s3://') and url.endswith('VH.tif'): + urls.append(url.replace('s3://', '/vsis3/')) + + # We could eventually remove this and just pass the urls directly to update_csv + csv_file = f'{os.getcwd()}/urls.txt' + with open(csv_file, 'w', newline='') as f: + writer = csv.writer(f) + for url in urls: + writer.writerows(url) + + return csv_file def get_rasters(url_file): @@ -61,9 +84,9 @@ def remove_prefix(raster_path, prefix): def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: - #assert raster_path.startswith(f'/vsis3/{bucket}/{s3_prefix}/') + assert raster_path.startswith(f'/vsis3/{bucket}/') key = remove_prefix(raster_path, f'/vsis3/{bucket}/') - download_url = f'https://hyp3-testing.s3.us-west-2.amazonaws.com/{key}' + download_url = f'https://datapool.asf.alaska.edu/RTC/{key}' name = Path(raster_path).stem acquisition_date = \ name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] @@ -229,7 +252,7 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' try: - #rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) + # rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) rasters = get_rasters(url_file) update_csv(csv_file, rasters, config['bucket'], config['s3_prefix']) From 58a7bfbc94082fcbf5185a0ed41816cc6f223432 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 13 Nov 2023 16:43:49 -0900 Subject: [PATCH 122/193] update the vh file to have a URL-specific service name --- image_services/opera/config/rtc_vh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index 9539449e..d7166946 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -5,7 +5,7 @@ "overview_path": "/vsis3/gis-service-overviews/overviews/", "s3_prefix": "opera-rtc-image-service-na/VH", "s3_suffix": "_VH.tif", - "dataset_name": "RTC_VH", + "dataset_name": "RTC_VH_URLS", "raster_function_templates": [ "Sentinel1_RTC_Power.rft.xml", "Sentinel1_RTC_Amplitude.rft.xml", From 46f21c893a86d0b5d1c6de45052f8a42fbfb16ad Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 13 Nov 2023 16:49:00 -0900 Subject: [PATCH 123/193] get rid of commented code --- image_services/opera/make_opera_services.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 40879067..43e7ddc8 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -18,17 +18,6 @@ from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed -# def get_rasters(bucket: str, prefix: str, suffix: str) -> List[str]: -# rasters = [] -# s3 = boto3.client('s3') -# paginator = s3.get_paginator('list_objects_v2') -# for page in paginator.paginate(Bucket=bucket, Prefix=prefix): -# for obj in page['Contents']: -# if obj['Key'].endswith(suffix): -# rasters.append(f'/vsis3/{bucket}/{obj["Key"]}') -# return rasters - - def add_urls(start_date: str = '2023-10-25T08:00:00Z'): ## TODO: Determine an appropriate start date ## TODO: get rid of or update the interesects with option From 5d7a6a6d4a55e6c342be7e9da5e18375ec74312b Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 13 Nov 2023 16:49:34 -0900 Subject: [PATCH 124/193] require asf_search in env --- image_server/environment.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/image_server/environment.yml b/image_server/environment.yml index 596817bc..7ac8a6d3 100644 --- a/image_server/environment.yml +++ b/image_server/environment.yml @@ -5,6 +5,7 @@ channels: dependencies: - python=3.7 - arcgis-server-py3=10.9.1 + - asf_search>=6.7.0 - boto3 - gdal>=2.4.4,<3 - lxml From 933c09be2592a87e470b973bb75827ecdd6d1135 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 13 Nov 2023 17:08:03 -0900 Subject: [PATCH 125/193] clean up a bit of the URL shenanigans --- image_services/opera/make_opera_services.py | 25 ++++----------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 43e7ddc8..134c2165 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -18,14 +18,13 @@ from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed -def add_urls(start_date: str = '2023-10-25T08:00:00Z'): - ## TODO: Determine an appropriate start date +def get_rasters(): ## TODO: get rid of or update the interesects with option options = { 'intersectsWith': 'POLYGON((-78.5937 37.5232,-74.494 37.5232,-74.494 39.8807,-78.5937 39.8807,-78.5937 ' '37.5232))', 'dataset': 'OPERA-S1', - 'start': start_date, + 'start': '2023-10-25T08:00:00Z', 'processingLevel': 'RTC', 'polarization': 'VH', } @@ -37,21 +36,7 @@ def add_urls(start_date: str = '2023-10-25T08:00:00Z'): url = item['URL'] if url.startswith('s3://') and url.endswith('VH.tif'): urls.append(url.replace('s3://', '/vsis3/')) - - # We could eventually remove this and just pass the urls directly to update_csv - csv_file = f'{os.getcwd()}/urls.txt' - with open(csv_file, 'w', newline='') as f: - writer = csv.writer(f) - for url in urls: - writer.writerows(url) - - return csv_file - - -def get_rasters(url_file): - with open(url_file, newline='') as urlfile: - records = urlfile.read().split('\n')[:-1] - return [f'{record}' for record in records] + return urls def get_pixel_type(data_type: str) -> int: @@ -228,7 +213,6 @@ def main(): os.environ['GDAL_HTTP_COOKIEFILE'] = str(cookie_file) os.environ['GDAL_HTTP_COOKIEJAR'] = str(cookie_file) - url_file = add_urls() csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' @@ -241,8 +225,7 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' try: - # rasters = get_rasters(config['bucket'], config['s3_prefix'], config['s3_suffix']) - rasters = get_rasters(url_file) + rasters = get_rasters() update_csv(csv_file, rasters, config['bucket'], config['s3_prefix']) for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, From 318cb87277a0379bde1a40a1c438a95c42b4b299 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 10:08:47 -0900 Subject: [PATCH 126/193] last minute changes before merging --- image_services/opera/config/rtc_vh.json | 2 +- image_services/opera/config/rtc_vh_urls.json | 41 ++++++++++++++++++++ image_services/opera/make_opera_services.py | 3 +- 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 image_services/opera/config/rtc_vh_urls.json diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index d7166946..9539449e 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -5,7 +5,7 @@ "overview_path": "/vsis3/gis-service-overviews/overviews/", "s3_prefix": "opera-rtc-image-service-na/VH", "s3_suffix": "_VH.tif", - "dataset_name": "RTC_VH_URLS", + "dataset_name": "RTC_VH", "raster_function_templates": [ "Sentinel1_RTC_Power.rft.xml", "Sentinel1_RTC_Amplitude.rft.xml", diff --git a/image_services/opera/config/rtc_vh_urls.json b/image_services/opera/config/rtc_vh_urls.json new file mode 100644 index 00000000..d7166946 --- /dev/null +++ b/image_services/opera/config/rtc_vh_urls.json @@ -0,0 +1,41 @@ +{ + "project_name": "OPERA", + "raster_store": "/home/arcgis/raster_store/", + "bucket": "hyp3-testing", + "overview_path": "/vsis3/gis-service-overviews/overviews/", + "s3_prefix": "opera-rtc-image-service-na/VH", + "s3_suffix": "_VH.tif", + "dataset_name": "RTC_VH_URLS", + "raster_function_templates": [ + "Sentinel1_RTC_Power.rft.xml", + "Sentinel1_RTC_Amplitude.rft.xml", + "Sentinel1_RTC_dB.rft.xml", + "Sentinel1_RTC_dB_Stretch.rft.xml" + ], + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", + "service_folder": "OPERA", + "service_name": "OPERA_RTC_VH", + "service_definition_overrides": { + "Type": "esriServiceDefinitionType_Replacement", + "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='usageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='waitTimeout']/Value": "120", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='IdleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='keepAliveInterval']/Value": "600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MinInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MaxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='UsageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='WaitTimeout']/Value": "120", + "ItemInfo/Title": "OPERA RTC VH", + "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "ItemInfo/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "ItemInfo/Snippet": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_VH_WMS", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='abstract']/Value": "WMS service for Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL)." + } +} diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 134c2165..12b8a7a5 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -10,9 +10,8 @@ from typing import List import arcpy -import boto3 -from arcgis.gis.server import Server import asf_search +from arcgis.gis.server import Server from lxml import etree from osgeo import gdal, osr from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed From 42f47fa11db5d14c7ea523adfd22c1118c9460ee Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 10:10:25 -0900 Subject: [PATCH 127/193] remove extra # --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 12b8a7a5..17bce31c 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -18,7 +18,7 @@ def get_rasters(): - ## TODO: get rid of or update the interesects with option + # TODO: get rid of or update the interesects with option options = { 'intersectsWith': 'POLYGON((-78.5937 37.5232,-74.494 37.5232,-74.494 39.8807,-78.5937 39.8807,-78.5937 ' '37.5232))', From 80e3742b5dc848533b8489ef00cff0acf255acb2 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 10:20:57 -0900 Subject: [PATCH 128/193] update script to pull from csv file --- image_services/opera/make_opera_services.py | 23 ++++----------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 17bce31c..4efc969a 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -10,7 +10,6 @@ from typing import List import arcpy -import asf_search from arcgis.gis.server import Server from lxml import etree from osgeo import gdal, osr @@ -18,24 +17,10 @@ def get_rasters(): - # TODO: get rid of or update the interesects with option - options = { - 'intersectsWith': 'POLYGON((-78.5937 37.5232,-74.494 37.5232,-74.494 39.8807,-78.5937 39.8807,-78.5937 ' - '37.5232))', - 'dataset': 'OPERA-S1', - 'start': '2023-10-25T08:00:00Z', - 'processingLevel': 'RTC', - 'polarization': 'VH', - } - results = asf_search.search(**options) - - urls = [] - for result in results: - for item in result.umm['RelatedUrls']: - url = item['URL'] - if url.startswith('s3://') and url.endswith('VH.tif'): - urls.append(url.replace('s3://', '/vsis3/')) - return urls + url_file = f'{os.getcwd()}/vsis3_urls.txt' + with open(url_file, newline='') as urlfile: + records = urlfile.read().split('\n')[:-1] + return [f'{record}' for record in records] def get_pixel_type(data_type: str) -> int: From a6551959d03525b746dc0e5283d0bfc6cf09e9fb Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 10:22:18 -0900 Subject: [PATCH 129/193] add in vsis3 file --- image_services/opera/vsis3_urls.txt | 125 ++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 image_services/opera/vsis3_urls.txt diff --git a/image_services/opera/vsis3_urls.txt b/image_services/opera/vsis3_urls.txt new file mode 100644 index 00000000..87347981 --- /dev/null +++ b/image_services/opera/vsis3_urls.txt @@ -0,0 +1,125 @@ +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163475-IW3_20231104T231603Z_20231106T060117Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163475-IW3_20231104T231603Z_20231106T060117Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163474-IW3_20231104T231600Z_20231106T060117Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163474-IW3_20231104T231600Z_20231106T060117Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163473-IW3_20231104T231557Z_20231106T060117Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163473-IW3_20231104T231557Z_20231106T060117Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163472-IW3_20231104T231554Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163472-IW3_20231104T231554Z_20231106T061048Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163471-IW3_20231104T231552Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163471-IW3_20231104T231552Z_20231106T061048Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163470-IW3_20231104T231549Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163470-IW3_20231104T231549Z_20231106T061048Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163469-IW3_20231104T231546Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163469-IW3_20231104T231546Z_20231106T061048Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163468-IW3_20231104T231543Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163468-IW3_20231104T231543Z_20231106T061048Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163467-IW3_20231104T231541Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163467-IW3_20231104T231541Z_20231106T061048Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163466-IW3_20231104T231538Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163466-IW3_20231104T231538Z_20231106T061048Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163465-IW3_20231104T231535Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163465-IW3_20231104T231535Z_20231106T061048Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163464-IW3_20231104T231532Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163464-IW3_20231104T231532Z_20231106T061048Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163463-IW3_20231104T231530Z_20231106T061123Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163463-IW3_20231104T231530Z_20231106T061123Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163462-IW3_20231104T231527Z_20231106T061123Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163462-IW3_20231104T231527Z_20231106T061123Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163462-IW2_20231104T231526Z_20231106T061123Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163462-IW2_20231104T231526Z_20231106T061123Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163461-IW3_20231104T231524Z_20231106T061123Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163461-IW3_20231104T231524Z_20231106T061123Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068969-IW1_20231101T225127Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068969-IW1_20231101T225127Z_20231104T145817Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068968-IW1_20231101T225124Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068968-IW1_20231101T225124Z_20231104T145817Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068967-IW1_20231101T225122Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068967-IW1_20231101T225122Z_20231104T145817Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068966-IW1_20231101T225119Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068966-IW1_20231101T225119Z_20231104T145817Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068965-IW1_20231101T225116Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068965-IW1_20231101T225116Z_20231104T145817Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068964-IW1_20231101T225113Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068964-IW1_20231101T225113Z_20231104T145817Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068963-IW1_20231101T225110Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068963-IW1_20231101T225110Z_20231104T145817Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068962-IW1_20231101T225108Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068962-IW1_20231101T225108Z_20231104T145718Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068961-IW1_20231101T225105Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068961-IW1_20231101T225105Z_20231104T145718Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068960-IW1_20231101T225102Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068960-IW1_20231101T225102Z_20231104T145718Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068959-IW1_20231101T225059Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068959-IW1_20231101T225059Z_20231104T145718Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068958-IW1_20231101T225057Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068958-IW1_20231101T225057Z_20231104T145718Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068957-IW1_20231101T225054Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068957-IW1_20231101T225054Z_20231104T145718Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068956-IW1_20231101T225051Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068956-IW1_20231101T225051Z_20231104T145718Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006679-IW1_20231030T230755Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006679-IW1_20231030T230755Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006678-IW2_20231030T230753Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006678-IW2_20231030T230753Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006678-IW1_20231030T230752Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006678-IW1_20231030T230752Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006677-IW3_20231030T230751Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006677-IW3_20231030T230751Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006677-IW2_20231030T230750Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006677-IW2_20231030T230750Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006677-IW1_20231030T230749Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006677-IW1_20231030T230749Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006676-IW3_20231030T230748Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006676-IW3_20231030T230748Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006676-IW2_20231030T230747Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006676-IW2_20231030T230747Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006676-IW1_20231030T230746Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006676-IW1_20231030T230746Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006675-IW3_20231030T230745Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006675-IW3_20231030T230745Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006675-IW2_20231030T230745Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006675-IW2_20231030T230745Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006675-IW1_20231030T230744Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006675-IW1_20231030T230744Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006674-IW3_20231030T230743Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006674-IW3_20231030T230743Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006674-IW2_20231030T230742Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006674-IW2_20231030T230742Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006674-IW1_20231030T230741Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006674-IW1_20231030T230741Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006673-IW3_20231030T230740Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006673-IW3_20231030T230740Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006673-IW2_20231030T230739Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006673-IW2_20231030T230739Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006673-IW1_20231030T230738Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006673-IW1_20231030T230738Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006672-IW3_20231030T230737Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006672-IW3_20231030T230737Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006672-IW2_20231030T230736Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006672-IW2_20231030T230736Z_20231103T082045Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006672-IW1_20231030T230735Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006672-IW1_20231030T230735Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006671-IW3_20231030T230734Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006671-IW3_20231030T230734Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006671-IW2_20231030T230733Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006671-IW2_20231030T230733Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006671-IW1_20231030T230733Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006671-IW1_20231030T230733Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006670-IW3_20231030T230732Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006670-IW3_20231030T230732Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006670-IW2_20231030T230731Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006670-IW2_20231030T230731Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006670-IW1_20231030T230730Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006670-IW1_20231030T230730Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006669-IW3_20231030T230729Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006669-IW3_20231030T230729Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006669-IW2_20231030T230728Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006669-IW2_20231030T230728Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006669-IW1_20231030T230727Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006669-IW1_20231030T230727Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006668-IW3_20231030T230726Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006668-IW3_20231030T230726Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006668-IW2_20231030T230725Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006668-IW2_20231030T230725Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006668-IW1_20231030T230724Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006668-IW1_20231030T230724Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006667-IW3_20231030T230723Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006667-IW3_20231030T230723Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006667-IW2_20231030T230722Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006667-IW2_20231030T230722Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006667-IW1_20231030T230722Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006667-IW1_20231030T230722Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006666-IW3_20231030T230721Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006666-IW3_20231030T230721Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006666-IW2_20231030T230720Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006666-IW2_20231030T230720Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006666-IW1_20231030T230719Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006666-IW1_20231030T230719Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006665-IW3_20231030T230718Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006665-IW3_20231030T230718Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006665-IW2_20231030T230717Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006665-IW2_20231030T230717Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006665-IW1_20231030T230716Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006665-IW1_20231030T230716Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006664-IW3_20231030T230715Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006664-IW3_20231030T230715Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006664-IW2_20231030T230714Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006664-IW2_20231030T230714Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006664-IW1_20231030T230713Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006664-IW1_20231030T230713Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006663-IW3_20231030T230712Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006663-IW3_20231030T230712Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006663-IW2_20231030T230711Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006663-IW2_20231030T230711Z_20231103T075630Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006662-IW3_20231030T230710Z_20231103T070137Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006662-IW3_20231030T230710Z_20231103T070137Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225768-IW1_20231025T225942Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225768-IW1_20231025T225942Z_20231026T215447Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225767-IW2_20231025T225940Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225767-IW2_20231025T225940Z_20231026T215447Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225767-IW1_20231025T225939Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225767-IW1_20231025T225939Z_20231026T215447Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225766-IW2_20231025T225937Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225766-IW2_20231025T225937Z_20231026T215447Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225766-IW1_20231025T225936Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225766-IW1_20231025T225936Z_20231026T215447Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225765-IW3_20231025T225936Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225765-IW3_20231025T225936Z_20231026T215447Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225765-IW2_20231025T225935Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225765-IW2_20231025T225935Z_20231026T215447Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225765-IW1_20231025T225934Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225765-IW1_20231025T225934Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225764-IW3_20231025T225933Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225764-IW3_20231025T225933Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225764-IW2_20231025T225932Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225764-IW2_20231025T225932Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225764-IW1_20231025T225931Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225764-IW1_20231025T225931Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225763-IW3_20231025T225930Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225763-IW3_20231025T225930Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225763-IW2_20231025T225929Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225763-IW2_20231025T225929Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225763-IW1_20231025T225928Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225763-IW1_20231025T225928Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225762-IW3_20231025T225927Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225762-IW3_20231025T225927Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225762-IW2_20231025T225926Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225762-IW2_20231025T225926Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225762-IW1_20231025T225925Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225762-IW1_20231025T225925Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225761-IW3_20231025T225925Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225761-IW3_20231025T225925Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225761-IW2_20231025T225924Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225761-IW2_20231025T225924Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225761-IW1_20231025T225923Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225761-IW1_20231025T225923Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225760-IW3_20231025T225922Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225760-IW3_20231025T225922Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225760-IW2_20231025T225921Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225760-IW2_20231025T225921Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225760-IW1_20231025T225920Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225760-IW1_20231025T225920Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225759-IW3_20231025T225919Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225759-IW3_20231025T225919Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225759-IW2_20231025T225918Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225759-IW2_20231025T225918Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225759-IW1_20231025T225917Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225759-IW1_20231025T225917Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225758-IW3_20231025T225916Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225758-IW3_20231025T225916Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225758-IW2_20231025T225915Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225758-IW2_20231025T225915Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225758-IW1_20231025T225914Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225758-IW1_20231025T225914Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225757-IW3_20231025T225914Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225757-IW3_20231025T225914Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225757-IW2_20231025T225913Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225757-IW2_20231025T225913Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225757-IW1_20231025T225912Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225757-IW1_20231025T225912Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225756-IW3_20231025T225911Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225756-IW3_20231025T225911Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225756-IW2_20231025T225910Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225756-IW2_20231025T225910Z_20231026T220726Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225756-IW1_20231025T225909Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225756-IW1_20231025T225909Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225755-IW3_20231025T225908Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225755-IW3_20231025T225908Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225755-IW2_20231025T225907Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225755-IW2_20231025T225907Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225755-IW1_20231025T225906Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225755-IW1_20231025T225906Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225754-IW3_20231025T225905Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225754-IW3_20231025T225905Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225754-IW2_20231025T225904Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225754-IW2_20231025T225904Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225754-IW1_20231025T225903Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225754-IW1_20231025T225903Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225753-IW3_20231025T225903Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225753-IW3_20231025T225903Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225753-IW2_20231025T225902Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225753-IW2_20231025T225902Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225753-IW1_20231025T225901Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225753-IW1_20231025T225901Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225752-IW3_20231025T225900Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225752-IW3_20231025T225900Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225752-IW2_20231025T225859Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225752-IW2_20231025T225859Z_20231026T220003Z_S1A_30_v1.0_VH.tif +/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225751-IW3_20231025T225857Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225751-IW3_20231025T225857Z_20231026T220003Z_S1A_30_v1.0_VH.tif From bf2f8447bebf6d72e618f490a79014be7b3b8b72 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 10:40:17 -0900 Subject: [PATCH 130/193] udpate url bucket --- image_services/opera/config/rtc_vh_urls.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_vh_urls.json b/image_services/opera/config/rtc_vh_urls.json index d7166946..ce14c29d 100644 --- a/image_services/opera/config/rtc_vh_urls.json +++ b/image_services/opera/config/rtc_vh_urls.json @@ -1,7 +1,7 @@ { "project_name": "OPERA", "raster_store": "/home/arcgis/raster_store/", - "bucket": "hyp3-testing", + "bucket": "asf-cumulus-prod-opera-products", "overview_path": "/vsis3/gis-service-overviews/overviews/", "s3_prefix": "opera-rtc-image-service-na/VH", "s3_suffix": "_VH.tif", From 178e85be171ee01a92aabe2aaa461dd34d399f67 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 10:44:22 -0900 Subject: [PATCH 131/193] change raster path to url --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 4efc969a..54e0f16d 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -48,7 +48,7 @@ def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: name = Path(raster_path).stem acquisition_date = \ name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] - info = gdal.Info(raster_path, format='json') + info = gdal.Info(download_url, format='json') return { 'Raster': info['description'], 'Name': name, From dae889fc4401d02647fcfd05883a5a307c168606 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 10:57:53 -0900 Subject: [PATCH 132/193] move around some things --- image_services/opera/make_opera_services.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 54e0f16d..c5132db5 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -43,12 +43,11 @@ def remove_prefix(raster_path, prefix): def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: assert raster_path.startswith(f'/vsis3/{bucket}/') - key = remove_prefix(raster_path, f'/vsis3/{bucket}/') - download_url = f'https://datapool.asf.alaska.edu/RTC/{key}' name = Path(raster_path).stem + download_url = f'https://datapool.asf.alaska.edu/RTC/OPERA-S1/{name}.tif' acquisition_date = \ name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] - info = gdal.Info(download_url, format='json') + info = gdal.Info(raster_path, format='json') return { 'Raster': info['description'], 'Name': name, From 0a20b83e52800de07c2528a8eac2262249ee0e9c Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 10:59:05 -0900 Subject: [PATCH 133/193] switch download url --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index c5132db5..a7ac6f72 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -47,7 +47,7 @@ def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: download_url = f'https://datapool.asf.alaska.edu/RTC/OPERA-S1/{name}.tif' acquisition_date = \ name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] - info = gdal.Info(raster_path, format='json') + info = gdal.Info(download_url, format='json') return { 'Raster': info['description'], 'Name': name, From a2a9be5be4faf4b73d4bef8cdcf4635236eb0e02 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 11:22:48 -0900 Subject: [PATCH 134/193] switch back to raster path --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index a7ac6f72..c5132db5 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -47,7 +47,7 @@ def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: download_url = f'https://datapool.asf.alaska.edu/RTC/OPERA-S1/{name}.tif' acquisition_date = \ name[36:38] + '/' + name[38:40] + '/' + name[32:36] + ' ' + name[41:43] + ':' + name[43:45] + ':' + name[45:47] - info = gdal.Info(download_url, format='json') + info = gdal.Info(raster_path, format='json') return { 'Raster': info['description'], 'Name': name, From db2b343ef46cb65dd6ee7861c0142a0d8b7345b2 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 14 Nov 2023 12:23:44 -0900 Subject: [PATCH 135/193] change maximum number of rasters displayed to 75 --- image_services/rtc_services/make_rtc_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/rtc_services/make_rtc_service.py b/image_services/rtc_services/make_rtc_service.py index fd1e2669..7e4f9125 100644 --- a/image_services/rtc_services/make_rtc_service.py +++ b/image_services/rtc_services/make_rtc_service.py @@ -260,7 +260,7 @@ def build_wms_extension() -> etree.Element: blend_width=10, view_point_x=300, view_point_y=300, - max_num_per_mosaic=50, + max_num_per_mosaic=75, cell_size_tolerance=1.8, cell_size=3, metadata_level='BASIC', From 181e85d05fe3f97866a06d72f0877a4a6e6bd904 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 14 Nov 2023 12:24:17 -0900 Subject: [PATCH 136/193] Revert "change maximum number of rasters displayed to 75" This reverts commit db2b343ef46cb65dd6ee7861c0142a0d8b7345b2. --- image_services/rtc_services/make_rtc_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/rtc_services/make_rtc_service.py b/image_services/rtc_services/make_rtc_service.py index 7e4f9125..fd1e2669 100644 --- a/image_services/rtc_services/make_rtc_service.py +++ b/image_services/rtc_services/make_rtc_service.py @@ -260,7 +260,7 @@ def build_wms_extension() -> etree.Element: blend_width=10, view_point_x=300, view_point_y=300, - max_num_per_mosaic=75, + max_num_per_mosaic=50, cell_size_tolerance=1.8, cell_size=3, metadata_level='BASIC', From d321c0f9335560b5af3a60ed8ee613090f5ac4b9 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Tue, 14 Nov 2023 12:24:36 -0900 Subject: [PATCH 137/193] change maximum number of rasters displayed to 75 --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 17bce31c..417d8574 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -299,7 +299,7 @@ def main(): blend_width=10, view_point_x=300, view_point_y=300, - max_num_per_mosaic=50, + max_num_per_mosaic=75, cell_size_tolerance=1.8, cell_size=3, metadata_level='BASIC', From 7481c7f6a6b94c454a39719f69bf15166c29755e Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 13:53:40 -0900 Subject: [PATCH 138/193] add in region --- image_services/opera/make_opera_services.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index c5132db5..af9661c8 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -196,6 +196,9 @@ def main(): os.environ['GDAL_HTTP_COOKIEFILE'] = str(cookie_file) os.environ['GDAL_HTTP_COOKIEJAR'] = str(cookie_file) + gdal.SetConfigOption('AWS_DEFAULT_REGION', 'us-west-2') + os.environ['AWS_DEFAULT_REGION'] = 'us-west-2' + csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' From 50d2466a394fa4584645ea973b20caf03e7703ac Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 23:54:06 -0900 Subject: [PATCH 139/193] add in environs --- image_services/opera/make_opera_services.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index af9661c8..dde882b7 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -198,6 +198,7 @@ def main(): gdal.SetConfigOption('AWS_DEFAULT_REGION', 'us-west-2') os.environ['AWS_DEFAULT_REGION'] = 'us-west-2' + os.environ['AWS_PROFILE']='edc-prod' csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') @@ -330,6 +331,8 @@ def main(): out_rasterdataset=local_overview, ) + os.environ['AWS_PROFILE']='hyp3' + logging.info(f'Moving CRF to {s3_overview}') subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) From bae41c7e8eb43ae94c0cea33d531b58e42b833a7 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 14 Nov 2023 23:54:31 -0900 Subject: [PATCH 140/193] reformat --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index dde882b7..bbfe21b5 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -331,7 +331,7 @@ def main(): out_rasterdataset=local_overview, ) - os.environ['AWS_PROFILE']='hyp3' + os.environ['AWS_PROFILE'] = 'hyp3' logging.info(f'Moving CRF to {s3_overview}') subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) From ed534512e1dc4d171c84560b0ff49ab8b26104e6 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 15 Nov 2023 08:50:25 -0900 Subject: [PATCH 141/193] add in gdal config option --- image_services/opera/make_opera_services.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index bbfe21b5..0ddcb0a1 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -198,7 +198,9 @@ def main(): gdal.SetConfigOption('AWS_DEFAULT_REGION', 'us-west-2') os.environ['AWS_DEFAULT_REGION'] = 'us-west-2' - os.environ['AWS_PROFILE']='edc-prod' + + gdal.SetConfigOption('AWS_PROFILE', 'edc-prod') + os.environ['AWS_PROFILE'] = 'edc-prod' csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') @@ -332,7 +334,6 @@ def main(): ) os.environ['AWS_PROFILE'] = 'hyp3' - logging.info(f'Moving CRF to {s3_overview}') subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) From 04d4731c1edd5616dc36a43f6f0a8d82b894292d Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 15 Nov 2023 13:54:54 -0900 Subject: [PATCH 142/193] remove extra s3_prefixes --- image_services/opera/make_opera_services.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 0ddcb0a1..b143eced 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -41,7 +41,7 @@ def remove_prefix(raster_path, prefix): return raster_path[len(prefix):] -def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: +def get_raster_metadata(raster_path: str, bucket: str) -> dict: assert raster_path.startswith(f'/vsis3/{bucket}/') name = Path(raster_path).stem download_url = f'https://datapool.asf.alaska.edu/RTC/OPERA-S1/{name}.tif' @@ -68,7 +68,7 @@ def get_raster_metadata(raster_path: str, bucket: str, s3_prefix: str) -> dict: } -def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): +def update_csv(csv_file: str, rasters: List[str], bucket: str): if os.path.isfile(csv_file): with open(csv_file) as f: records = [record for record in csv.DictReader(f)] @@ -81,13 +81,13 @@ def update_csv(csv_file: str, rasters: List[str], bucket: str, s3_prefix: str): logging.info(f'Adding {len(new_rasters)} new items to {csv_file}') if new_rasters: - header_record = get_raster_metadata(next(iter(new_rasters)), bucket, s3_prefix) + header_record = get_raster_metadata(next(iter(new_rasters)), bucket) with open(csv_file, 'a', newline='') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=header_record.keys(), lineterminator=os.linesep) if not existing_rasters: writer.writeheader() for raster in new_rasters: - record = get_raster_metadata(raster, bucket, s3_prefix) + record = get_raster_metadata(raster, bucket) writer.writerow(record) with open(csv_file) as f: @@ -215,7 +215,7 @@ def main(): try: rasters = get_rasters() - update_csv(csv_file, rasters, config['bucket'], config['s3_prefix']) + update_csv(csv_file, rasters, config['bucket']) for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, before_sleep=before_sleep_log(logging, logging.WARNING)): From 03bba84b004d4aaf2a27a7596c7b0b62b3bb0e95 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 15 Nov 2023 14:03:33 -0900 Subject: [PATCH 143/193] remove unnecessary environ --- image_services/opera/make_opera_services.py | 1 - 1 file changed, 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index b143eced..67f4d5da 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -333,7 +333,6 @@ def main(): out_rasterdataset=local_overview, ) - os.environ['AWS_PROFILE'] = 'hyp3' logging.info(f'Moving CRF to {s3_overview}') subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) From ef8851cfdca044dd66db30ab64dfaf3cd3b5675a Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 15 Nov 2023 16:46:42 -0900 Subject: [PATCH 144/193] add in boto3 --- image_services/opera/make_opera_services.py | 1 + 1 file changed, 1 insertion(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 67f4d5da..240cc340 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -11,6 +11,7 @@ import arcpy from arcgis.gis.server import Server +import boto3 from lxml import etree from osgeo import gdal, osr from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed From 1af729f76c4973646e6a2f5dbd6ab0f6bfcf20dd Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 15 Nov 2023 17:27:42 -0900 Subject: [PATCH 145/193] get rid of asf_search dependency --- image_server/environment.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/image_server/environment.yml b/image_server/environment.yml index 7ac8a6d3..596817bc 100644 --- a/image_server/environment.yml +++ b/image_server/environment.yml @@ -5,7 +5,6 @@ channels: dependencies: - python=3.7 - arcgis-server-py3=10.9.1 - - asf_search>=6.7.0 - boto3 - gdal>=2.4.4,<3 - lxml From b7744d768cc3fbab3f13072725e760c018002943 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 15 Nov 2023 22:17:45 -0900 Subject: [PATCH 146/193] get rid of the environment setting --- image_services/opera/make_opera_services.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 240cc340..6ea1697a 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -11,7 +11,6 @@ import arcpy from arcgis.gis.server import Server -import boto3 from lxml import etree from osgeo import gdal, osr from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed @@ -200,9 +199,6 @@ def main(): gdal.SetConfigOption('AWS_DEFAULT_REGION', 'us-west-2') os.environ['AWS_DEFAULT_REGION'] = 'us-west-2' - gdal.SetConfigOption('AWS_PROFILE', 'edc-prod') - os.environ['AWS_PROFILE'] = 'edc-prod' - csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' From 165258388dc7a16db3dd0bd4db789227ad626e69 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 16 Nov 2023 15:17:44 -0900 Subject: [PATCH 147/193] add in edc set up --- image_services/opera/make_opera_services.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 6ea1697a..d1e5d43c 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -199,6 +199,8 @@ def main(): gdal.SetConfigOption('AWS_DEFAULT_REGION', 'us-west-2') os.environ['AWS_DEFAULT_REGION'] = 'us-west-2' + os.environ['AWS_PROFILE'] = 'edc-prod' + csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' @@ -330,6 +332,7 @@ def main(): out_rasterdataset=local_overview, ) + os.environ['AWS_PROFILE'] = 'hyp3' logging.info(f'Moving CRF to {s3_overview}') subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) From d32cbd11a7db6c97e9508f4bfd2df107515830e3 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 16 Nov 2023 15:37:33 -0900 Subject: [PATCH 148/193] remove old cookie files --- image_services/opera/make_opera_services.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index d1e5d43c..33ad7b15 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -192,13 +192,6 @@ def main(): with open(args.config_file) as f: config = json.load(f) - cookie_file = Path.home() / 'cookies.txt' - os.environ['GDAL_HTTP_COOKIEFILE'] = str(cookie_file) - os.environ['GDAL_HTTP_COOKIEJAR'] = str(cookie_file) - - gdal.SetConfigOption('AWS_DEFAULT_REGION', 'us-west-2') - os.environ['AWS_DEFAULT_REGION'] = 'us-west-2' - os.environ['AWS_PROFILE'] = 'edc-prod' csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') From 4cebdaa9184cad74b64d6abfc92262059b9b9af5 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 16 Nov 2023 16:22:24 -0900 Subject: [PATCH 149/193] add back in gdal exceptions --- image_services/opera/make_opera_services.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 33ad7b15..428e07a9 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -15,6 +15,8 @@ from osgeo import gdal, osr from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed +gdal.UseExceptions() +gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'EMPTY_DIR') def get_rasters(): url_file = f'{os.getcwd()}/vsis3_urls.txt' From 69e5fa41c8664a2296d47b3f3086074a3c8e0f30 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 16 Nov 2023 16:36:16 -0900 Subject: [PATCH 150/193] AWS profile update --- image_services/opera/make_opera_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 428e07a9..ab682ae9 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -194,7 +194,7 @@ def main(): with open(args.config_file) as f: config = json.load(f) - os.environ['AWS_PROFILE'] = 'edc-prod' + os.environ['AWS_DEFAULT_PROFILE'] = 'edc-prod' csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') @@ -327,7 +327,7 @@ def main(): out_rasterdataset=local_overview, ) - os.environ['AWS_PROFILE'] = 'hyp3' + os.environ['AWS_DEFAULT_PROFILE'] = 'hyp3' logging.info(f'Moving CRF to {s3_overview}') subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) From eb54a0a09697d0cc1cfe1058dd99034b3b0e0fb0 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 16 Nov 2023 16:51:39 -0900 Subject: [PATCH 151/193] add in another profile statement --- image_services/opera/make_opera_services.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index ab682ae9..610065e8 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -195,6 +195,7 @@ def main(): config = json.load(f) os.environ['AWS_DEFAULT_PROFILE'] = 'edc-prod' + os.environ['AWS_PROFILE'] = 'edc-prod' csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') @@ -328,6 +329,7 @@ def main(): ) os.environ['AWS_DEFAULT_PROFILE'] = 'hyp3' + os.environ['AWS_PROFILE'] = 'hyp3' logging.info(f'Moving CRF to {s3_overview}') subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) From cacf13992393bcf64b63c6ff1422d52f5b8171d0 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 17 Nov 2023 10:17:00 -0900 Subject: [PATCH 152/193] swap permissions --- image_services/opera/make_opera_services.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 610065e8..356b43a9 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -194,9 +194,6 @@ def main(): with open(args.config_file) as f: config = json.load(f) - os.environ['AWS_DEFAULT_PROFILE'] = 'edc-prod' - os.environ['AWS_PROFILE'] = 'edc-prod' - csv_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}.csv') raster_function_template = ''.join([f'{template_directory / template};' @@ -328,8 +325,9 @@ def main(): out_rasterdataset=local_overview, ) - os.environ['AWS_DEFAULT_PROFILE'] = 'hyp3' - os.environ['AWS_PROFILE'] = 'hyp3' + del os.environ['AWS_ACCESS_KEY_ID'] + del os.environ['AWS_SECRET_ACCESS_KEY'] + logging.info(f'Moving CRF to {s3_overview}') subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) From c8a61eecaef39b2fcbb3df2ddd86cd900db1d126 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 17 Nov 2023 10:25:31 -0900 Subject: [PATCH 153/193] add back in hyp3 permissions??? --- image_services/opera/make_opera_services.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 356b43a9..935e640a 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -328,6 +328,9 @@ def main(): del os.environ['AWS_ACCESS_KEY_ID'] del os.environ['AWS_SECRET_ACCESS_KEY'] + os.environ['AWS_DEFAULT_PROFILE'] = 'hyp3' + os.environ['AWS_PROFILE'] = 'hyp3' + logging.info(f'Moving CRF to {s3_overview}') subprocess.run(['aws', 's3', 'cp', local_overview, s3_overview.replace('/vsis3/', 's3://'), '--recursive']) From 7afd87c478d9a7a402952a2c03c833106c25072a Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 17 Nov 2023 11:50:14 -0900 Subject: [PATCH 154/193] update the max um per mosaic --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 935e640a..db283711 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -281,7 +281,7 @@ def main(): blend_width=10, view_point_x=300, view_point_y=300, - max_num_per_mosaic=50, + max_num_per_mosaic=75, cell_size_tolerance=1.8, cell_size=3, metadata_level='BASIC', From 9471169f198388f4aef1d99722b3a30647c6ad6e Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 17 Nov 2023 12:58:04 -0900 Subject: [PATCH 155/193] update the max um per mosaic --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index db283711..935e640a 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -281,7 +281,7 @@ def main(): blend_width=10, view_point_x=300, view_point_y=300, - max_num_per_mosaic=75, + max_num_per_mosaic=50, cell_size_tolerance=1.8, cell_size=3, metadata_level='BASIC', From 983d3d3fce793a4d044c97ffdc281c3e8ce2fe29 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 21 Nov 2023 13:27:59 -0900 Subject: [PATCH 156/193] add in vv json file --- image_services/opera/config/rtc_vv_urls.json | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 image_services/opera/config/rtc_vv_urls.json diff --git a/image_services/opera/config/rtc_vv_urls.json b/image_services/opera/config/rtc_vv_urls.json new file mode 100644 index 00000000..10c862ac --- /dev/null +++ b/image_services/opera/config/rtc_vv_urls.json @@ -0,0 +1,40 @@ +{ + "project_name": "OPERA", + "raster_store": "/home/arcgis/raster_store/", + "bucket": "asf-cumulus-prod-opera-products", + "overview_path": "/vsis3/gis-service-overviews/overviews/", + "s3_suffix": "_VV.tif", + "dataset_name": "RTC_VV", + "raster_function_templates": [ + "Sentinel1_RTC_Power.rft.xml", + "Sentinel1_RTC_Amplitude.rft.xml", + "Sentinel1_RTC_dB.rft.xml", + "Sentinel1_RTC_dB_Stretch.rft.xml" + ], + "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", + "service_folder": "OPERA", + "service_name": "OPERA_RTC_VV_URLS", + "service_definition_overrides": { + "Type": "esriServiceDefinitionType_Replacement", + "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='usageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='waitTimeout']/Value": "120", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='IdleTimeout']/Value": "3600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='keepAliveInterval']/Value": "600", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MinInstances']/Value": "1", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='MaxInstances']/Value": "9", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='UsageTimeout']/Value": "1200", + "Configurations/SVCConfiguration/Definition/Props/PropertyArray/PropertySetProperty[Key='WaitTimeout']/Value": "120", + "ItemInfo/Title": "OPERA RTC VV", + "ItemInfo/Credits": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA.", + "ItemInfo/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", + "ItemInfo/Snippet": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_VV_WMS", + "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='abstract']/Value": "WMS service for Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL)." + } +} \ No newline at end of file From baacff921e9f6f3805ce4183ae85360e30872add Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 21 Nov 2023 14:23:55 -0900 Subject: [PATCH 157/193] add in shell and python scripts to run automatically to update s3 bucket --- image_services/opera/update_opera_uris.py | 77 +++++++++++++++++++++++ image_services/opera/update_opera_uris.sh | 12 ++++ 2 files changed, 89 insertions(+) create mode 100644 image_services/opera/update_opera_uris.py create mode 100755 image_services/opera/update_opera_uris.sh diff --git a/image_services/opera/update_opera_uris.py b/image_services/opera/update_opera_uris.py new file mode 100644 index 00000000..c0c3f96e --- /dev/null +++ b/image_services/opera/update_opera_uris.py @@ -0,0 +1,77 @@ +import argparse +import csv +import os +import requests +import boto3 +from pathlib import Path +import logging +import json + + +S3_CLIENT = boto3.client('s3') +log = logging.getLogger(__name__) + + +def query_cmr(params): + session = requests.Session() + search_url = 'https://cmr.earthdata.nasa.gov/search/granules.umm_json' + headers = {} + vsis3_uris = [] + while True: + response = session.get(search_url, params=params, headers=headers) + response.raise_for_status() + for granule in response.json()['items']: + for url in granule['umm']['RelatedUrls']: + if url['URL'].startswith('s3://') and url['URL'].endswith('VV.tif'): + vsis3_uris.append(url['URL'].replace('s3://', '/vsis3/')) + break + if 'CMR-Search-After' not in response.headers: + break + headers['CMR-Search-After'] = response.headers['CMR-Search-After'] + return vsis3_uris + + +def upload_file_to_s3(path_to_file: Path, bucket: str, prefix: str = ''): + path_to_file = Path(path_to_file) + key = str(Path(prefix) / path_to_file.name) + + log.info(f'Uploading s3://{bucket}/{key}') + S3_CLIENT.upload_file(str(path_to_file), bucket, key) + + +def main(): + logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s') + + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument('--working-directory', default=os.getcwd()) + parser.add_argument('config_file') + args = parser.parse_args() + + os.environ['AWS_PROFILE'] = 'hyp3' + + with open(args.config_file) as f: + config = json.load(f) + + polarization = config['s3_suffix'][1:3] + _, _, bucket, _, _ = config['overview_path'].split('/') + csv_file = Path(f'{os.getcwd()}/opera_vsis3_{polarization}.csv') + + params = { + 'short_name': 'OPERA_L2_RTC-S1_V1', + 'attribute[]': f'string,POLARIZATION,{polarization}', + 'page_size': 2000, + } + + log.info(f'Querying CMR for OPERA {polarization} products') + vsis3_uris = query_cmr(params) + + with open(csv_file, 'w', newline='') as f: + writer = csv.writer(f) + for uri in vsis3_uris: + writer.writerow([uri]) + + upload_file_to_s3(csv_file, bucket, 'opera-uris') + + +if __name__ == '__main__': + main() diff --git a/image_services/opera/update_opera_uris.sh b/image_services/opera/update_opera_uris.sh new file mode 100755 index 00000000..972e79d6 --- /dev/null +++ b/image_services/opera/update_opera_uris.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# wrapper script to run update_opera_uris.py via a cron schedule +# some arcpy commands require the python session to be tied to a terminal, so the crontab should look like: +# 0 8 * * * script -qef -c "/home/arcgis/gis-services/image_services/rtc_services/make_rtc_service.sh /home/arcgis/gis-services/image_services/rtc_services/nasa_disasters /home/arcgis/gis-services/image_services/rtc_services/nasa_disasters/rgb.json" -a /home/arcgis/gis-services/image_services/rtc_services/nasa_disasters/make_rgb_service.log + +set -e +source /home/arcgis/mambaforge/etc/profile.d/conda.sh +conda activate url-query +python /home/arcgis/gis-services/image_services/opera/update_opera_uris.py \ + --working-directory $1 \ + $2 \ No newline at end of file From 2b5cdd8bbb862245f209e07df7f8eb12b7eeac04 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 21 Nov 2023 14:38:28 -0900 Subject: [PATCH 158/193] pull opera uri file from s3 --- image_services/opera/make_opera_services.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 935e640a..89455504 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -11,6 +11,7 @@ import arcpy from arcgis.gis.server import Server +import boto3 from lxml import etree from osgeo import gdal, osr from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed @@ -18,8 +19,15 @@ gdal.UseExceptions() gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'EMPTY_DIR') -def get_rasters(): - url_file = f'{os.getcwd()}/vsis3_urls.txt' + +def get_rasters(overview_path, s3_suffix, working_directory): + _, _, bucket, _, _ = overview_path.split('/') + polarization = s3_suffix[1:3] + filename = f'{working_directory}/opera_vsis3_{polarization}.csv' + + s3 = boto3.client('s3') + url_file = s3.download_file(bucket, f'opera_uris/opera_vsis3_{polarization}.csv', filename) + with open(url_file, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] return [f'{record}' for record in records] @@ -206,7 +214,7 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' try: - rasters = get_rasters() + rasters = get_rasters(config['overview_path'], config['s3_suffix'], args.working_directory) update_csv(csv_file, rasters, config['bucket']) for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, From 6726ee7e2acfa2e4a011961c64ab12e600da78d7 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 21 Nov 2023 14:46:44 -0900 Subject: [PATCH 159/193] try new pull --- image_services/opera/make_opera_services.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 89455504..a2484c92 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -24,9 +24,11 @@ def get_rasters(overview_path, s3_suffix, working_directory): _, _, bucket, _, _ = overview_path.split('/') polarization = s3_suffix[1:3] filename = f'{working_directory}/opera_vsis3_{polarization}.csv' + key = f'opera_uris/opera_vsis3_{polarization}.csv' s3 = boto3.client('s3') - url_file = s3.download_file(bucket, f'opera_uris/opera_vsis3_{polarization}.csv', filename) + logging.info(f'Downloading {bucket}/{key} to {filename}') + url_file = s3.download_file(bucket, key, filename) with open(url_file, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] From b5c92f4778355d9580619127a7f0b4cd974d4bd5 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 21 Nov 2023 14:55:10 -0900 Subject: [PATCH 160/193] optimize imports --- image_services/opera/make_opera_services.py | 2 +- image_services/opera/update_opera_uris.py | 26 ++++++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index a2484c92..51916cf4 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -10,8 +10,8 @@ from typing import List import arcpy -from arcgis.gis.server import Server import boto3 +from arcgis.gis.server import Server from lxml import etree from osgeo import gdal, osr from tenacity import Retrying, before_sleep_log, stop_after_attempt, wait_fixed diff --git a/image_services/opera/update_opera_uris.py b/image_services/opera/update_opera_uris.py index c0c3f96e..bf9e6d67 100644 --- a/image_services/opera/update_opera_uris.py +++ b/image_services/opera/update_opera_uris.py @@ -1,20 +1,26 @@ import argparse import csv +import json +import logging import os -import requests -import boto3 from pathlib import Path -import logging -import json +import boto3 +import requests S3_CLIENT = boto3.client('s3') log = logging.getLogger(__name__) -def query_cmr(params): +def query_cmr(polarization): session = requests.Session() search_url = 'https://cmr.earthdata.nasa.gov/search/granules.umm_json' + + params = { + 'short_name': 'OPERA_L2_RTC-S1_V1', + 'attribute[]': f'string,POLARIZATION,{polarization}', + 'page_size': 2000, + } headers = {} vsis3_uris = [] while True: @@ -22,7 +28,7 @@ def query_cmr(params): response.raise_for_status() for granule in response.json()['items']: for url in granule['umm']['RelatedUrls']: - if url['URL'].startswith('s3://') and url['URL'].endswith('VV.tif'): + if url['URL'].startswith('s3://') and url['URL'].endswith(f'{polarization}.tif'): vsis3_uris.append(url['URL'].replace('s3://', '/vsis3/')) break if 'CMR-Search-After' not in response.headers: @@ -56,14 +62,8 @@ def main(): _, _, bucket, _, _ = config['overview_path'].split('/') csv_file = Path(f'{os.getcwd()}/opera_vsis3_{polarization}.csv') - params = { - 'short_name': 'OPERA_L2_RTC-S1_V1', - 'attribute[]': f'string,POLARIZATION,{polarization}', - 'page_size': 2000, - } - log.info(f'Querying CMR for OPERA {polarization} products') - vsis3_uris = query_cmr(params) + vsis3_uris = query_cmr(polarization) with open(csv_file, 'w', newline='') as f: writer = csv.writer(f) From 0bb73167dd8eaedd970b42cfbcb60e9ef34af87f Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:12:29 -0900 Subject: [PATCH 161/193] Update image_services/opera/make_opera_services.py Co-authored-by: Andrew Johnston --- image_services/opera/make_opera_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 51916cf4..b7bf5a0e 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -28,9 +28,9 @@ def get_rasters(overview_path, s3_suffix, working_directory): s3 = boto3.client('s3') logging.info(f'Downloading {bucket}/{key} to {filename}') - url_file = s3.download_file(bucket, key, filename) + s3.download_file(bucket, key, filename) - with open(url_file, newline='') as urlfile: + with open(filename, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] return [f'{record}' for record in records] From f09f386011c8493018bfafab0cdfec4098159773 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 1 Dec 2023 16:36:45 -0900 Subject: [PATCH 162/193] add metadata file for populating the MD for the test CA VV dataset --- .../OPERA_RTC_CA_VV_metadata.txt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt new file mode 100644 index 00000000..866ceb62 --- /dev/null +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt @@ -0,0 +1,25 @@ +Title: + OPERA L2 RTC-S1 Test CA VV + +Tags: +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC + +Summary: +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 15-Oct-2023 to 15-Nov-2023 in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) + +Description: +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VV polarization generated from Sentinel-1 SAR imagery, processed by the OPERA project, managed by JPL. Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. + +OPERA RTC-S1 data is available over most landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 15 and November 15, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. + +The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: https://asf.alaska.edu/datasets/daac/opera/ + +OPERA includes partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, and Southern Methodist University. Refer to OPERA’s website for more details. + +Data Use: Please cite the use of this data set using the following: +OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] + +Acknowledgements: This service is provided by Earthdata GIS (EGIS) supported by Earth Observing System Data and Information System (EOSDIS) + +Credits: +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1, processed by JPL. Contains modified Copernicus Sentinel data, processed by ESA. From 5dacc2eb04d87d50a6224b7e528f708556488e95 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 1 Dec 2023 16:41:12 -0900 Subject: [PATCH 163/193] add metadata file for populating the MD for the test CA VH dataset --- .../OPERA_RTC_CA_VH_metadata.txt | 25 +++++++++++++++++++ .../metadata_text/OPERA_RTC_VH_metadata.txt | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt new file mode 100644 index 00000000..8c1cbd51 --- /dev/null +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt @@ -0,0 +1,25 @@ +Title: + OPERA L2 RTC-S1 Test CA VH + +Tags: +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC + +Summary: +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 15-Oct-2023 to 15-Nov-2023 in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) + +Description: +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH polarization generated from Sentinel-1 SAR imagery, processed by the OPERA project, managed by JPL. Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. + +OPERA RTC-S1 data is available over most landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 15 and November 15, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. + +The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: https://asf.alaska.edu/datasets/daac/opera/ + +OPERA includes partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, and Southern Methodist University. Refer to OPERA’s website for more details. + +Data Use: Please cite the use of this data set using the following: +OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] + +Acknowledgements: This service is provided by Earthdata GIS (EGIS) supported by Earth Observing System Data and Information System (EOSDIS) + +Credits: +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1, processed by JPL. Contains modified Copernicus Sentinel data, processed by ESA. diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt index 9c2040a5..7dce6aec 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt @@ -8,7 +8,7 @@ Summary: OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) Description: -OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. +OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. Credits: OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file From eb697b042719c3801339d2dc61ccb10388dfd83f Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Fri, 1 Dec 2023 16:53:57 -0900 Subject: [PATCH 164/193] change link formatting to markdown --- .../metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt | 6 +++--- .../metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt index 8c1cbd51..9360013f 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt @@ -12,14 +12,14 @@ OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH OPERA RTC-S1 data is available over most landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 15 and November 15, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. -The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: https://asf.alaska.edu/datasets/daac/opera/ +The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) -OPERA includes partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, and Southern Methodist University. Refer to OPERA’s website for more details. +OPERA includes partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, Southern Methodist University, and EarthScope. Refer to [OPERA’s website](https://www.jpl.nasa.gov/go/opera) for more details. Data Use: Please cite the use of this data set using the following: OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] -Acknowledgements: This service is provided by Earthdata GIS (EGIS) supported by Earth Observing System Data and Information System (EOSDIS) +Acknowledgements: This service is provided by [Earthdata GIS (EGIS)](https://gis.earthdata.nasa.gov) supported by [Earth Observing System Data and Information System (EOSDIS)](https://www.earthdata.nasa.gov/) Credits: OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1, processed by JPL. Contains modified Copernicus Sentinel data, processed by ESA. diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt index 866ceb62..21aee2e5 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt @@ -12,14 +12,14 @@ OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VV OPERA RTC-S1 data is available over most landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 15 and November 15, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. -The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: https://asf.alaska.edu/datasets/daac/opera/ +The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) -OPERA includes partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, and Southern Methodist University. Refer to OPERA’s website for more details. +OPERA includes partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, Southern Methodist University, and EarthScope. Refer to [OPERA’s website](https://www.jpl.nasa.gov/go/opera) for more details. Data Use: Please cite the use of this data set using the following: OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] -Acknowledgements: This service is provided by Earthdata GIS (EGIS) supported by Earth Observing System Data and Information System (EOSDIS) +Acknowledgements: This service is provided by [Earthdata GIS (EGIS)](https://gis.earthdata.nasa.gov) supported by [Earth Observing System Data and Information System (EOSDIS)](https://www.earthdata.nasa.gov/) Credits: OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1, processed by JPL. Contains modified Copernicus Sentinel data, processed by ESA. From 94e130a2bb5b0137a57793a1e21c02b1da80300a Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 4 Dec 2023 20:12:20 -0900 Subject: [PATCH 165/193] incorporate metadata edits from JPL --- .../metadata_text/OPERA_RTC_CA_VH_metadata.txt | 12 ++++++------ .../metadata_text/OPERA_RTC_CA_VV_metadata.txt | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt index 9360013f..2e724eab 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt @@ -1,16 +1,16 @@ Title: - OPERA L2 RTC-S1 Test CA VH + OPERA L2 RTC-S1 V1 CA VH Tags: ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC Summary: -OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 15-Oct-2023 to 15-Nov-2023 in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 04-Dec-2023 in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) Description: -OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH polarization generated from Sentinel-1 SAR imagery, processed by the OPERA project, managed by JPL. Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. -OPERA RTC-S1 data is available over most landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 15 and November 15, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. +OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 8 and December 4, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) @@ -19,7 +19,7 @@ OPERA includes partners from NASA’s Goddard Space Flight Center, the U.S. Geol Data Use: Please cite the use of this data set using the following: OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] -Acknowledgements: This service is provided by [Earthdata GIS (EGIS)](https://gis.earthdata.nasa.gov) supported by [Earth Observing System Data and Information System (EOSDIS)](https://www.earthdata.nasa.gov/) +Acknowledgements: This service is provided by [Earthdata GIS (EGIS)](https://gis.earthdata.nasa.gov) supported by [Earth Observing System Data and Information System (EOSDIS)](https://www.earthdata.nasa.gov/). The OPERA project is supported by the Satellite Needs Working Group. Credits: -OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1, processed by JPL. Contains modified Copernicus Sentinel data, processed by ESA. +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1, processed by the OPERA project at JPL. Contains modified Copernicus Sentinel data, processed by ESA. diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt index 21aee2e5..a3a3aecf 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt @@ -1,16 +1,16 @@ Title: - OPERA L2 RTC-S1 Test CA VV + OPERA L2 RTC-S1 V1 CA VV Tags: ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC Summary: -OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 15-Oct-2023 to 15-Nov-2023 in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 04-Dec-2023 in VV polarization generated from Sentinel-1 SAR imagery, processed by the OPERA project at JPL. Description: -OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VV polarization generated from Sentinel-1 SAR imagery, processed by the OPERA project, managed by JPL. Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VV polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. -OPERA RTC-S1 data is available over most landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 15 and November 15, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. +OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 8 and December 4, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) @@ -19,7 +19,7 @@ OPERA includes partners from NASA’s Goddard Space Flight Center, the U.S. Geol Data Use: Please cite the use of this data set using the following: OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] -Acknowledgements: This service is provided by [Earthdata GIS (EGIS)](https://gis.earthdata.nasa.gov) supported by [Earth Observing System Data and Information System (EOSDIS)](https://www.earthdata.nasa.gov/) +Acknowledgements: This service is provided by [Earthdata GIS (EGIS)](https://gis.earthdata.nasa.gov) supported by [Earth Observing System Data and Information System (EOSDIS)](https://www.earthdata.nasa.gov/). The OPERA project is supported by the Satellite Needs Working Group. Credits: -OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1, processed by JPL. Contains modified Copernicus Sentinel data, processed by ESA. +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1, processed by the OPERA project at JPL. Contains modified Copernicus Sentinel data, processed by ESA. From f66b72d79b7f384b8d20dc1dcadd9240b6c940f5 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 4 Dec 2023 21:54:45 -0900 Subject: [PATCH 166/193] remove space in title --- .../opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt | 2 +- .../opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt index 2e724eab..0b5919dc 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt @@ -1,5 +1,5 @@ Title: - OPERA L2 RTC-S1 V1 CA VH +OPERA L2 RTC-S1 V1 CA VH Tags: ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt index a3a3aecf..f611d99b 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt @@ -1,5 +1,5 @@ Title: - OPERA L2 RTC-S1 V1 CA VV +OPERA L2 RTC-S1 V1 CA VV Tags: ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC From 1c3a43796fdaca9d24e13431b560788002e983be Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 4 Dec 2023 21:56:36 -0900 Subject: [PATCH 167/193] more minor updates --- .../opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt | 2 +- .../opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt index 0b5919dc..b11bafcb 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt @@ -5,7 +5,7 @@ Tags: ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC Summary: -OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 04-Dec-2023 in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 04-Dec-2023 in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Description: OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt index f611d99b..af002d60 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt @@ -5,7 +5,7 @@ Tags: ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC Summary: -OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 04-Dec-2023 in VV polarization generated from Sentinel-1 SAR imagery, processed by the OPERA project at JPL. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 04-Dec-2023 in VV polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Description: OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VV polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. From eb71e57a2e37002fd9e8311f126245008bf909f8 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 4 Dec 2023 22:07:28 -0900 Subject: [PATCH 168/193] adjust date range --- .../opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt | 4 ++-- .../opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt index b11bafcb..bfe3b723 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt @@ -5,12 +5,12 @@ Tags: ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC Summary: -OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 04-Dec-2023 in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 03-Dec-2023 in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Description: OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. -OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 8 and December 4, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. +OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 8 and December 3, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt index af002d60..1894b056 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt @@ -5,12 +5,12 @@ Tags: ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC Summary: -OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 04-Dec-2023 in VV polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 03-Dec-2023 in VV polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Description: OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VV polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. -OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 8 and December 4, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. +OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 8 and December 3, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) From a2a07bf80495d7e46e02c053d175fb50cf322195 Mon Sep 17 00:00:00 2001 From: hjkristenson Date: Mon, 4 Dec 2023 22:08:27 -0900 Subject: [PATCH 169/193] adjust date range --- .../opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt | 4 ++-- .../opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt index bfe3b723..5de61ffb 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt @@ -5,12 +5,12 @@ Tags: ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC Summary: -OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 03-Dec-2023 in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 07-Oct-2023 to 03-Dec-2023 in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Description: OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. -OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 8 and December 3, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. +OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 7 and December 3, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt index 1894b056..4c3de25d 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt @@ -5,12 +5,12 @@ Tags: ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, Radiometric Terrain Correction, RTC Summary: -OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 08-Oct-2023 to 03-Dec-2023 in VV polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products for an area in Northern California from 07-Oct-2023 to 03-Dec-2023 in VV polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Description: OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VV polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. -OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 8 and December 3, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. +OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Sentinel-1 acquisitions starting October 4, 2023. This is a test service that only includes the data available for a region in Northern California, acquired between October 7 and December 3, 2023. We are working towards providing services that include the full global extent of the dataset, but in incremental developments. The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) From 3a9e6d6d27c626404b4b68a5a23fab280b256e30 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 11 Dec 2023 15:06:50 -0900 Subject: [PATCH 170/193] remove s3 bucket raster file pull --- image_services/opera/make_opera_services.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index b7bf5a0e..bc70c77a 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -20,16 +20,8 @@ gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'EMPTY_DIR') -def get_rasters(overview_path, s3_suffix, working_directory): - _, _, bucket, _, _ = overview_path.split('/') - polarization = s3_suffix[1:3] - filename = f'{working_directory}/opera_vsis3_{polarization}.csv' - key = f'opera_uris/opera_vsis3_{polarization}.csv' - - s3 = boto3.client('s3') - logging.info(f'Downloading {bucket}/{key} to {filename}') - s3.download_file(bucket, key, filename) - +def get_rasters(s3_suffix, working_directory): + filename = f'{working_directory}/opera_vsis3_{s3_suffix[1:3]}.csv' with open(filename, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] return [f'{record}' for record in records] From 3a52f3ebcc9b4a69c5f7e66e980929f1a89ac8f6 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 11 Dec 2023 15:20:18 -0900 Subject: [PATCH 171/193] change around naming convention --- image_services/opera/make_opera_services.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index bc70c77a..11b4866c 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -20,8 +20,8 @@ gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'EMPTY_DIR') -def get_rasters(s3_suffix, working_directory): - filename = f'{working_directory}/opera_vsis3_{s3_suffix[1:3]}.csv' +def get_rasters(dataset_name, working_directory): + filename = f'{working_directory}/{dataset_name}_vsis3_urls.csv' with open(filename, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] return [f'{record}' for record in records] @@ -208,7 +208,7 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' try: - rasters = get_rasters(config['overview_path'], config['s3_suffix'], args.working_directory) + rasters = get_rasters(csv_file.replace(".csv", ""), args.working_directory) update_csv(csv_file, rasters, config['bucket']) for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, From 4704a4a855155d24d4a2bdb488db2a05a1eba918 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 11 Dec 2023 15:22:49 -0900 Subject: [PATCH 172/193] udpate path and remove boto3 import --- image_services/opera/make_opera_services.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 11b4866c..62578825 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -10,7 +10,6 @@ from typing import List import arcpy -import boto3 from arcgis.gis.server import Server from lxml import etree from osgeo import gdal, osr @@ -21,7 +20,7 @@ def get_rasters(dataset_name, working_directory): - filename = f'{working_directory}/{dataset_name}_vsis3_urls.csv' + filename = f'{dataset_name}_vsis3_urls.csv' with open(filename, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] return [f'{record}' for record in records] From 775b357a6a68591e13a2130a8871b5847e96e2b8 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 11 Dec 2023 16:37:07 -0900 Subject: [PATCH 173/193] remove unneccary dataset varaible --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 62578825..c54fda76 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -19,7 +19,7 @@ gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'EMPTY_DIR') -def get_rasters(dataset_name, working_directory): +def get_rasters(dataset_name): filename = f'{dataset_name}_vsis3_urls.csv' with open(filename, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] From 1492adeb47f8c94bc8df1cf9cf69f68d6c52a9c9 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 12 Dec 2023 10:27:14 -0900 Subject: [PATCH 174/193] iron ut naming between makeoperaservices and update_opera_urls --- image_services/opera/make_opera_services.py | 4 ++-- image_services/opera/update_opera_uris.py | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index c54fda76..048861b7 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -23,7 +23,7 @@ def get_rasters(dataset_name): filename = f'{dataset_name}_vsis3_urls.csv' with open(filename, newline='') as urlfile: records = urlfile.read().split('\n')[:-1] - return [f'{record}' for record in records] + return [f'{record[:-1]}' for record in records] def get_pixel_type(data_type: str) -> int: @@ -207,7 +207,7 @@ def main(): arcpy.env.parallelProcessingFactor = '75%' try: - rasters = get_rasters(csv_file.replace(".csv", ""), args.working_directory) + rasters = get_rasters(csv_file.replace(".csv", "")) update_csv(csv_file, rasters, config['bucket']) for attempt in Retrying(stop=stop_after_attempt(3), wait=wait_fixed(60), reraise=True, diff --git a/image_services/opera/update_opera_uris.py b/image_services/opera/update_opera_uris.py index bf9e6d67..99b16a56 100644 --- a/image_services/opera/update_opera_uris.py +++ b/image_services/opera/update_opera_uris.py @@ -60,17 +60,16 @@ def main(): polarization = config['s3_suffix'][1:3] _, _, bucket, _, _ = config['overview_path'].split('/') - csv_file = Path(f'{os.getcwd()}/opera_vsis3_{polarization}.csv') - + url_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}_vsis3_urls.csv') log.info(f'Querying CMR for OPERA {polarization} products') - vsis3_uris = query_cmr(polarization) + vsis3_urls = query_cmr(polarization) - with open(csv_file, 'w', newline='') as f: + with open(url_file, 'w', newline='') as f: writer = csv.writer(f) - for uri in vsis3_uris: - writer.writerow([uri]) + for url in vsis3_urls: + writer.writerow([url]) - upload_file_to_s3(csv_file, bucket, 'opera-uris') + upload_file_to_s3(url_file, bucket, 'opera-uris') if __name__ == '__main__': From 6730c646e7fbb31802225f7692564dd1cec3107a Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 13 Dec 2023 10:59:27 -0900 Subject: [PATCH 175/193] add union for s3 bucket upload --- image_services/opera/update_opera_uris.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/image_services/opera/update_opera_uris.py b/image_services/opera/update_opera_uris.py index 99b16a56..60e1dcdc 100644 --- a/image_services/opera/update_opera_uris.py +++ b/image_services/opera/update_opera_uris.py @@ -4,6 +4,7 @@ import logging import os from pathlib import Path +from typing import Union import boto3 import requests @@ -37,7 +38,7 @@ def query_cmr(polarization): return vsis3_uris -def upload_file_to_s3(path_to_file: Path, bucket: str, prefix: str = ''): +def upload_file_to_s3(path_to_file: Union[Path, str], bucket: str, prefix: str = ''): path_to_file = Path(path_to_file) key = str(Path(prefix) / path_to_file.name) From 013405fbd533afd57db1e9b6a5e03848ebbb8331 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 13 Dec 2023 11:00:24 -0900 Subject: [PATCH 176/193] switch dataset name and service name --- image_services/opera/config/rtc_vh_urls.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image_services/opera/config/rtc_vh_urls.json b/image_services/opera/config/rtc_vh_urls.json index ce14c29d..8a9e26f5 100644 --- a/image_services/opera/config/rtc_vh_urls.json +++ b/image_services/opera/config/rtc_vh_urls.json @@ -5,7 +5,7 @@ "overview_path": "/vsis3/gis-service-overviews/overviews/", "s3_prefix": "opera-rtc-image-service-na/VH", "s3_suffix": "_VH.tif", - "dataset_name": "RTC_VH_URLS", + "dataset_name": "RTC_VH", "raster_function_templates": [ "Sentinel1_RTC_Power.rft.xml", "Sentinel1_RTC_Amplitude.rft.xml", @@ -14,7 +14,7 @@ ], "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", "service_folder": "OPERA", - "service_name": "OPERA_RTC_VH", + "service_name": "OPERA_RTC_VH_URLS", "service_definition_overrides": { "Type": "esriServiceDefinitionType_Replacement", "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", From 71a29c267a3e86ea3d379931a6c48073f08415a2 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 13 Dec 2023 11:02:07 -0900 Subject: [PATCH 177/193] rename uri to urls to be consistent --- .../opera/{update_opera_uris.py => update_opera_urls.py} | 0 .../opera/{update_opera_uris.sh => update_opera_urls.sh} | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename image_services/opera/{update_opera_uris.py => update_opera_urls.py} (100%) rename image_services/opera/{update_opera_uris.sh => update_opera_urls.sh} (89%) diff --git a/image_services/opera/update_opera_uris.py b/image_services/opera/update_opera_urls.py similarity index 100% rename from image_services/opera/update_opera_uris.py rename to image_services/opera/update_opera_urls.py diff --git a/image_services/opera/update_opera_uris.sh b/image_services/opera/update_opera_urls.sh similarity index 89% rename from image_services/opera/update_opera_uris.sh rename to image_services/opera/update_opera_urls.sh index 972e79d6..71db6be9 100755 --- a/image_services/opera/update_opera_uris.sh +++ b/image_services/opera/update_opera_urls.sh @@ -1,12 +1,12 @@ #!/bin/bash -# wrapper script to run update_opera_uris.py via a cron schedule +# wrapper script to run update_opera_urls.py via a cron schedule # some arcpy commands require the python session to be tied to a terminal, so the crontab should look like: # 0 8 * * * script -qef -c "/home/arcgis/gis-services/image_services/rtc_services/make_rtc_service.sh /home/arcgis/gis-services/image_services/rtc_services/nasa_disasters /home/arcgis/gis-services/image_services/rtc_services/nasa_disasters/rgb.json" -a /home/arcgis/gis-services/image_services/rtc_services/nasa_disasters/make_rgb_service.log set -e source /home/arcgis/mambaforge/etc/profile.d/conda.sh conda activate url-query -python /home/arcgis/gis-services/image_services/opera/update_opera_uris.py \ +python /home/arcgis/gis-services/image_services/opera/update_opera_urls.py \ --working-directory $1 \ $2 \ No newline at end of file From 458cd5e50b7d9c517e18ca893c65ee28d51543f5 Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Wed, 13 Dec 2023 15:33:26 -0900 Subject: [PATCH 178/193] Update image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt Co-authored-by: Heidi Kristenson <61886203+hjkristenson@users.noreply.github.com> --- .../opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt index 7dce6aec..49dd07f1 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt @@ -11,4 +11,4 @@ Description: OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. Credits: -OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file From 7d04962381931858c8bfa527ed587ecc32e4876f Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Wed, 13 Dec 2023 15:34:31 -0900 Subject: [PATCH 179/193] Delete image_services/opera/vsis3_urls.txt --- image_services/opera/vsis3_urls.txt | 125 ---------------------------- 1 file changed, 125 deletions(-) delete mode 100644 image_services/opera/vsis3_urls.txt diff --git a/image_services/opera/vsis3_urls.txt b/image_services/opera/vsis3_urls.txt deleted file mode 100644 index 87347981..00000000 --- a/image_services/opera/vsis3_urls.txt +++ /dev/null @@ -1,125 +0,0 @@ -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163475-IW3_20231104T231603Z_20231106T060117Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163475-IW3_20231104T231603Z_20231106T060117Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163474-IW3_20231104T231600Z_20231106T060117Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163474-IW3_20231104T231600Z_20231106T060117Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163473-IW3_20231104T231557Z_20231106T060117Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163473-IW3_20231104T231557Z_20231106T060117Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163472-IW3_20231104T231554Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163472-IW3_20231104T231554Z_20231106T061048Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163471-IW3_20231104T231552Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163471-IW3_20231104T231552Z_20231106T061048Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163470-IW3_20231104T231549Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163470-IW3_20231104T231549Z_20231106T061048Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163469-IW3_20231104T231546Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163469-IW3_20231104T231546Z_20231106T061048Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163468-IW3_20231104T231543Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163468-IW3_20231104T231543Z_20231106T061048Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163467-IW3_20231104T231541Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163467-IW3_20231104T231541Z_20231106T061048Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163466-IW3_20231104T231538Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163466-IW3_20231104T231538Z_20231106T061048Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163465-IW3_20231104T231535Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163465-IW3_20231104T231535Z_20231106T061048Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163464-IW3_20231104T231532Z_20231106T061048Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163464-IW3_20231104T231532Z_20231106T061048Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163463-IW3_20231104T231530Z_20231106T061123Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163463-IW3_20231104T231530Z_20231106T061123Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163462-IW3_20231104T231527Z_20231106T061123Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163462-IW3_20231104T231527Z_20231106T061123Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163462-IW2_20231104T231526Z_20231106T061123Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163462-IW2_20231104T231526Z_20231106T061123Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T077-163461-IW3_20231104T231524Z_20231106T061123Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T077-163461-IW3_20231104T231524Z_20231106T061123Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068969-IW1_20231101T225127Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068969-IW1_20231101T225127Z_20231104T145817Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068968-IW1_20231101T225124Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068968-IW1_20231101T225124Z_20231104T145817Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068967-IW1_20231101T225122Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068967-IW1_20231101T225122Z_20231104T145817Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068966-IW1_20231101T225119Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068966-IW1_20231101T225119Z_20231104T145817Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068965-IW1_20231101T225116Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068965-IW1_20231101T225116Z_20231104T145817Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068964-IW1_20231101T225113Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068964-IW1_20231101T225113Z_20231104T145817Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068963-IW1_20231101T225110Z_20231104T145817Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068963-IW1_20231101T225110Z_20231104T145817Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068962-IW1_20231101T225108Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068962-IW1_20231101T225108Z_20231104T145718Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068961-IW1_20231101T225105Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068961-IW1_20231101T225105Z_20231104T145718Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068960-IW1_20231101T225102Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068960-IW1_20231101T225102Z_20231104T145718Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068959-IW1_20231101T225059Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068959-IW1_20231101T225059Z_20231104T145718Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068958-IW1_20231101T225057Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068958-IW1_20231101T225057Z_20231104T145718Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068957-IW1_20231101T225054Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068957-IW1_20231101T225054Z_20231104T145718Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T033-068956-IW1_20231101T225051Z_20231104T145718Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T033-068956-IW1_20231101T225051Z_20231104T145718Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006679-IW1_20231030T230755Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006679-IW1_20231030T230755Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006678-IW2_20231030T230753Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006678-IW2_20231030T230753Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006678-IW1_20231030T230752Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006678-IW1_20231030T230752Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006677-IW3_20231030T230751Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006677-IW3_20231030T230751Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006677-IW2_20231030T230750Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006677-IW2_20231030T230750Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006677-IW1_20231030T230749Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006677-IW1_20231030T230749Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006676-IW3_20231030T230748Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006676-IW3_20231030T230748Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006676-IW2_20231030T230747Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006676-IW2_20231030T230747Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006676-IW1_20231030T230746Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006676-IW1_20231030T230746Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006675-IW3_20231030T230745Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006675-IW3_20231030T230745Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006675-IW2_20231030T230745Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006675-IW2_20231030T230745Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006675-IW1_20231030T230744Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006675-IW1_20231030T230744Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006674-IW3_20231030T230743Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006674-IW3_20231030T230743Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006674-IW2_20231030T230742Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006674-IW2_20231030T230742Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006674-IW1_20231030T230741Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006674-IW1_20231030T230741Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006673-IW3_20231030T230740Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006673-IW3_20231030T230740Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006673-IW2_20231030T230739Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006673-IW2_20231030T230739Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006673-IW1_20231030T230738Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006673-IW1_20231030T230738Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006672-IW3_20231030T230737Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006672-IW3_20231030T230737Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006672-IW2_20231030T230736Z_20231103T082045Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006672-IW2_20231030T230736Z_20231103T082045Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006672-IW1_20231030T230735Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006672-IW1_20231030T230735Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006671-IW3_20231030T230734Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006671-IW3_20231030T230734Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006671-IW2_20231030T230733Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006671-IW2_20231030T230733Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006671-IW1_20231030T230733Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006671-IW1_20231030T230733Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006670-IW3_20231030T230732Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006670-IW3_20231030T230732Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006670-IW2_20231030T230731Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006670-IW2_20231030T230731Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006670-IW1_20231030T230730Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006670-IW1_20231030T230730Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006669-IW3_20231030T230729Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006669-IW3_20231030T230729Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006669-IW2_20231030T230728Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006669-IW2_20231030T230728Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006669-IW1_20231030T230727Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006669-IW1_20231030T230727Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006668-IW3_20231030T230726Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006668-IW3_20231030T230726Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006668-IW2_20231030T230725Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006668-IW2_20231030T230725Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006668-IW1_20231030T230724Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006668-IW1_20231030T230724Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006667-IW3_20231030T230723Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006667-IW3_20231030T230723Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006667-IW2_20231030T230722Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006667-IW2_20231030T230722Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006667-IW1_20231030T230722Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006667-IW1_20231030T230722Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006666-IW3_20231030T230721Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006666-IW3_20231030T230721Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006666-IW2_20231030T230720Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006666-IW2_20231030T230720Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006666-IW1_20231030T230719Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006666-IW1_20231030T230719Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006665-IW3_20231030T230718Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006665-IW3_20231030T230718Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006665-IW2_20231030T230717Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006665-IW2_20231030T230717Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006665-IW1_20231030T230716Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006665-IW1_20231030T230716Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006664-IW3_20231030T230715Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006664-IW3_20231030T230715Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006664-IW2_20231030T230714Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006664-IW2_20231030T230714Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006664-IW1_20231030T230713Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006664-IW1_20231030T230713Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006663-IW3_20231030T230712Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006663-IW3_20231030T230712Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006663-IW2_20231030T230711Z_20231103T075630Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006663-IW2_20231030T230711Z_20231103T075630Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T004-006662-IW3_20231030T230710Z_20231103T070137Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T004-006662-IW3_20231030T230710Z_20231103T070137Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225768-IW1_20231025T225942Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225768-IW1_20231025T225942Z_20231026T215447Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225767-IW2_20231025T225940Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225767-IW2_20231025T225940Z_20231026T215447Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225767-IW1_20231025T225939Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225767-IW1_20231025T225939Z_20231026T215447Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225766-IW2_20231025T225937Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225766-IW2_20231025T225937Z_20231026T215447Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225766-IW1_20231025T225936Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225766-IW1_20231025T225936Z_20231026T215447Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225765-IW3_20231025T225936Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225765-IW3_20231025T225936Z_20231026T215447Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225765-IW2_20231025T225935Z_20231026T215447Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225765-IW2_20231025T225935Z_20231026T215447Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225765-IW1_20231025T225934Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225765-IW1_20231025T225934Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225764-IW3_20231025T225933Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225764-IW3_20231025T225933Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225764-IW2_20231025T225932Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225764-IW2_20231025T225932Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225764-IW1_20231025T225931Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225764-IW1_20231025T225931Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225763-IW3_20231025T225930Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225763-IW3_20231025T225930Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225763-IW2_20231025T225929Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225763-IW2_20231025T225929Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225763-IW1_20231025T225928Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225763-IW1_20231025T225928Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225762-IW3_20231025T225927Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225762-IW3_20231025T225927Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225762-IW2_20231025T225926Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225762-IW2_20231025T225926Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225762-IW1_20231025T225925Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225762-IW1_20231025T225925Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225761-IW3_20231025T225925Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225761-IW3_20231025T225925Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225761-IW2_20231025T225924Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225761-IW2_20231025T225924Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225761-IW1_20231025T225923Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225761-IW1_20231025T225923Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225760-IW3_20231025T225922Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225760-IW3_20231025T225922Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225760-IW2_20231025T225921Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225760-IW2_20231025T225921Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225760-IW1_20231025T225920Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225760-IW1_20231025T225920Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225759-IW3_20231025T225919Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225759-IW3_20231025T225919Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225759-IW2_20231025T225918Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225759-IW2_20231025T225918Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225759-IW1_20231025T225917Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225759-IW1_20231025T225917Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225758-IW3_20231025T225916Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225758-IW3_20231025T225916Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225758-IW2_20231025T225915Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225758-IW2_20231025T225915Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225758-IW1_20231025T225914Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225758-IW1_20231025T225914Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225757-IW3_20231025T225914Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225757-IW3_20231025T225914Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225757-IW2_20231025T225913Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225757-IW2_20231025T225913Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225757-IW1_20231025T225912Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225757-IW1_20231025T225912Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225756-IW3_20231025T225911Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225756-IW3_20231025T225911Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225756-IW2_20231025T225910Z_20231026T220726Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225756-IW2_20231025T225910Z_20231026T220726Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225756-IW1_20231025T225909Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225756-IW1_20231025T225909Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225755-IW3_20231025T225908Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225755-IW3_20231025T225908Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225755-IW2_20231025T225907Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225755-IW2_20231025T225907Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225755-IW1_20231025T225906Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225755-IW1_20231025T225906Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225754-IW3_20231025T225905Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225754-IW3_20231025T225905Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225754-IW2_20231025T225904Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225754-IW2_20231025T225904Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225754-IW1_20231025T225903Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225754-IW1_20231025T225903Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225753-IW3_20231025T225903Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225753-IW3_20231025T225903Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225753-IW2_20231025T225902Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225753-IW2_20231025T225902Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225753-IW1_20231025T225901Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225753-IW1_20231025T225901Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225752-IW3_20231025T225900Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225752-IW3_20231025T225900Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225752-IW2_20231025T225859Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225752-IW2_20231025T225859Z_20231026T220003Z_S1A_30_v1.0_VH.tif -/vsis3/asf-cumulus-prod-opera-products/OPERA_L2_RTC-S1/OPERA_L2_RTC-S1_T106-225751-IW3_20231025T225857Z_20231026T220003Z_S1A_30_v1.0/OPERA_L2_RTC-S1_T106-225751-IW3_20231025T225857Z_20231026T220003Z_S1A_30_v1.0_VH.tif From 7fb63bbc1fd8d56f42ea3ce8146544207dbbc5af Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 14 Dec 2023 12:01:04 -0900 Subject: [PATCH 180/193] finally incorporate changes in from Heidi --- .../opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt | 2 +- .../opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt | 2 +- .../opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt | 2 +- image_services/opera/metadata/templates/rtc_metadata.txt.j2 | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt index f103b004..6860ba69 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt @@ -11,4 +11,4 @@ Description: OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. Credits: -OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt index 0e9aebe6..90d7caed 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt @@ -11,4 +11,4 @@ Description: OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. Credits: -OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt index bca85c40..7043e6c9 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt @@ -11,4 +11,4 @@ Description: OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. Credits: -OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file diff --git a/image_services/opera/metadata/templates/rtc_metadata.txt.j2 b/image_services/opera/metadata/templates/rtc_metadata.txt.j2 index 17dd9211..fded43a0 100644 --- a/image_services/opera/metadata/templates/rtc_metadata.txt.j2 +++ b/image_services/opera/metadata/templates/rtc_metadata.txt.j2 @@ -11,4 +11,4 @@ Description: OPERA Level-2 Radiometric Terrain Corrected (RTC) products in {{ polarization }} polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the {{ polarization }} polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. Credits: -OPERA Level-2 Radiometric Terrain Corrected Static Layers from Sentinel-1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file From 4432d904fa514ef5c153652a57b55dbb2d857d06 Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Thu, 14 Dec 2023 12:20:30 -0900 Subject: [PATCH 181/193] Update image_services/opera/update_opera_urls.py Co-authored-by: Joseph H Kennedy --- image_services/opera/update_opera_urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/update_opera_urls.py b/image_services/opera/update_opera_urls.py index 60e1dcdc..26110467 100644 --- a/image_services/opera/update_opera_urls.py +++ b/image_services/opera/update_opera_urls.py @@ -60,7 +60,7 @@ def main(): config = json.load(f) polarization = config['s3_suffix'][1:3] - _, _, bucket, _, _ = config['overview_path'].split('/') + bucket = config['overview_path'].split('/')[2] url_file = os.path.join(args.working_directory, f'{config["project_name"]}_{config["dataset_name"]}_vsis3_urls.csv') log.info(f'Querying CMR for OPERA {polarization} products') vsis3_urls = query_cmr(polarization) From 06a7183cf37381b3621087c7aed50584e5abcdad Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 14 Dec 2023 12:22:40 -0900 Subject: [PATCH 182/193] tone down line splitting shenanigans --- image_services/opera/make_opera_services.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index dd631cee..980b1b3d 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -21,9 +21,9 @@ def get_rasters(dataset_name): filename = f'{dataset_name}_vsis3_urls.csv' - with open(filename, newline='') as urlfile: - records = urlfile.read().split('\n')[:-1] - return [f'{record[:-1]}' for record in records] + with open(filename) as urlfile: + records = urlfile.read().splitlines()[:-1] + return [f'{record}' for record in records] def get_pixel_type(data_type: str) -> int: From db4211e8d62f893e5706392c3db0293be239c2f9 Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Thu, 14 Dec 2023 12:34:17 -0900 Subject: [PATCH 183/193] Update image_services/opera/update_opera_urls.sh Co-authored-by: Joseph H Kennedy --- image_services/opera/update_opera_urls.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/update_opera_urls.sh b/image_services/opera/update_opera_urls.sh index 71db6be9..96044a5d 100755 --- a/image_services/opera/update_opera_urls.sh +++ b/image_services/opera/update_opera_urls.sh @@ -9,4 +9,4 @@ source /home/arcgis/mambaforge/etc/profile.d/conda.sh conda activate url-query python /home/arcgis/gis-services/image_services/opera/update_opera_urls.py \ --working-directory $1 \ - $2 \ No newline at end of file + $2 From 1073d079906d373cec815f7562f58be4d6ba548f Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 14 Dec 2023 23:47:28 -0900 Subject: [PATCH 184/193] update Changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4cf6bec..997b5171 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.6.6] ### Added -- Scripts to generate OPERA RTC services +- Scripts to generate OPERA RTC services, URL files, and relevant metadata ## [0.6.5] ### Changed From e53744587f4c38aa4d5ab6c97c76ecf11d0b209d Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 15 Dec 2023 00:38:43 -0900 Subject: [PATCH 185/193] remove unnecessary prefix --- image_services/opera/config/rtc_vh_urls.json | 1 - 1 file changed, 1 deletion(-) diff --git a/image_services/opera/config/rtc_vh_urls.json b/image_services/opera/config/rtc_vh_urls.json index 8a9e26f5..af2aa870 100644 --- a/image_services/opera/config/rtc_vh_urls.json +++ b/image_services/opera/config/rtc_vh_urls.json @@ -3,7 +3,6 @@ "raster_store": "/home/arcgis/raster_store/", "bucket": "asf-cumulus-prod-opera-products", "overview_path": "/vsis3/gis-service-overviews/overviews/", - "s3_prefix": "opera-rtc-image-service-na/VH", "s3_suffix": "_VH.tif", "dataset_name": "RTC_VH", "raster_function_templates": [ From bec5e56772c5e83c17a80dcba9b246d7d6faf82b Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 15 Dec 2023 00:43:59 -0900 Subject: [PATCH 186/193] update some config files --- image_services/opera/config/rtc_hh.json | 3 +-- image_services/opera/config/rtc_hv.json | 3 +-- image_services/opera/config/rtc_vh.json | 3 +-- image_services/opera/config/rtc_vv.json | 8 +++----- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/image_services/opera/config/rtc_hh.json b/image_services/opera/config/rtc_hh.json index 950ec8e1..8d49d789 100644 --- a/image_services/opera/config/rtc_hh.json +++ b/image_services/opera/config/rtc_hh.json @@ -1,9 +1,8 @@ { "project_name": "OPERA", "raster_store": "/home/arcgis/raster_store/", - "bucket": "hyp3-testing", + "bucket": "asf-cumulus-prod-opera-products", "overview_path": "/vsis3/gis-service-overviews/overviews/", - "s3_prefix": "opera-rtc-image-service-na", "s3_suffix": "_HH.tif", "dataset_name": "RTC_HH", "raster_function_templates": [ diff --git a/image_services/opera/config/rtc_hv.json b/image_services/opera/config/rtc_hv.json index 18337112..b892ecae 100644 --- a/image_services/opera/config/rtc_hv.json +++ b/image_services/opera/config/rtc_hv.json @@ -1,9 +1,8 @@ { "project_name": "OPERA", "raster_store": "/home/arcgis/raster_store/", - "bucket": "hyp3-testing", + "bucket": "asf-cumulus-prod-opera-products", "overview_path": "/vsis3/gis-service-overviews/overviews/", - "s3_prefix": "opera-rtc-image-service-prototype/HV", "s3_suffix": "_HV.tif", "dataset_name": "RTC_HV", "raster_function_templates": [ diff --git a/image_services/opera/config/rtc_vh.json b/image_services/opera/config/rtc_vh.json index ba513e91..f22e6e3d 100644 --- a/image_services/opera/config/rtc_vh.json +++ b/image_services/opera/config/rtc_vh.json @@ -1,9 +1,8 @@ { "project_name": "OPERA", "raster_store": "/home/arcgis/raster_store/", - "bucket": "hyp3-testing", + "bucket": "asf-cumulus-prod-opera-products", "overview_path": "/vsis3/gis-service-overviews/overviews/", - "s3_prefix": "opera-rtc-image-service-na", "s3_suffix": "_VH.tif", "dataset_name": "RTC_VH", "raster_function_templates": [ diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index f3048e0d..10c862ac 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -1,9 +1,8 @@ { "project_name": "OPERA", "raster_store": "/home/arcgis/raster_store/", - "bucket": "hyp3-testing", + "bucket": "asf-cumulus-prod-opera-products", "overview_path": "/vsis3/gis-service-overviews/overviews/", - "s3_prefix": "opera-rtc-image-service-prototype/VV", "s3_suffix": "_VV.tif", "dataset_name": "RTC_VV", "raster_function_templates": [ @@ -14,7 +13,7 @@ ], "default_raster_function_template": "Sentinel1_RTC_dB_Stretch.rft.xml", "service_folder": "OPERA", - "service_name": "OPERA_RTC_VV", + "service_name": "OPERA_RTC_VV_URLS", "service_definition_overrides": { "Type": "esriServiceDefinitionType_Replacement", "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", @@ -38,5 +37,4 @@ "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_VV_WMS", "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='abstract']/Value": "WMS service for Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL)." } -} - +} \ No newline at end of file From 92b0cd9ec66ec6a4bfda04209ab3a0c4936bcf62 Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Fri, 15 Dec 2023 12:47:52 -0900 Subject: [PATCH 187/193] Update image_services/opera/make_opera_services.py Co-authored-by: Andrew Player --- image_services/opera/make_opera_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/make_opera_services.py b/image_services/opera/make_opera_services.py index 980b1b3d..9f691d48 100644 --- a/image_services/opera/make_opera_services.py +++ b/image_services/opera/make_opera_services.py @@ -19,7 +19,7 @@ gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'EMPTY_DIR') -def get_rasters(dataset_name): +def get_rasters(dataset_name: str) -> List[str]: filename = f'{dataset_name}_vsis3_urls.csv' with open(filename) as urlfile: records = urlfile.read().splitlines()[:-1] From a748919dfdcd956ce425f46bf3ec1045b0b66dbc Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Fri, 15 Dec 2023 12:48:14 -0900 Subject: [PATCH 188/193] Update image_services/opera/config/rtc_vv_urls.json Co-authored-by: Andrew Player --- image_services/opera/config/rtc_vv_urls.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_vv_urls.json b/image_services/opera/config/rtc_vv_urls.json index 10c862ac..8fe1850f 100644 --- a/image_services/opera/config/rtc_vv_urls.json +++ b/image_services/opera/config/rtc_vv_urls.json @@ -18,7 +18,7 @@ "Type": "esriServiceDefinitionType_Replacement", "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", - "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA.", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", From 0fdb0bc7826a965f04a87980b069e4817d54a02a Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Fri, 15 Dec 2023 12:48:24 -0900 Subject: [PATCH 189/193] Update image_services/opera/config/rtc_vv.json Co-authored-by: Andrew Player --- image_services/opera/config/rtc_vv.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_vv.json b/image_services/opera/config/rtc_vv.json index 10c862ac..8fe1850f 100644 --- a/image_services/opera/config/rtc_vv.json +++ b/image_services/opera/config/rtc_vv.json @@ -18,7 +18,7 @@ "Type": "esriServiceDefinitionType_Replacement", "Configurations/SVCConfiguration/Definition/Description": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL).", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='description']/Value": "OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.", - "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA.", + "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='copyright']/Value": "OPERA Level-2 Radiometric Terrain Corrected products from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA.", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='idleTimeout']/Value": "3600", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='minInstances']/Value": "1", "Configurations/SVCConfiguration/Definition/ConfigurationProperties/PropertyArray/PropertySetProperty[Key='maxInstances']/Value": "9", From 314015d752d251163b30480ead67c03ed8447883 Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Mon, 18 Dec 2023 10:46:37 -0900 Subject: [PATCH 190/193] Update image_services/opera/config/rtc_vv_urls.json Co-authored-by: Joseph H Kennedy --- image_services/opera/config/rtc_vv_urls.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/config/rtc_vv_urls.json b/image_services/opera/config/rtc_vv_urls.json index 8fe1850f..0cb1f0c6 100644 --- a/image_services/opera/config/rtc_vv_urls.json +++ b/image_services/opera/config/rtc_vv_urls.json @@ -37,4 +37,4 @@ "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='title']/Value": "OPERA_RTC_VV_WMS", "Configurations/SVCConfiguration/Definition/Extensions/SVCExtension[TypeName='WMSServer']/Props/PropertyArray/PropertySetProperty[Key='abstract']/Value": "WMS service for Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL)." } -} \ No newline at end of file +} From bd9fc406a77cb1c02210f17553a3773317c40e24 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 18 Dec 2023 11:40:06 -0900 Subject: [PATCH 191/193] update with more metadata --- .../opera/metadata/create_metadata.py | 59 +++++++++++++++++++ .../OPERA_RTC_CA_VH_metadata.txt | 2 +- .../OPERA_RTC_CA_VV_metadata.txt | 2 +- .../metadata_text/OPERA_RTC_HH_metadata.txt | 13 +++- .../metadata_text/OPERA_RTC_HV_metadata.txt | 13 +++- .../metadata_text/OPERA_RTC_VH_metadata.txt | 13 +++- .../metadata_text/OPERA_RTC_VV_metadata.txt | 13 +++- .../metadata/templates/rtc_metadata.txt.j2 | 13 +++- 8 files changed, 111 insertions(+), 17 deletions(-) diff --git a/image_services/opera/metadata/create_metadata.py b/image_services/opera/metadata/create_metadata.py index e69de29b..0eae7b9d 100644 --- a/image_services/opera/metadata/create_metadata.py +++ b/image_services/opera/metadata/create_metadata.py @@ -0,0 +1,59 @@ +import argparse +import json + +from jinja2 import Environment, PackageLoader, StrictUndefined, select_autoescape + + +def get_environment() -> Environment: + env = Environment( + loader=PackageLoader('templates', ''), + autoescape=select_autoescape(['html.j2', 'xml.j2']), + undefined=StrictUndefined, + trim_blocks=True, + lstrip_blocks=True, + keep_trailing_newline=True, + ) + return env + + +def render_template(template: str, payload: dict) -> str: + env = get_environment() + template = env.get_template(template) + rendered = template.render(payload) + return rendered + + +def main(): + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument('-o', '--output', help='File to save output to (optional)') + parser.add_argument('-t', '--template', help='Metadata template to fill', default='rtc_metadata.txt.j2') + parser.add_argument('config_file', help='Configuration file from which resources are imported') + args = parser.parse_args() + + polarization = json.load(open(args.config_file))['s3_suffix'][1:3] + + if polarization[0] != polarization[1]: + polarization_description = f'Values for the {polarization} (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization.' + elif polarization[0] == 'V': + polarization_description = f'Values for the {polarization} polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.' + elif polarization[0] == 'H': + polarization_description = f'Values for the {polarization} polarization are a predominance of double-bounce scattering, with signal bouncing off the ground and then off of surficial objects (e.g., stemmy vegetation, manmade structures) and back towards the sensor. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.' + else: + polarization_description = '' + fields = { + 'polarization': polarization, + 'polarization_description': polarization_description + } + + output_text = render_template(args.template, fields) + if args.output: + output_file = args.output + else: + output_file = f'metadata/metadata_text/OPERA_RTC_{polarization}_metadata.txt' + + with open(output_file, 'w') as f: + f.write(output_text) + + +if __name__ == '__main__': + main() diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt index 5de61ffb..88d92de5 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VH_metadata.txt @@ -14,7 +14,7 @@ OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Se The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) -OPERA includes partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, Southern Methodist University, and EarthScope. Refer to [OPERA’s website](https://www.jpl.nasa.gov/go/opera) for more details. +The OPERA project is managed by JPL with partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, Southern Methodist University, and EarthScope. Refer to [OPERA’s website](https://www.jpl.nasa.gov/go/opera) for more details. Data Use: Please cite the use of this data set using the following: OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt index 4c3de25d..807960a6 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_CA_VV_metadata.txt @@ -14,7 +14,7 @@ OPERA RTC-S1 data is available over all landmasses (excluding Antarctica) for Se The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) -OPERA includes partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, Southern Methodist University, and EarthScope. Refer to [OPERA’s website](https://www.jpl.nasa.gov/go/opera) for more details. +The OPERA project is managed by JPL with partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, Southern Methodist University, and EarthScope. Refer to [OPERA’s website](https://www.jpl.nasa.gov/go/opera) for more details. Data Use: Please cite the use of this data set using the following: OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt index 6860ba69..4136fa52 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_HH_metadata.txt @@ -2,13 +2,20 @@ Title: OPERA RTC HH Tags: -ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL, Radiometric Terrain Correction, RTC Summary: OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) Description: -OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HH polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. + +The OPERA project is managed by JPL with partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, Southern Methodist University, and EarthScope. Refer to [OPERA’s website](https://www.jpl.nasa.gov/go/opera) for more details. + +The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) + +Data Use: Please cite the use of this data set using the following: +OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] Credits: -OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt index 90d7caed..f624e85a 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_HV_metadata.txt @@ -2,13 +2,20 @@ Title: OPERA RTC HV Tags: -ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL, Radiometric Terrain Correction, RTC Summary: OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) Description: -OPERA Level-2 Radiometric Terrain Corrected (RTC) products in HV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the HV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. + +The OPERA project is managed by JPL with partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, Southern Methodist University, and EarthScope. Refer to [OPERA’s website](https://www.jpl.nasa.gov/go/opera) for more details. + +The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) + +Data Use: Please cite the use of this data set using the following: +OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] Credits: -OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt index 49dd07f1..77a7ccc2 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_VH_metadata.txt @@ -2,13 +2,20 @@ Title: OPERA RTC VH Tags: -ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL, Radiometric Terrain Correction, RTC Summary: OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) Description: -OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VH polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. + +The OPERA project is managed by JPL with partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, Southern Methodist University, and EarthScope. Refer to [OPERA’s website](https://www.jpl.nasa.gov/go/opera) for more details. + +The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) + +Data Use: Please cite the use of this data set using the following: +OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] Credits: -OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. diff --git a/image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt b/image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt index 7043e6c9..86af83f2 100644 --- a/image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt +++ b/image_services/opera/metadata/metadata_text/OPERA_RTC_VV_metadata.txt @@ -2,13 +2,20 @@ Title: OPERA RTC VV Tags: -ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL, Radiometric Terrain Correction, RTC Summary: OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) Description: -OPERA Level-2 Radiometric Terrain Corrected (RTC) products in VV polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the VV polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. + +The OPERA project is managed by JPL with partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, Southern Methodist University, and EarthScope. Refer to [OPERA’s website](https://www.jpl.nasa.gov/go/opera) for more details. + +The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) + +Data Use: Please cite the use of this data set using the following: +OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] Credits: -OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. diff --git a/image_services/opera/metadata/templates/rtc_metadata.txt.j2 b/image_services/opera/metadata/templates/rtc_metadata.txt.j2 index fded43a0..e80d96a5 100644 --- a/image_services/opera/metadata/templates/rtc_metadata.txt.j2 +++ b/image_services/opera/metadata/templates/rtc_metadata.txt.j2 @@ -2,13 +2,20 @@ Title: OPERA RTC {{ polarization }} Tags: -ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL +ASF, Alaska Satellite Facility, Synthetic Aperture Radar, SAR, Sentinel-1, OPERA, CALVAL, Radiometric Terrain Correction, RTC Summary: OPERA Level-2 Radiometric Terrain Corrected (RTC) products in {{ polarization }} polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL) Description: -OPERA Level-2 Radiometric Terrain Corrected (RTC) products in {{ polarization }} polarization generated from Sentinel-1 SAR imagery, processed by OPERA (JPL). Values for the {{ polarization }} polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor. +OPERA Level-2 Radiometric Terrain Corrected (RTC) SAR Backscatter products in VH polarization generated from Sentinel-1 (S1) SAR imagery, processed by the OPERA project at JPL. Values for the VH (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization. + +The OPERA project is managed by JPL with partners from NASA’s Goddard Space Flight Center, the U.S. Geological Survey (USGS), the University of Maryland College Park, the University of Alaska Fairbanks, Southern Methodist University, and EarthScope. Refer to [OPERA’s website](https://www.jpl.nasa.gov/go/opera) for more details. + +The source rasters referenced in this service are hosted by the Alaska Satellite Facility in NASA's Earthdata Cloud. More information about the dataset is available here: [https://asf.alaska.edu/datasets/daac/opera/](https://asf.alaska.edu/datasets/daac/opera/) + +Data Use: Please cite the use of this data set using the following: +OPERA. 2023. OPERA Level-2 Radiometric Terrain Corrected from Sentinel-1. Fairbanks, Alaska USA. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. [Date Accessed] Credits: -OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. \ No newline at end of file +OPERA Level-2 Radiometric Terrain Corrected SAR Backscatter from Sentinel-1. NASA Alaska Satellite Facility Distributed Active Archive Center. doi: https://doi.org/10.5067/SNWG/OPERA_L2_RTC-S1_V1. Contains modified Copernicus Sentinel data, processed by ESA. From e49518bd78aed0abc75179d566b7b5d5b6e45cd0 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 18 Dec 2023 13:24:20 -0900 Subject: [PATCH 192/193] fix line length errors --- .../opera/metadata/create_metadata.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/image_services/opera/metadata/create_metadata.py b/image_services/opera/metadata/create_metadata.py index 0eae7b9d..2fc6cc66 100644 --- a/image_services/opera/metadata/create_metadata.py +++ b/image_services/opera/metadata/create_metadata.py @@ -33,11 +33,22 @@ def main(): polarization = json.load(open(args.config_file))['s3_suffix'][1:3] if polarization[0] != polarization[1]: - polarization_description = f'Values for the {polarization} (cross-polarized) polarization are generally driven by volume scattering, with more complex volume scatterers (such as dense vegetation) returning higher backscatter values. Surface water generally appears very dark, as it is predominantly a surface scatterer; most returns remain in the primary polarization.' + polarization_description = f'Values for the {polarization} (cross-polarized) polarization are generally ' \ + f'driven by volume scattering, with more complex volume scatterers (such as dense ' \ + f'vegetation) returning higher backscatter values. Surface water generally ' \ + f'appears very dark, as it is predominantly a surface scatterer; most returns ' \ + f'remain in the primary polarization. ' elif polarization[0] == 'V': - polarization_description = f'Values for the {polarization} polarization are commonly driven by surface roughness and/or soil moisture, with rougher surfaces and higher soil moisture returning higher backscatter values. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.' + polarization_description = f'Values for the {polarization} polarization are commonly driven by surface ' \ + f'roughness and/or soil moisture, with rougher surfaces and higher soil moisture ' \ + f'returning higher backscatter values. Surface water appears very dark under calm ' \ + f'conditions, as the signal bounces off the surface away from the sensor. ' elif polarization[0] == 'H': - polarization_description = f'Values for the {polarization} polarization are a predominance of double-bounce scattering, with signal bouncing off the ground and then off of surficial objects (e.g., stemmy vegetation, manmade structures) and back towards the sensor. Surface water appears very dark under calm conditions, as the signal bounces off the surface away from the sensor.' + polarization_description = f'Values for the {polarization} polarization are a predominance of double-bounce ' \ + f'scattering, with signal bouncing off the ground and then off of surficial ' \ + f'objects (e.g., stemmy vegetation, manmade structures) and back towards the ' \ + f'sensor. Surface water appears very dark under calm conditions, as the signal ' \ + f'bounces off the surface away from the sensor. ' else: polarization_description = '' fields = { From 66218fa52a93b324ef4e51d49682d19b3b6bec1c Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 18 Dec 2023 13:26:09 -0900 Subject: [PATCH 193/193] fix some flake 8 --- image_services/opera/metadata/create_metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image_services/opera/metadata/create_metadata.py b/image_services/opera/metadata/create_metadata.py index 2fc6cc66..e260a4af 100644 --- a/image_services/opera/metadata/create_metadata.py +++ b/image_services/opera/metadata/create_metadata.py @@ -35,7 +35,7 @@ def main(): if polarization[0] != polarization[1]: polarization_description = f'Values for the {polarization} (cross-polarized) polarization are generally ' \ f'driven by volume scattering, with more complex volume scatterers (such as dense ' \ - f'vegetation) returning higher backscatter values. Surface water generally ' \ + f'vegetation) returning higher backscatter values. Surface water generally ' \ f'appears very dark, as it is predominantly a surface scatterer; most returns ' \ f'remain in the primary polarization. ' elif polarization[0] == 'V':