From e0cce1da4f6eecf9c468d3474f3934f15d98963a Mon Sep 17 00:00:00 2001 From: Francisco Sandoval Date: Sun, 10 Dec 2023 19:17:03 -0300 Subject: [PATCH] primer commit --- main.py | 94 ++++++++++++++++++ readme.md | 41 ++++++++ requirements.txt | 4 + .../gtfs_realtime_pb2.cpython-311.pyc | Bin 0 -> 10715 bytes utils/gtfs_realtime_pb2.py | 88 ++++++++++++++++ 5 files changed, 227 insertions(+) create mode 100644 main.py create mode 100644 readme.md create mode 100644 requirements.txt create mode 100644 utils/__pycache__/gtfs_realtime_pb2.cpython-311.pyc create mode 100644 utils/gtfs_realtime_pb2.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..1c399ec --- /dev/null +++ b/main.py @@ -0,0 +1,94 @@ +from datetime import datetime +from os import getenv +import utils.gtfs_realtime_pb2 as gtfs +import pytz +import redis +import requests +import json + +db_host = getenv('DB_REDIS_HOST') +db_port = getenv('DB_REDIS_PORT') +tz = pytz.timezone(getenv('TZ')) +r = redis.Redis(host=db_host, port=db_port, decode_responses=True) + +def main(): + print(datetime.now(tz)) + print("hola") + + content = download_file_proto() + if content == None: + return False + + data = read_file_proto(content) + + # save data to redis db + for row in data: + key = f'stop_id:{row["stop_id"]}' + r.set(key, json.dumps(row)) + + +def download_file_proto(): + response = requests.get('https://app.ilab.cl/gtfs-rt/api/concepcion') + if response.status_code == 200: + return response.content + return None + +def read_file_proto(content): + feed = gtfs.FeedMessage() + feed.ParseFromString(content) + data_list = [] + + for entity in feed.entity: + if entity.HasField('trip_update'): + trip_data = { + "id": str(entity.id), + "trip_id": entity.trip_update.trip.trip_id, + "route_id": entity.trip_update.trip.route_id, + "direction_id": entity.trip_update.trip.direction_id, + "start_time": entity.trip_update.trip.start_time, + "start_date": entity.trip_update.trip.start_date, + "schedule_relationship": entity.trip_update.trip.schedule_relationship, + "vehicle_license_plate": entity.trip_update.vehicle.license_plate, + "latitude": entity.vehicle.position.latitude, + "longitude": entity.vehicle.position.longitude, + "bearing": entity.vehicle.position.bearing, + "odometer": entity.vehicle.position.odometer, + "speed": entity.vehicle.position.speed + } + + for update in entity.trip_update.stop_time_update: + data_dict = trip_data.copy() + data_dict["stop_sequence"] = update.stop_sequence + data_dict["stop_id"] = update.stop_id + data_dict["arrival_time"] = update.arrival.time + data_dict["hora_llegada"] = datetime.fromtimestamp(update.arrival.time).strftime('%Y-%m-%d %H:%M:%S') + data_list.append(data_dict) + + else: + trip_data = { + "id": str(entity.id), + "trip_id": entity.vehicle.trip.trip_id, + "route_id":entity.vehicle.trip.route_id, + "direction_id": entity.vehicle.trip.direction_id, + "start_time": entity.vehicle.trip.start_time, + "start_date": entity.vehicle.trip.start_date, + "schedule_relationship": entity.vehicle.trip.schedule_relationship, + "vehicle_license_plate": entity.vehicle.vehicle.license_plate, + "latitude": entity.vehicle.position.latitude, + "longitude": entity.vehicle.position.longitude, + "bearing": entity.vehicle.position.bearing, + "odometer": entity.vehicle.position.odometer, + "speed": entity.vehicle.position.speed + } + data_dict = trip_data.copy() + data_dict["stop_sequence"] = "" + data_dict["stop_id"] = "" + data_dict["arrival_time"] = "" + data_dict["hora_llegada"] = "" + data_list.append(data_dict) + + filtered_list = [item for item in data_list if item["stop_id"] > " "] + return filtered_list; + + +main() \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..2e2fbca --- /dev/null +++ b/readme.md @@ -0,0 +1,41 @@ + +# file: docker-compose.yml + +~~~yml +version: '3' +name: proto + +services: + + app: + image: python:3.11-alpine + environment: + - DB_REDIS_HOST=dbproto + - DB_REDIS_PORT=6379 + - TZ=America/Santiago + volumes: + - ./proto:/app + - venv_proto:/root/venv + working_dir: /app + command: sh -c " + [ -d /root/venv/bin ] || ( \ + python -m venv /root/venv/ \ + && . /root/venv/bin/activate \ + && pip install -r requirements.txt \ + ) ; + + . /root/venv/bin/activate ; + + cd /app ; + [ -f .env ] || ( [ -f .env.develop ] && cp .env.develop .env ) ; + watch -n 30 -t python main.py + " + + dbproto: + image: redis:7.2-alpine + ports: + - 6379:6379 + +volumes: + venv_proto: +~~~ \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ed10bc4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +google +protobuf +redis[hiredis] +pytz \ No newline at end of file diff --git a/utils/__pycache__/gtfs_realtime_pb2.cpython-311.pyc b/utils/__pycache__/gtfs_realtime_pb2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1aa748d585e3eac1824b60adebd779d9c880d1e1 GIT binary patch literal 10715 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.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties\x1a>\n\x12StopTimeProperties\x12\x18\n\x10\x61ssigned_stop_id\x18\x01 \x01(\t*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"P\n\x14ScheduleRelationship\x12\r\n\tSCHEDULED\x10\x00\x12\x0b\n\x07SKIPPED\x10\x01\x12\x0b\n\x07NO_DATA\x10\x02\x12\x0f\n\x0bUNSCHEDULED\x10\x03*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\x1ak\n\x0eTripProperties\x12\x0f\n\x07trip_id\x18\x01 \x01(\t\x12\x12\n\nstart_date\x18\x02 \x01(\t\x12\x12\n\nstart_time\x18\x03 \x01(\t\x12\x10\n\x08shape_id\x18\x04 \x01(\t*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"\xdf\t\n\x0fVehiclePosition\x12.\n\x04trip\x18\x01 \x01(\x0b\x32 .transit_realtime.TripDescriptor\x12\x34\n\x07vehicle\x18\x08 \x01(\x0b\x32#.transit_realtime.VehicleDescriptor\x12,\n\x08position\x18\x02 \x01(\x0b\x32\x1a.transit_realtime.Position\x12\x1d\n\x15\x63urrent_stop_sequence\x18\x03 \x01(\r\x12\x0f\n\x07stop_id\x18\x07 \x01(\t\x12Z\n\x0e\x63urrent_status\x18\x04 \x01(\x0e\x32\x33.transit_realtime.VehiclePosition.VehicleStopStatus:\rIN_TRANSIT_TO\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12K\n\x10\x63ongestion_level\x18\x06 \x01(\x0e\x32\x31.transit_realtime.VehiclePosition.CongestionLevel\x12K\n\x10occupancy_status\x18\t \x01(\x0e\x32\x31.transit_realtime.VehiclePosition.OccupancyStatus\x12\x1c\n\x14occupancy_percentage\x18\n \x01(\r\x12Q\n\x16multi_carriage_details\x18\x0b \x03(\x0b\x32\x31.transit_realtime.VehiclePosition.CarriageDetails\x1a\xd9\x01\n\x0f\x43\x61rriageDetails\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12^\n\x10occupancy_status\x18\x03 \x01(\x0e\x32\x31.transit_realtime.VehiclePosition.OccupancyStatus:\x11NO_DATA_AVAILABLE\x12 \n\x14occupancy_percentage\x18\x04 \x01(\x05:\x02-1\x12\x19\n\x11\x63\x61rriage_sequence\x18\x05 \x01(\r*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"G\n\x11VehicleStopStatus\x12\x0f\n\x0bINCOMING_AT\x10\x00\x12\x0e\n\nSTOPPED_AT\x10\x01\x12\x11\n\rIN_TRANSIT_TO\x10\x02\"}\n\x0f\x43ongestionLevel\x12\x1c\n\x18UNKNOWN_CONGESTION_LEVEL\x10\x00\x12\x14\n\x10RUNNING_SMOOTHLY\x10\x01\x12\x0f\n\x0bSTOP_AND_GO\x10\x02\x12\x0e\n\nCONGESTION\x10\x03\x12\x15\n\x11SEVERE_CONGESTION\x10\x04\"\xd9\x01\n\x0fOccupancyStatus\x12\t\n\x05\x45MPTY\x10\x00\x12\x18\n\x14MANY_SEATS_AVAILABLE\x10\x01\x12\x17\n\x13\x46\x45W_SEATS_AVAILABLE\x10\x02\x12\x16\n\x12STANDING_ROOM_ONLY\x10\x03\x12\x1e\n\x1a\x43RUSHED_STANDING_ROOM_ONLY\x10\x04\x12\x08\n\x04\x46ULL\x10\x05\x12\x1c\n\x18NOT_ACCEPTING_PASSENGERS\x10\x06\x12\x15\n\x11NO_DATA_AVAILABLE\x10\x07\x12\x11\n\rNOT_BOARDABLE\x10\x08*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"\xeb\n\n\x05\x41lert\x12\x32\n\ractive_period\x18\x01 \x03(\x0b\x32\x1b.transit_realtime.TimeRange\x12\x39\n\x0finformed_entity\x18\x05 \x03(\x0b\x32 .transit_realtime.EntitySelector\x12;\n\x05\x63\x61use\x18\x06 \x01(\x0e\x32\x1d.transit_realtime.Alert.Cause:\rUNKNOWN_CAUSE\x12>\n\x06\x65\x66\x66\x65\x63t\x18\x07 \x01(\x0e\x32\x1e.transit_realtime.Alert.Effect:\x0eUNKNOWN_EFFECT\x12/\n\x03url\x18\x08 \x01(\x0b\x32\".transit_realtime.TranslatedString\x12\x37\n\x0bheader_text\x18\n \x01(\x0b\x32\".transit_realtime.TranslatedString\x12<\n\x10\x64\x65scription_text\x18\x0b \x01(\x0b\x32\".transit_realtime.TranslatedString\x12;\n\x0ftts_header_text\x18\x0c \x01(\x0b\x32\".transit_realtime.TranslatedString\x12@\n\x14tts_description_text\x18\r \x01(\x0b\x32\".transit_realtime.TranslatedString\x12O\n\x0eseverity_level\x18\x0e \x01(\x0e\x32%.transit_realtime.Alert.SeverityLevel:\x10UNKNOWN_SEVERITY\x12\x30\n\x05image\x18\x0f \x01(\x0b\x32!.transit_realtime.TranslatedImage\x12\x42\n\x16image_alternative_text\x18\x10 \x01(\x0b\x32\".transit_realtime.TranslatedString\x12\x38\n\x0c\x63\x61use_detail\x18\x11 \x01(\x0b\x32\".transit_realtime.TranslatedString\x12\x39\n\reffect_detail\x18\x12 \x01(\x0b\x32\".transit_realtime.TranslatedString\"\xd8\x01\n\x05\x43\x61use\x12\x11\n\rUNKNOWN_CAUSE\x10\x01\x12\x0f\n\x0bOTHER_CAUSE\x10\x02\x12\x15\n\x11TECHNICAL_PROBLEM\x10\x03\x12\n\n\x06STRIKE\x10\x04\x12\x11\n\rDEMONSTRATION\x10\x05\x12\x0c\n\x08\x41\x43\x43IDENT\x10\x06\x12\x0b\n\x07HOLIDAY\x10\x07\x12\x0b\n\x07WEATHER\x10\x08\x12\x0f\n\x0bMAINTENANCE\x10\t\x12\x10\n\x0c\x43ONSTRUCTION\x10\n\x12\x13\n\x0fPOLICE_ACTIVITY\x10\x0b\x12\x15\n\x11MEDICAL_EMERGENCY\x10\x0c\"\xdd\x01\n\x06\x45\x66\x66\x65\x63t\x12\x0e\n\nNO_SERVICE\x10\x01\x12\x13\n\x0fREDUCED_SERVICE\x10\x02\x12\x16\n\x12SIGNIFICANT_DELAYS\x10\x03\x12\n\n\x06\x44\x45TOUR\x10\x04\x12\x16\n\x12\x41\x44\x44ITIONAL_SERVICE\x10\x05\x12\x14\n\x10MODIFIED_SERVICE\x10\x06\x12\x10\n\x0cOTHER_EFFECT\x10\x07\x12\x12\n\x0eUNKNOWN_EFFECT\x10\x08\x12\x0e\n\nSTOP_MOVED\x10\t\x12\r\n\tNO_EFFECT\x10\n\x12\x17\n\x13\x41\x43\x43\x45SSIBILITY_ISSUE\x10\x0b\"H\n\rSeverityLevel\x12\x14\n\x10UNKNOWN_SEVERITY\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\x0b\n\x07WARNING\x10\x03\x12\n\n\x06SEVERE\x10\x04*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"7\n\tTimeRange\x12\r\n\x05start\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"q\n\x08Position\x12\x10\n\x08latitude\x18\x01 \x02(\x02\x12\x11\n\tlongitude\x18\x02 \x02(\x02\x12\x0f\n\x07\x62\x65\x61ring\x18\x03 \x01(\x02\x12\x10\n\x08odometer\x18\x04 \x01(\x01\x12\r\n\x05speed\x18\x05 \x01(\x02*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"\xdb\x02\n\x0eTripDescriptor\x12\x0f\n\x07trip_id\x18\x01 \x01(\t\x12\x10\n\x08route_id\x18\x05 \x01(\t\x12\x14\n\x0c\x64irection_id\x18\x06 \x01(\r\x12\x12\n\nstart_time\x18\x02 \x01(\t\x12\x12\n\nstart_date\x18\x03 \x01(\t\x12T\n\x15schedule_relationship\x18\x04 \x01(\x0e\x32\x35.transit_realtime.TripDescriptor.ScheduleRelationship\"\x81\x01\n\x14ScheduleRelationship\x12\r\n\tSCHEDULED\x10\x00\x12\t\n\x05\x41\x44\x44\x45\x44\x10\x01\x12\x0f\n\x0bUNSCHEDULED\x10\x02\x12\x0c\n\x08\x43\x41NCELED\x10\x03\x12\x13\n\x0bREPLACEMENT\x10\x05\x1a\x02\x08\x01\x12\x0e\n\nDUPLICATED\x10\x06\x12\x0b\n\x07\x44\x45LETED\x10\x07*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"\xa3\x02\n\x11VehicleDescriptor\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x15\n\rlicense_plate\x18\x03 \x01(\t\x12\x61\n\x15wheelchair_accessible\x18\x04 \x01(\x0e\x32\x38.transit_realtime.VehicleDescriptor.WheelchairAccessible:\x08NO_VALUE\"i\n\x14WheelchairAccessible\x12\x0c\n\x08NO_VALUE\x10\x00\x12\x0b\n\x07UNKNOWN\x10\x01\x12\x19\n\x15WHEELCHAIR_ACCESSIBLE\x10\x02\x12\x1b\n\x17WHEELCHAIR_INACCESSIBLE\x10\x03*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"\xb0\x01\n\x0e\x45ntitySelector\x12\x11\n\tagency_id\x18\x01 \x01(\t\x12\x10\n\x08route_id\x18\x02 \x01(\t\x12\x12\n\nroute_type\x18\x03 \x01(\x05\x12.\n\x04trip\x18\x04 \x01(\x0b\x32 .transit_realtime.TripDescriptor\x12\x0f\n\x07stop_id\x18\x05 \x01(\t\x12\x14\n\x0c\x64irection_id\x18\x06 \x01(\r*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"\xa6\x01\n\x10TranslatedString\x12\x43\n\x0btranslation\x18\x01 \x03(\x0b\x32..transit_realtime.TranslatedString.Translation\x1a=\n\x0bTranslation\x12\x0c\n\x04text\x18\x01 \x02(\t\x12\x10\n\x08language\x18\x02 \x01(\t*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"\xc1\x01\n\x0fTranslatedImage\x12I\n\x0flocalized_image\x18\x01 \x03(\x0b\x32\x30.transit_realtime.TranslatedImage.LocalizedImage\x1aS\n\x0eLocalizedImage\x12\x0b\n\x03url\x18\x01 \x02(\t\x12\x12\n\nmedia_type\x18\x02 \x02(\t\x12\x10\n\x08language\x18\x03 \x01(\t*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90N\"C\n\x05Shape\x12\x10\n\x08shape_id\x18\x01 \x01(\t\x12\x18\n\x10\x65ncoded_polyline\x18\x02 \x01(\t*\x06\x08\xe8\x07\x10\xd0\x0f*\x06\x08\xa8\x46\x10\x90NB\x1d\n\x1b\x63om.google.transit.realtime') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'utils.gtfs_realtime_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\033com.google.transit.realtime' + _TRIPDESCRIPTOR_SCHEDULERELATIONSHIP.values_by_name["REPLACEMENT"]._options = None + _TRIPDESCRIPTOR_SCHEDULERELATIONSHIP.values_by_name["REPLACEMENT"]._serialized_options = b'\010\001' + _globals['_FEEDMESSAGE']._serialized_start=47 + _globals['_FEEDMESSAGE']._serialized_end=168 + _globals['_FEEDHEADER']._serialized_start=171 + _globals['_FEEDHEADER']._serialized_end=386 + _globals['_FEEDHEADER_INCREMENTALITY']._serialized_start=318 + _globals['_FEEDHEADER_INCREMENTALITY']._serialized_end=370 + _globals['_FEEDENTITY']._serialized_start=389 + _globals['_FEEDENTITY']._serialized_end=639 + _globals['_TRIPUPDATE']._serialized_start=642 + _globals['_TRIPUPDATE']._serialized_end=1773 + _globals['_TRIPUPDATE_STOPTIMEEVENT']._serialized_start=933 + _globals['_TRIPUPDATE_STOPTIMEEVENT']._serialized_end=1014 + _globals['_TRIPUPDATE_STOPTIMEUPDATE']._serialized_start=1017 + _globals['_TRIPUPDATE_STOPTIMEUPDATE']._serialized_end=1648 + _globals['_TRIPUPDATE_STOPTIMEUPDATE_STOPTIMEPROPERTIES']._serialized_start=1488 + _globals['_TRIPUPDATE_STOPTIMEUPDATE_STOPTIMEPROPERTIES']._serialized_end=1550 + _globals['_TRIPUPDATE_STOPTIMEUPDATE_SCHEDULERELATIONSHIP']._serialized_start=1552 + _globals['_TRIPUPDATE_STOPTIMEUPDATE_SCHEDULERELATIONSHIP']._serialized_end=1632 + _globals['_TRIPUPDATE_TRIPPROPERTIES']._serialized_start=1650 + _globals['_TRIPUPDATE_TRIPPROPERTIES']._serialized_end=1757 + _globals['_VEHICLEPOSITION']._serialized_start=1776 + _globals['_VEHICLEPOSITION']._serialized_end=3023 + _globals['_VEHICLEPOSITION_CARRIAGEDETAILS']._serialized_start=2370 + _globals['_VEHICLEPOSITION_CARRIAGEDETAILS']._serialized_end=2587 + _globals['_VEHICLEPOSITION_VEHICLESTOPSTATUS']._serialized_start=2589 + _globals['_VEHICLEPOSITION_VEHICLESTOPSTATUS']._serialized_end=2660 + _globals['_VEHICLEPOSITION_CONGESTIONLEVEL']._serialized_start=2662 + _globals['_VEHICLEPOSITION_CONGESTIONLEVEL']._serialized_end=2787 + _globals['_VEHICLEPOSITION_OCCUPANCYSTATUS']._serialized_start=2790 + _globals['_VEHICLEPOSITION_OCCUPANCYSTATUS']._serialized_end=3007 + _globals['_ALERT']._serialized_start=3026 + _globals['_ALERT']._serialized_end=4413 + _globals['_ALERT_CAUSE']._serialized_start=3883 + _globals['_ALERT_CAUSE']._serialized_end=4099 + _globals['_ALERT_EFFECT']._serialized_start=4102 + _globals['_ALERT_EFFECT']._serialized_end=4323 + _globals['_ALERT_SEVERITYLEVEL']._serialized_start=4325 + _globals['_ALERT_SEVERITYLEVEL']._serialized_end=4397 + _globals['_TIMERANGE']._serialized_start=4415 + _globals['_TIMERANGE']._serialized_end=4470 + _globals['_POSITION']._serialized_start=4472 + _globals['_POSITION']._serialized_end=4585 + _globals['_TRIPDESCRIPTOR']._serialized_start=4588 + _globals['_TRIPDESCRIPTOR']._serialized_end=4935 + _globals['_TRIPDESCRIPTOR_SCHEDULERELATIONSHIP']._serialized_start=4790 + _globals['_TRIPDESCRIPTOR_SCHEDULERELATIONSHIP']._serialized_end=4919 + _globals['_VEHICLEDESCRIPTOR']._serialized_start=4938 + _globals['_VEHICLEDESCRIPTOR']._serialized_end=5229 + _globals['_VEHICLEDESCRIPTOR_WHEELCHAIRACCESSIBLE']._serialized_start=5108 + _globals['_VEHICLEDESCRIPTOR_WHEELCHAIRACCESSIBLE']._serialized_end=5213 + _globals['_ENTITYSELECTOR']._serialized_start=5232 + _globals['_ENTITYSELECTOR']._serialized_end=5408 + _globals['_TRANSLATEDSTRING']._serialized_start=5411 + _globals['_TRANSLATEDSTRING']._serialized_end=5577 + _globals['_TRANSLATEDSTRING_TRANSLATION']._serialized_start=5500 + _globals['_TRANSLATEDSTRING_TRANSLATION']._serialized_end=5561 + _globals['_TRANSLATEDIMAGE']._serialized_start=5580 + _globals['_TRANSLATEDIMAGE']._serialized_end=5773 + _globals['_TRANSLATEDIMAGE_LOCALIZEDIMAGE']._serialized_start=5674 + _globals['_TRANSLATEDIMAGE_LOCALIZEDIMAGE']._serialized_end=5757 + _globals['_SHAPE']._serialized_start=5775 + _globals['_SHAPE']._serialized_end=5842 +# @@protoc_insertion_point(module_scope)