From 5f6d2737d1996f2a3578af7499c883abaff16b65 Mon Sep 17 00:00:00 2001 From: Ron Sweeney Date: Sun, 3 Mar 2024 18:27:00 -0500 Subject: [PATCH 1/3] upgrade the library --- src/rivian_api.py | 645 +--------------------------------------------- 1 file changed, 1 insertion(+), 644 deletions(-) diff --git a/src/rivian_api.py b/src/rivian_api.py index 88a8530..cef7e69 100644 --- a/src/rivian_api.py +++ b/src/rivian_api.py @@ -1,644 +1 @@ -import logging -import requests -import uuid -import time - -RIVIAN_BASE_PATH = "https://rivian.com/api/gql" -RIVIAN_GATEWAY_PATH = RIVIAN_BASE_PATH + "/gateway/graphql" -RIVIAN_CHARGING_PATH = RIVIAN_BASE_PATH + "/chrg/user/graphql" -RIVIAN_ORDERS_PATH = RIVIAN_BASE_PATH + '/orders/graphql' -RIVIAN_CONTENT_PATH = RIVIAN_BASE_PATH + '/content/graphql' -RIVIAN_TRANSACTIONS_PATH = RIVIAN_BASE_PATH + '/t2d/graphql' - -log = logging.getLogger(__name__) - -HEADERS = { - "User-Agent": "RivianApp/1304 CFNetwork/1404.0.5 Darwin/22.3.0", - "Accept": "application/json", - "Content-Type": "application/json", - "Apollographql-Client-Name": "com.rivian.ios.consumer-apollo-ios", -} - - -class Rivian: - def __init__(self): - self._close_session = False - self._session_token = "" - self._access_token = "" - self._refresh_token = "" - self._app_session_token = "" - self._user_session_token = "" - self.client_id = "" - self.client_secret = "" - self.request_timeout = "" - self._csrf_token = "" - - self.otp_needed = False - self._otp_token = "" - - def login(self, username, password): - self.create_csrf_token() - url = RIVIAN_GATEWAY_PATH - headers = HEADERS - headers.update( - { - "Csrf-Token": self._csrf_token, - "A-Sess": self._app_session_token, - "Apollographql-Client-Name": "com.rivian.ios.consumer-apollo-ios", - "Dc-Cid": f"m-ios-{uuid.uuid4()}", - } - ) - #print(headers) - - query = { - "operationName": "Login", - "query": "mutation Login($email: String!, $password: String!) {\n login(email: $email, password: $password) {\n __typename\n ... on MobileLoginResponse {\n __typename\n accessToken\n refreshToken\n userSessionToken\n }\n ... on MobileMFALoginResponse {\n __typename\n otpToken\n }\n }\n}", - "variables": {"email": username, "password": password}, - } - - response = self.raw_graphql_query(url=url, query=query, headers=headers) - response_json = response.json() - if response.status_code == 200 and response_json["data"] and "login" in response_json["data"]: - login_data = response_json["data"]["login"] - if "otpToken" in login_data: - self.otp_needed = True - self._otp_token = login_data["otpToken"] - else: - self._access_token = login_data["accessToken"] - self._refresh_token = login_data["refreshToken"] - self._user_session_token = login_data["userSessionToken"] - else: - message = f"Status: {response.status_code}: Details: {response_json}" - print(f"Login failed: {message}") - raise Exception(message) - return response - - def login_with_otp(self, username, otpCode, otpToken=None): - if self._csrf_token == "": - self.create_csrf_token() - url = RIVIAN_GATEWAY_PATH - headers = HEADERS - headers.update( - { - "Csrf-Token": self._csrf_token, - "A-Sess": self._app_session_token, - "Apollographql-Client-Name": "com.rivian.ios.consumer-apollo-ios", - } - ) - - query = { - "operationName": "LoginWithOTP", - "query": "mutation LoginWithOTP($email: String!, $otpCode: String!, $otpToken: String!) {\n loginWithOTP(email: $email, otpCode: $otpCode, otpToken: $otpToken) {\n __typename\n ... on MobileLoginResponse {\n __typename\n accessToken\n refreshToken\n userSessionToken\n }\n }\n}", - "variables": { - "email": username, - "otpCode": otpCode, - "otpToken": otpToken or self._otp_token, - }, - } - - response = self.raw_graphql_query(url=url, query=query, headers=headers) - response_json = response.json() - if response.status_code == 200 and response_json["data"] and "loginWithOTP" in response_json["data"]: - login_data = response_json["data"]["loginWithOTP"] - self._access_token = login_data["accessToken"] - self._refresh_token = login_data["refreshToken"] - self._user_session_token = login_data["userSessionToken"] - else: - message = f"Status: {response.status_code}: Details: {response_json}" - print(f"Login with otp failed: {message}") - raise Exception(message) - return response - - def create_csrf_token(self): - url = RIVIAN_GATEWAY_PATH - headers = HEADERS - - query = { - "operationName": "CreateCSRFToken", - "query": "mutation CreateCSRFToken {createCsrfToken {__typename csrfToken appSessionToken}}", - "variables": None, - } - - response = self.raw_graphql_query(url=url, query=query, headers=headers) - response_json = response.json() - csrf_data = response_json["data"]["createCsrfToken"] - self._csrf_token = csrf_data["csrfToken"] - self._app_session_token = csrf_data["appSessionToken"] - return response - - def raw_graphql_query(self, url, query, headers): - response = requests.post(url, json=query, headers=headers) - # print(response.status_code) - # print(response.content) - if response.status_code != 200: - log.warning(f"Graphql error: Response status: {response.status_code} Reason: {response.reason}") - return response - - def gateway_headers(self): - headers = HEADERS - headers.update( - { - "Csrf-Token": self._csrf_token, - "A-Sess": self._app_session_token, - "U-Sess": self._user_session_token, - "Dc-Cid": f"m-ios-{uuid.uuid4()}", - } - ) - return headers - - def transaction_headers(self): - headers = self.gateway_headers() - headers.update( - { - "dc-cid": f"t2d--{uuid.uuid4()}--{uuid.uuid4()}", - "csrf-token": self._csrf_token, - "app-id": "t2d" - } - ) - return headers - - def vehicle_orders(self): - headers = self.gateway_headers() - query = { - "operationName": "vehicleOrders", - "query": "query vehicleOrders { orders(input: {orderTypes: [PRE_ORDER, VEHICLE], pageInfo: {from: 0, size: 10000}}) { __typename data { __typename id orderDate state configurationStatus fulfillmentSummaryStatus items { __typename sku } consumerStatuses { __typename isConsumerFlowComplete } } } }", - "variables": {}, - } - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - return response.json() - - def delivery(self, order_id): - headers = self.gateway_headers() - query = { - "operationName": "delivery", - "query": "query delivery($orderId: ID!) { delivery(orderId: $orderId) { __typename status carrier deliveryAddress { __typename addressLine1 addressLine2 city state country zipcode } appointmentDetails { __typename appointmentId startDateTime endDateTime timeZone } vehicleVIN } }", - "variables": { - "orderId": order_id, - }, - } - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - return response.json() - - def transaction_status(self, order_id): - headers = self.transaction_headers() - query = { - "operationName": "transactionStatus", - "query": "query transactionStatus($orderId: ID!) { transactionStatus(orderId: $orderId) { titleAndReg { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } tradeIn { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } finance { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } delivery { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } insurance { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } documentUpload { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } contracts { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } payment { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } } }", - "variables": { - "orderId": order_id - }, - } - response = self.raw_graphql_query(url=RIVIAN_TRANSACTIONS_PATH, query=query, headers=headers) - return response.json() - - def finance_summary(self, order_id): - headers = self.transaction_headers() - query = { - "operationName": "financeSummary", - "query": "query financeSummary($orderId: ID!) { ...FinanceSummaryFragment } fragment FinanceSummaryFragment on Query { financeSummary(orderId: $orderId) { orderId status financeChoice { financeChoice institutionName paymentMethod trackingNumber preApprovedAmount loanOfficerName loanOfficerContact downPayment rate term rateAndTermSkipped } } }", - "variables": {"orderId": order_id}, - } - response = self.raw_graphql_query(url=RIVIAN_TRANSACTIONS_PATH, query=query, headers=headers) - return response.json() - - def order(self, order_id): - headers = self.transaction_headers() - query = { - "operationName": "order", - "query": "query order($id: String!) { order(id: $id) { vin state billingAddress { firstName lastName line1 line2 city state country postalCode } shippingAddress { firstName lastName line1 line2 city state country postalCode } orderCancelDate orderEmail currency locale storeId type subtotal discountTotal taxTotal feesTotal paidTotal remainingTotal outstandingBalance costAfterCredits total payments { id intent date method amount referenceNumber status card { last4 expiryDate brand } bank { bankName country last4 } transactionNotes } tradeIns { tradeInReferenceId amount } vehicle { vehicleId vin modelYear model make } items { id discounts { total items { amount title code } } subtotal quantity title productId type unitPrice fees { items { description amount code type } total } taxes { items { description amount code rate type } total } sku shippingAddress { firstName lastName line1 line2 city state country postalCode } configuration { ruleset { meta { rulesetId storeId country vehicle version effectiveDate currency locale availableLocales } defaults { basePrice initialSelection } groups options specs rules } basePrice version options { optionId optionName optionDetails { name attrs price visualExterior visualInterior hidden disabled required } groupId groupName groupDetails { name attrs multiselect required options } price } } } }}", - "variables": {"id": order_id}, - } - response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) - return response.json() - - def retail_orders(self): - headers = self.transaction_headers() - query = { - "operationName": "searchOrders", - "query": "query searchOrders($input: UserOrderSearchInput!) { searchOrders(input: $input) { total data { id type orderDate state fulfillmentSummaryStatus items { id title type sku __typename } __typename } __typename }}", - "variables": { - "input": { - "orderTypes": ["RETAIL"], - "orderStates": None, - "pageInfo": { - "from": 0, - "size": 5 - }, - "dateRange": None, - "sortFields": { - "orderDate": "DESC" - } - } - }, - } - response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) - return response.json() - - def get_order(self, order_id): - headers = self.transaction_headers() - query = { - "operationName": "getOrder", - "query": "query getOrder($orderId: String!) { order(id: $orderId) { id storeId userId orderDate orderCancelDate type state currency locale subtotal discountTotal taxTotal total shippingAddress { firstName lastName line1 line2 city state country postalCode __typename } payments { method currency status type card { last4 expiryDate brand __typename } __typename } items { id title type sku unitPrice quantity state productDetails { ... on ChildProduct { dimensionValues { name valueName localizedStrings __typename } __typename } __typename } __typename } fulfillmentSummaryStatus fulfillmentInfo { fulfillments { fulfillmentId fulfillmentStatus fulfillmentMethod fulfillmentVendor tracking { status carrier number url shipDate deliveredDate serviceType __typename } estimatedDeliveryWindow { startDate endDate __typename } items { orderItemId quantityFulfilled isPartialFulfillment __typename } __typename } pendingFulfillmentItems { orderItemId quantity __typename } __typename } __typename }}", - "variables": { - "orderId": order_id - }, - } - response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) - return response.json() - - def payment_methods(self): - headers = self.transaction_headers() - query = { - "operationName": "paymentMethods", - "query": "query paymentMethods { paymentMethods { id type default card { lastFour brand expiration postalCode } } }", - "variables": {}, - } - response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) - return response.json() - - def get_user_information(self): - headers = self.gateway_headers() - query = { - "operationName": "getUserInfo", - "query": "query getUserInfo { currentUser { __typename id firstName lastName email address { __typename country } vehicles { __typename id name owner roles vin vas { __typename vasVehicleId vehiclePublicKey } state createdAt updatedAt vehicle { __typename id vin modelYear make model expectedBuildDate plannedBuildDate expectedGeneralAssemblyStartDate actualGeneralAssemblyDate mobileConfiguration { __typename trimOption { __typename optionId optionName } exteriorColorOption { __typename optionId optionName } interiorColorOption { __typename optionId optionName } } vehicleState { __typename supportedFeatures { __typename name status } } otaEarlyAccessStatus } settings { __typename name { __typename value } } } enrolledPhones { __typename vas { __typename vasPhoneId publicKey } enrolled { __typename deviceType deviceName vehicleId identityId shortName } } pendingInvites { __typename id invitedByFirstName role status vehicleId vehicleModel email } } }", - # "query": "query getUserInfo {currentUser {__typename id firstName lastName email address { __typename country } vehicles {id name owner roles vin vas {__typename vasVehicleId vehiclePublicKey } state createdAt updatedAt vehicle { __typename id vin modelYear make model expectedBuildDate plannedBuildDate expectedGeneralAssemblyStartDate actualGeneralAssemblyDate } } }}", - "variables": None, - } - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - return response.json() - - def get_vehicle_state(self, vehicle_id, minimal=False): - headers = self.gateway_headers() - - query = "query GetVehicleState($vehicleID: String!) { vehicleState(id: $vehicleID) { __typename gnssLocation { __typename latitude longitude timeStamp } alarmSoundStatus { __typename timeStamp value } timeToEndOfCharge { __typename timeStamp value } doorFrontLeftLocked { __typename timeStamp value } doorFrontLeftClosed { __typename timeStamp value } doorFrontRightLocked { __typename timeStamp value } doorFrontRightClosed { __typename timeStamp value } doorRearLeftLocked { __typename timeStamp value } doorRearLeftClosed { __typename timeStamp value } doorRearRightLocked { __typename timeStamp value } doorRearRightClosed { __typename timeStamp value } windowFrontLeftClosed { __typename timeStamp value } windowFrontRightClosed { __typename timeStamp value } windowFrontLeftCalibrated { __typename timeStamp value } windowFrontRightCalibrated { __typename timeStamp value } windowRearLeftCalibrated { __typename timeStamp value } windowRearRightCalibrated { __typename timeStamp value } closureFrunkLocked { __typename timeStamp value } closureFrunkClosed { __typename timeStamp value } gearGuardLocked { __typename timeStamp value } closureLiftgateLocked { __typename timeStamp value } closureLiftgateClosed { __typename timeStamp value } windowRearLeftClosed { __typename timeStamp value } windowRearRightClosed { __typename timeStamp value } closureSideBinLeftLocked { __typename timeStamp value } closureSideBinLeftClosed { __typename timeStamp value } closureSideBinRightLocked { __typename timeStamp value } closureSideBinRightClosed { __typename timeStamp value } closureTailgateLocked { __typename timeStamp value } closureTailgateClosed { __typename timeStamp value } closureTonneauLocked { __typename timeStamp value } closureTonneauClosed { __typename timeStamp value } wiperFluidState { __typename timeStamp value } powerState { __typename timeStamp value } batteryHvThermalEventPropagation { __typename timeStamp value } vehicleMileage { __typename timeStamp value } brakeFluidLow { __typename timeStamp value } gearStatus { __typename timeStamp value } tirePressureStatusFrontLeft { __typename timeStamp value } tirePressureStatusValidFrontLeft { __typename timeStamp value } tirePressureStatusFrontRight { __typename timeStamp value } tirePressureStatusValidFrontRight { __typename timeStamp value } tirePressureStatusRearLeft { __typename timeStamp value } tirePressureStatusValidRearLeft { __typename timeStamp value } tirePressureStatusRearRight { __typename timeStamp value } tirePressureStatusValidRearRight { __typename timeStamp value } batteryLevel { __typename timeStamp value } chargerState { __typename timeStamp value } batteryLimit { __typename timeStamp value } remoteChargingAvailable { __typename timeStamp value } batteryHvThermalEvent { __typename timeStamp value } rangeThreshold { __typename timeStamp value } distanceToEmpty { __typename timeStamp value } otaAvailableVersionNumber { __typename timeStamp value } otaAvailableVersionWeek { __typename timeStamp value } otaAvailableVersionYear { __typename timeStamp value } otaCurrentVersionNumber { __typename timeStamp value } otaCurrentVersionWeek { __typename timeStamp value } otaCurrentVersionYear { __typename timeStamp value } otaDownloadProgress { __typename timeStamp value } otaInstallDuration { __typename timeStamp value } otaInstallProgress { __typename timeStamp value } otaInstallReady { __typename timeStamp value } otaInstallTime { __typename timeStamp value } otaInstallType { __typename timeStamp value } otaStatus { __typename timeStamp value } otaCurrentStatus { __typename timeStamp value } cabinClimateInteriorTemperature { __typename timeStamp value } cabinPreconditioningStatus { __typename timeStamp value } cabinPreconditioningType { __typename timeStamp value } petModeStatus { __typename timeStamp value } petModeTemperatureStatus { __typename timeStamp value } cabinClimateDriverTemperature { __typename timeStamp value } gearGuardVideoStatus { __typename timeStamp value } gearGuardVideoMode { __typename timeStamp value } gearGuardVideoTermsAccepted { __typename timeStamp value } defrostDefogStatus { __typename timeStamp value } steeringWheelHeat { __typename timeStamp value } seatFrontLeftHeat { __typename timeStamp value } seatFrontRightHeat { __typename timeStamp value } seatRearLeftHeat { __typename timeStamp value } seatRearRightHeat { __typename timeStamp value } chargerStatus { __typename timeStamp value } seatFrontLeftVent { __typename timeStamp value } seatFrontRightVent { __typename timeStamp value } chargerDerateStatus { __typename timeStamp value } driveMode { __typename timeStamp value } } }" - - if minimal: - query = "query GetVehicleState($vehicleID: String!) { vehicleState(id: $vehicleID) { " \ - "cloudConnection { lastSync } " \ - "powerState { value } " \ - "driveMode { value } " \ - "gearStatus { value } " \ - "vehicleMileage { value } " \ - "batteryLevel { value } " \ - "distanceToEmpty { value } " \ - "gnssLocation { latitude longitude } " \ - "gnssSpeed { value } " \ - "chargerStatus { value } " \ - "chargerState { value } " \ - "batteryLimit { value } " \ - "timeToEndOfCharge { value } " \ - "} }" - else: - query = "query GetVehicleState($vehicleID: String!) { " \ - "vehicleState(id: $vehicleID) { __typename " \ - "cloudConnection { __typename lastSync } " \ - "gnssLocation { __typename latitude longitude timeStamp } " \ - "gnssSpeed { __typename timeStamp value } " \ - "gnssBearing { __typename timeStamp value } " \ - "alarmSoundStatus { __typename timeStamp value } " \ - "timeToEndOfCharge { __typename timeStamp value } " \ - "doorFrontLeftLocked { __typename timeStamp value } " \ - "doorFrontLeftClosed { __typename timeStamp value } " \ - "doorFrontRightLocked { __typename timeStamp value } " \ - "doorFrontRightClosed { __typename timeStamp value } " \ - "doorRearLeftLocked { __typename timeStamp value } " \ - "doorRearLeftClosed { __typename timeStamp value } " \ - "doorRearRightLocked { __typename timeStamp value } " \ - "doorRearRightClosed { __typename timeStamp value } " \ - "windowFrontLeftClosed { __typename timeStamp value } " \ - "windowFrontRightClosed { __typename timeStamp value } " \ - "windowRearLeftClosed { __typename timeStamp value } " \ - "windowRearRightClosed { __typename timeStamp value } " \ - "windowFrontLeftCalibrated { __typename timeStamp value } " \ - "windowFrontRightCalibrated { __typename timeStamp value } " \ - "windowRearLeftCalibrated { __typename timeStamp value } " \ - "windowRearRightCalibrated { __typename timeStamp value } " \ - "closureFrunkLocked { __typename timeStamp value } " \ - "closureFrunkClosed { __typename timeStamp value } " \ - "gearGuardLocked { __typename timeStamp value } " \ - "closureLiftgateLocked { __typename timeStamp value } " \ - "closureLiftgateClosed { __typename timeStamp value } " \ - "windowRearLeftClosed { __typename timeStamp value } " \ - "windowRearRightClosed { __typename timeStamp value } " \ - "closureSideBinLeftLocked { __typename timeStamp value } " \ - "closureSideBinLeftClosed { __typename timeStamp value } " \ - "closureSideBinRightLocked { __typename timeStamp value } " \ - "closureSideBinRightClosed { __typename timeStamp value } " \ - "closureTailgateLocked { __typename timeStamp value } " \ - "closureTailgateClosed { __typename timeStamp value } " \ - "closureTonneauLocked { __typename timeStamp value } " \ - "closureTonneauClosed { __typename timeStamp value } " \ - "wiperFluidState { __typename timeStamp value } " \ - "powerState { __typename timeStamp value } " \ - "batteryHvThermalEventPropagation { __typename timeStamp value } " \ - "vehicleMileage { __typename timeStamp value } " \ - "brakeFluidLow { __typename timeStamp value } " \ - "gearStatus { __typename timeStamp value } " \ - "tirePressureStatusFrontLeft { __typename timeStamp value } " \ - "tirePressureStatusValidFrontLeft { __typename timeStamp value } " \ - "tirePressureStatusFrontRight { __typename timeStamp value } " \ - "tirePressureStatusValidFrontRight { __typename timeStamp value } " \ - "tirePressureStatusRearLeft { __typename timeStamp value } " \ - "tirePressureStatusValidRearLeft { __typename timeStamp value } " \ - "tirePressureStatusRearRight { __typename timeStamp value } " \ - "tirePressureStatusValidRearRight { __typename timeStamp value } " \ - "batteryLevel { __typename timeStamp value } " \ - "chargerState { __typename timeStamp value } " \ - "batteryLimit { __typename timeStamp value } " \ - "batteryCapacity { __typename timeStamp value } " \ - "remoteChargingAvailable { __typename timeStamp value } " \ - "batteryHvThermalEvent { __typename timeStamp value } " \ - "rangeThreshold { __typename timeStamp value } " \ - "distanceToEmpty { __typename timeStamp value } " \ - "otaAvailableVersion { __typename timeStamp value } " \ - "otaAvailableVersionWeek { __typename timeStamp value } " \ - "otaAvailableVersionYear { __typename timeStamp value } " \ - "otaCurrentVersion { __typename timeStamp value } " \ - "otaCurrentVersionNumber { __typename timeStamp value } " \ - "otaCurrentVersionWeek { __typename timeStamp value } " \ - "otaCurrentVersionYear { __typename timeStamp value } " \ - "otaDownloadProgress { __typename timeStamp value } " \ - "otaInstallDuration { __typename timeStamp value } " \ - "otaInstallProgress { __typename timeStamp value } " \ - "otaInstallReady { __typename timeStamp value } " \ - "otaInstallTime { __typename timeStamp value } " \ - "otaInstallType { __typename timeStamp value } " \ - "otaStatus { __typename timeStamp value } " \ - "otaCurrentStatus { __typename timeStamp value } " \ - "cabinClimateInteriorTemperature { __typename timeStamp value } " \ - "cabinPreconditioningStatus { __typename timeStamp value } " \ - "cabinPreconditioningType { __typename timeStamp value } " \ - "petModeStatus { __typename timeStamp value } " \ - "petModeTemperatureStatus { __typename timeStamp value } " \ - "cabinClimateDriverTemperature { __typename timeStamp value } " \ - "gearGuardVideoStatus { __typename timeStamp value } " \ - "gearGuardVideoMode { __typename timeStamp value } " \ - "gearGuardVideoTermsAccepted { __typename timeStamp value } " \ - "defrostDefogStatus { __typename timeStamp value } " \ - "steeringWheelHeat { __typename timeStamp value } " \ - "seatFrontLeftHeat { __typename timeStamp value } " \ - "seatFrontRightHeat { __typename timeStamp value } " \ - "seatRearLeftHeat { __typename timeStamp value } " \ - "seatRearRightHeat { __typename timeStamp value } " \ - "chargerStatus { __typename timeStamp value } " \ - "seatFrontLeftVent { __typename timeStamp value } " \ - "seatFrontRightVent { __typename timeStamp value } " \ - "chargerDerateStatus { __typename timeStamp value } " \ - "driveMode { __typename timeStamp value } " \ - "} }" - query = "query GetVehicleState($vehicleID: String!) { vehicleState(id: $vehicleID) { __typename gnssLocation { __typename latitude longitude timeStamp } alarmSoundStatus { __typename timeStamp value } timeToEndOfCharge { __typename timeStamp value } doorFrontLeftLocked { __typename timeStamp value } doorFrontLeftClosed { __typename timeStamp value } doorFrontRightLocked { __typename timeStamp value } doorFrontRightClosed { __typename timeStamp value } doorRearLeftLocked { __typename timeStamp value } doorRearLeftClosed { __typename timeStamp value } doorRearRightLocked { __typename timeStamp value } doorRearRightClosed { __typename timeStamp value } windowFrontLeftClosed { __typename timeStamp value } windowFrontRightClosed { __typename timeStamp value } windowFrontLeftCalibrated { __typename timeStamp value } windowFrontRightCalibrated { __typename timeStamp value } windowRearLeftCalibrated { __typename timeStamp value } windowRearRightCalibrated { __typename timeStamp value } closureFrunkLocked { __typename timeStamp value } closureFrunkClosed { __typename timeStamp value } gearGuardLocked { __typename timeStamp value } closureLiftgateLocked { __typename timeStamp value } closureLiftgateClosed { __typename timeStamp value } windowRearLeftClosed { __typename timeStamp value } windowRearRightClosed { __typename timeStamp value } closureSideBinLeftLocked { __typename timeStamp value } closureSideBinLeftClosed { __typename timeStamp value } closureSideBinRightLocked { __typename timeStamp value } closureSideBinRightClosed { __typename timeStamp value } closureTailgateLocked { __typename timeStamp value } closureTailgateClosed { __typename timeStamp value } closureTonneauLocked { __typename timeStamp value } closureTonneauClosed { __typename timeStamp value } wiperFluidState { __typename timeStamp value } powerState { __typename timeStamp value } batteryHvThermalEventPropagation { __typename timeStamp value } vehicleMileage { __typename timeStamp value } brakeFluidLow { __typename timeStamp value } gearStatus { __typename timeStamp value } tirePressureStatusFrontLeft { __typename timeStamp value } tirePressureStatusValidFrontLeft { __typename timeStamp value } tirePressureStatusFrontRight { __typename timeStamp value } tirePressureStatusValidFrontRight { __typename timeStamp value } tirePressureStatusRearLeft { __typename timeStamp value } tirePressureStatusValidRearLeft { __typename timeStamp value } tirePressureStatusRearRight { __typename timeStamp value } tirePressureStatusValidRearRight { __typename timeStamp value } batteryLevel { __typename timeStamp value } chargerState { __typename timeStamp value } batteryLimit { __typename timeStamp value } remoteChargingAvailable { __typename timeStamp value } batteryHvThermalEvent { __typename timeStamp value } rangeThreshold { __typename timeStamp value } distanceToEmpty { __typename timeStamp value } otaAvailableVersionNumber { __typename timeStamp value } otaAvailableVersionWeek { __typename timeStamp value } otaAvailableVersionYear { __typename timeStamp value } otaCurrentVersionNumber { __typename timeStamp value } otaCurrentVersionWeek { __typename timeStamp value } otaCurrentVersionYear { __typename timeStamp value } otaDownloadProgress { __typename timeStamp value } otaInstallDuration { __typename timeStamp value } otaInstallProgress { __typename timeStamp value } otaInstallReady { __typename timeStamp value } otaInstallTime { __typename timeStamp value } otaInstallType { __typename timeStamp value } otaStatus { __typename timeStamp value } otaCurrentStatus { __typename timeStamp value } cabinClimateInteriorTemperature { __typename timeStamp value } cabinPreconditioningStatus { __typename timeStamp value } cabinPreconditioningType { __typename timeStamp value } petModeStatus { __typename timeStamp value } petModeTemperatureStatus { __typename timeStamp value } cabinClimateDriverTemperature { __typename timeStamp value } gearGuardVideoStatus { __typename timeStamp value } gearGuardVideoMode { __typename timeStamp value } gearGuardVideoTermsAccepted { __typename timeStamp value } defrostDefogStatus { __typename timeStamp value } steeringWheelHeat { __typename timeStamp value } seatFrontLeftHeat { __typename timeStamp value } seatFrontRightHeat { __typename timeStamp value } seatRearLeftHeat { __typename timeStamp value } seatRearRightHeat { __typename timeStamp value } chargerStatus { __typename timeStamp value } seatFrontLeftVent { __typename timeStamp value } seatFrontRightVent { __typename timeStamp value } chargerDerateStatus { __typename timeStamp value } driveMode { __typename timeStamp value } } }" - - query = { - "operationName": "GetVehicleState", - "query": query, - "variables": { - 'vehicleID': vehicle_id, - }, - } - - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - return response.json() - - def get_vehicle_last_connection(self, vehicle_id): - headers = self.gateway_headers() - query = { - "operationName": "GetVehicleLastConnection", - "query": "query GetVehicleLastConnection($vehicleID: String!) { vehicleState(id: $vehicleID) { __typename cloudConnection { __typename lastSync } } }", - "variables": { - 'vehicleID': vehicle_id, - }, - } - - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - print(response) - return response.json() - - def plan_trip(self, vehicle_id, starting_soc, starting_range_meters, origin_lat, origin_long, dest_lat, dest_long): - headers = self.gateway_headers() - query = { - "operationName": "planTrip", - "query": "query planTrip($origin: CoordinatesInput!, $destination: CoordinatesInput!, $bearing: Float!, $vehicleId: String!, $startingSoc: Float!, $startingRangeMeters: Float!) { planTrip(bearing: $bearing, vehicleId: $vehicleId, startingSoc: $startingSoc, origin: $origin, destination: $destination, startingRangeMeters: $startingRangeMeters) { routes { routeResponse destinationReached totalChargingDuration arrivalSOC arrivalReachableDistance waypoints { waypointType entityId name latitude longitude maxPower chargeDuration arrivalSOC arrivalReachableDistance departureSOC departureReachableDistance } energyConsumptionOnLeg batteryEmptyToDestinationDistance batteryEmptyLocationLatitude batteryEmptyLocationLongitude } tripPlanStatus chargeStationsAvailable socBelowLimit } }", - "variables": { - 'origin': { - 'latitude': origin_lat, - 'longitude': origin_long, - }, - 'destination': { - 'latitude': dest_lat, - 'longitude': dest_long, - }, - 'bearing': 0, - 'vehicleId': vehicle_id, - 'startingRangeMeters': starting_range_meters, - 'startingSoc': starting_soc, - }, - } - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - return response.json() - - def get_ota_details(self, vehicle_id): - headers = self.gateway_headers() - query = { - "operationName": "GetVehicle", - "query": "query GetVehicle($vehicleId: String!) { getVehicle(id: $vehicleId) { availableOTAUpdateDetails { url version locale } currentOTAUpdateDetails { url version locale } } }", - "variables": { - 'vehicleId': vehicle_id, - }, - } - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - return response.json() - - def check_by_rivian_id(self): - headers = self.transaction_headers() - query = { - "operationName": "CheckByRivianId", - "query": "query CheckByRivianId { chargepoint { checkByRivianId } }", - "variables": {}, - } - response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) - return response.json() - - def get_linked_email_for_rivian_id(self): - headers = self.transaction_headers() - query = { - "operationName": "getLinkedEmailForRivianId", - "query": "query getLinkedEmailForRivianId { chargepoint { getLinkedEmailForRivianId { email } } }", - "variables": {}, - } - response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) - return response.json() - - def get_parameter_store_values(self): - headers = self.transaction_headers() - query = { - "operationName": "getParameterStoreValues", - "query": "query getParameterStoreValues($keys: [String!]!) { getParameterStoreValues(keys: $keys) { key value } }", - "variables": { - "keys": ["FF_ACCOUNT_ESTIMATED_DELIVERY_WINDOW_STATIC_MSG"] - }, - } - response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) - return response.json() - - def get_vehicle(self, vehicle_id): - headers = self.gateway_headers() - query = { - "operationName": "GetVehicle", - "query": "query GetVehicle($getVehicleId: String) { getVehicle(id: $getVehicleId) { invitedUsers { __typename ... on ProvisionedUser { devices { type mappedIdentityId id hrid deviceName isPaired isEnabled } firstName lastName email roles userId } ... on UnprovisionedUser { email inviteId status } } } }", - "variables": { - "getVehicleId": vehicle_id - }, - } - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - return response.json() - - def get_registered_wallboxes(self): - headers = self.gateway_headers() - query = { - "operationName": "getRegisteredWallboxes", - "variables": {}, - "query": "query getRegisteredWallboxes { getRegisteredWallboxes { __typename wallboxId userId wifiId name linked latitude longitude chargingStatus power currentVoltage currentAmps softwareVersion model serialNumber maxPower maxVoltage maxAmps } }" - } - response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) - return response.json() - - def get_provisioned_camp_speakers(self): - headers = self.gateway_headers() - query = { - "operationName": "GetProvisionedCampSpeakers", - "query": "query GetProvisionedCampSpeakers { currentUser { __typename vehicles { __typename id connectedProducts { __typename ... on CampSpeaker { serialNumber id } } } } }", - "variables": {}, - } - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - return response.json() - - def get_vehicle_images(self): - headers = self.gateway_headers() - query = { - "operationName": "getVehicleImages", - "query": "query getVehicleImages($extension: String!, $resolution: String!) { getVehicleOrderMobileImages(resolution: $resolution, extension: $extension) { __typename orderId url resolution size design placement } getVehicleMobileImages(resolution: $resolution, extension: $extension) { __typename vehicleId url resolution size design placement } }", - "variables": { - "extension": "webp", - "resolution": "hdpi" - }, - } - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - return response.json() - - def user(self): - headers = self.gateway_headers() - query = { - "operationName": "user", - # "query": "query user { user { email { email } phone { formatted } firstName lastName addresses { id type line1 line2 city state country postalCode } newsletterSubscription smsSubscription registrationChannels2FA userId vehicles {id highestPriorityRole __typename } orderSnapshots(filterTypes: [PRE_ORDER, VEHICLE]) { ...OrderSnapshotsFragment __typename } __typename }} fragment OrderSnapshotsFragment on OrderSnapshot { id total paidTotal subtotal state configurationStatus currency orderDate type fulfillmentSummaryStatus items { id total unitPrice quantity productDetails { ... on VehicleProduct { sku store { country __typename } __typename } ... on StandaloneProduct { sku store { country __typename } __typename } ... on ChildProduct { sku store { country __typename } __typename } __typename } configuration { basePrice ruleset { meta { locale currency country vehicle version rulesetId effectiveDate __typename } groups rules specs options defaults { basePrice initialSelection __typename } __typename } options { optionId groupId price optionDetails { name attrs price visualExterior visualInterior __typename } __typename } __typename } __typename } __typename } } } ", - "query": "query user { user { email { email } phone { formatted } firstName lastName addresses { id type line1 line2 city state country postalCode } newsletterSubscription smsSubscription registrationChannels2FA userId vehicles {id highestPriorityRole __typename } invites (filterStates: [PENDING]) {id inviteState vehicleModel vehicleId creatorFirstName} orderSnapshots(filterTypes: [PRE_ORDER, VEHICLE, RETAIL]) { ...OrderSnapshotsFragment } }} fragment OrderSnapshotsFragment on OrderSnapshot { id total paidTotal subtotal state configurationStatus currency orderDate type fulfillmentSummaryStatus }", - "variables": {}, - } - response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) - return response.json() - - def get_charging_schedule(self, vehicle_id): - headers = self.gateway_headers() - query = { - "operationName": "GetChargingSchedule", - "query": "query GetChargingSchedule($vehicleId: String!) { getVehicle(id: $vehicleId) { chargingSchedules { startTime duration location { latitude longitude } amperage enabled weekDays } } }", - "variables": { - "vehicleId": vehicle_id - }, - } - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - return response.json() - - - - def get_completed_session_summaries(self): - headers = self.gateway_headers() - query = { - "operationName": "getCompletedSessionSummaries", - "query": "query getCompletedSessionSummaries { getCompletedSessionSummaries { chargerType currencyCode paidTotal startInstant endInstant totalEnergyKwh rangeAddedKm city transactionId vehicleId vehicleName vendor isRoamingNetwork isPublic isHomeCharger meta { transactionIdGroupingKey dataSources } }}", - "variables": {}, - } - response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) - return response.json() - - - def get_charging_session_status(self, job_id, user_id): - headers = self.gateway_headers() - query = { - "operationName": "GetChargingSessionStatus", - "query": "query GetChargingSessionStatus($jobId: ID!, $userId: ID!) { getSessionStatus(jobId: $jobId, userId: $userId) { status errorMessage errorId sessionId } }", - "variables": { - "jobId": "123", - "userId": "123" - }, - } - response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) - return response.json() - - - def get_non_rivian_user_session(self): - headers = self.gateway_headers() - query = { - "operationName": "getNonRivianUserSession", - "query": "query getNonRivianUserSession { getNonRivianUserSession { chargerId transactionId isRivianCharger vehicleChargerState { value updatedAt } } }", - "variables": {}, - } - response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) - return response.json() - - def get_live_session_data(self, vehicle_id): - headers = self.gateway_headers() - query = { - "operationName": "getLiveSessionData", - "query": "query getLiveSessionData($vehicleId: ID) " - "{ getLiveSessionData(vehicleId: $vehicleId) " - "{ isRivianCharger isFreeSession vehicleChargerState { value updatedAt } " - "chargerId startTime timeElapsed timeRemaining { value updatedAt } kilometersChargedPerHour " - "{ value updatedAt } power { value updatedAt } rangeAddedThisSession { value updatedAt } " - "totalChargedEnergy { value updatedAt } timeRemaining { value updatedAt } vehicleChargerState " - "{ value updatedAt } kilometersChargedPerHour { value updatedAt } " - "currentPrice soc { value } currentMiles { value } current { value } } }", - "variables": { - "vehicleId": vehicle_id - }, - } - response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) - return response.json() - - - def get_live_session_history(self, vehicle_id): - headers = self.gateway_headers() - query = { - "operationName": "getLiveSessionHistory", - "query": "query getLiveSessionHistory($vehicleId: ID) { getLiveSessionHistory(vehicleId: $vehicleId) { chartData { kw time } } }", - "variables": { - "vehicleId": vehicle_id - }, - } - response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) - return response.json() - - - # Vehicle commands require an HMAC signature to be sent with the request. - # The HMAC is generated using the command name and the current timestamp, - # using a shared key generated from the phone’s private key and the vehicle’s - # public key. The vehicle’s public key is available in the vehiclePublicKey - # field of the getUserInfo endpoint. - def send_vehicle_command(self, vehicle_id, command, vasPhoneId, deviceId, vehiclePublicKey): - headers = self.gateway_headers() - - query = { - "operationName": "sendVehicleCommand", - "query": "mutation sendVehicleCommand($attrs: VehicleCommandAttributes!) { sendVehicleCommand(attrs: $attrs) { __typename id command state } }", - "variables": { - "attrs": { - "command": command, - "hmac": 0, #your-hmac - "timestamp": time.time(), - "vasPhoneId": vasPhoneId, - "deviceId": deviceId, - "vehicleId": vehicle_id, - } - }, - } - response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) - return response.json() +{"payload":{"allShortcutsEnabled":false,"fileTree":{"src/rivian_python_api":{"items":[{"name":"__init__.py","path":"src/rivian_python_api/__init__.py","contentType":"file"},{"name":"rivian_api.py","path":"src/rivian_python_api/rivian_api.py","contentType":"file"},{"name":"rivian_cli.py","path":"src/rivian_python_api/rivian_cli.py","contentType":"file"},{"name":"rivian_map.py","path":"src/rivian_python_api/rivian_map.py","contentType":"file"}],"totalCount":4},"src":{"items":[{"name":"rivian_python_api","path":"src/rivian_python_api","contentType":"directory"}],"totalCount":1},"":{"items":[{"name":"bin","path":"bin","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":"tests","path":"tests","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".python-version","path":".python-version","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"pyproject.toml","path":"pyproject.toml","contentType":"file"},{"name":"requirements.txt","path":"requirements.txt","contentType":"file"},{"name":"techstack.md","path":"techstack.md","contentType":"file"},{"name":"techstack.yml","path":"techstack.yml","contentType":"file"}],"totalCount":11}},"fileTreeProcessingTime":15.464704,"foldersToFetch":[],"repo":{"id":606545184,"defaultBranch":"main","name":"rivian-python-api","ownerLogin":"the-mace","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2023-02-25T20:13:01.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/2512112?v=4","public":true,"private":false,"isOrgOwned":false},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"main","listCacheKey":"v0:1709235417.0","canEdit":false,"refType":"branch","currentOid":"ae750816879b45f7ba5b9c791c8a65d36a5179ee"},"path":"src/rivian_python_api/rivian_api.py","currentUser":null,"blob":{"rawLines":["import logging","import requests","import uuid","import time","","RIVIAN_BASE_PATH = \"https://rivian.com/api/gql\"","RIVIAN_GATEWAY_PATH = RIVIAN_BASE_PATH + \"/gateway/graphql\"","RIVIAN_CHARGING_PATH = RIVIAN_BASE_PATH + \"/chrg/user/graphql\"","RIVIAN_ORDERS_PATH = RIVIAN_BASE_PATH + '/orders/graphql'","RIVIAN_CONTENT_PATH = RIVIAN_BASE_PATH + '/content/graphql'","RIVIAN_TRANSACTIONS_PATH = RIVIAN_BASE_PATH + '/t2d/graphql'","","log = logging.getLogger(__name__)","","HEADERS = {"," \"User-Agent\": \"RivianApp/1304 CFNetwork/1404.0.5 Darwin/22.3.0\","," \"Accept\": \"application/json\","," \"Content-Type\": \"application/json\","," \"Apollographql-Client-Name\": \"com.rivian.ios.consumer-apollo-ios\",","}","","","class Rivian:"," def __init__(self):"," self._close_session = False"," self._session_token = \"\""," self._access_token = \"\""," self._refresh_token = \"\""," self._app_session_token = \"\""," self._user_session_token = \"\""," self.client_id = \"\""," self.client_secret = \"\""," self.request_timeout = \"\""," self._csrf_token = \"\"",""," self.otp_needed = False"," self._otp_token = \"\"",""," def login(self, username, password):"," self.create_csrf_token()"," url = RIVIAN_GATEWAY_PATH"," headers = HEADERS"," headers.update("," {"," \"Csrf-Token\": self._csrf_token,"," \"A-Sess\": self._app_session_token,"," \"Apollographql-Client-Name\": \"com.rivian.ios.consumer-apollo-ios\","," \"Dc-Cid\": f\"m-ios-{uuid.uuid4()}\","," }"," )",""," query = {"," \"operationName\": \"Login\","," \"query\": \"mutation Login($email: String!, $password: String!) {\\n login(email: $email, password: $password) {\\n __typename\\n ... on MobileLoginResponse {\\n __typename\\n accessToken\\n refreshToken\\n userSessionToken\\n }\\n ... on MobileMFALoginResponse {\\n __typename\\n otpToken\\n }\\n }\\n}\","," \"variables\": {\"email\": username, \"password\": password},"," }",""," response = self.raw_graphql_query(url=url, query=query, headers=headers)"," response_json = response.json()"," if response.status_code == 200 and response_json[\"data\"] and \"login\" in response_json[\"data\"]:"," login_data = response_json[\"data\"][\"login\"]"," if \"otpToken\" in login_data:"," self.otp_needed = True"," self._otp_token = login_data[\"otpToken\"]"," else:"," self._access_token = login_data[\"accessToken\"]"," self._refresh_token = login_data[\"refreshToken\"]"," self._user_session_token = login_data[\"userSessionToken\"]"," else:"," message = f\"Status: {response.status_code}: Details: {response_json}\""," print(f\"Login failed: {message}\")"," raise Exception(message)"," return response",""," def login_with_otp(self, username, otpCode, otpToken=None):"," if self._csrf_token == \"\":"," self.create_csrf_token()"," url = RIVIAN_GATEWAY_PATH"," headers = HEADERS"," headers.update("," {"," \"Csrf-Token\": self._csrf_token,"," \"A-Sess\": self._app_session_token,"," \"Apollographql-Client-Name\": \"com.rivian.ios.consumer-apollo-ios\","," }"," )",""," query = {"," \"operationName\": \"LoginWithOTP\","," \"query\": \"mutation LoginWithOTP($email: String!, $otpCode: String!, $otpToken: String!) {\\n loginWithOTP(email: $email, otpCode: $otpCode, otpToken: $otpToken) {\\n __typename\\n ... on MobileLoginResponse {\\n __typename\\n accessToken\\n refreshToken\\n userSessionToken\\n }\\n }\\n}\","," \"variables\": {"," \"email\": username,"," \"otpCode\": otpCode,"," \"otpToken\": otpToken or self._otp_token,"," },"," }",""," response = self.raw_graphql_query(url=url, query=query, headers=headers)"," response_json = response.json()"," if response.status_code == 200 and response_json[\"data\"] and \"loginWithOTP\" in response_json[\"data\"]:"," login_data = response_json[\"data\"][\"loginWithOTP\"]"," self._access_token = login_data[\"accessToken\"]"," self._refresh_token = login_data[\"refreshToken\"]"," self._user_session_token = login_data[\"userSessionToken\"]"," else:"," message = f\"Status: {response.status_code}: Details: {response_json}\""," print(f\"Login with otp failed: {message}\")"," raise Exception(message)"," return response",""," def create_csrf_token(self):"," url = RIVIAN_GATEWAY_PATH"," headers = HEADERS",""," query = {"," \"operationName\": \"CreateCSRFToken\","," \"query\": \"mutation CreateCSRFToken {createCsrfToken {__typename csrfToken appSessionToken}}\","," \"variables\": None,"," }",""," response = self.raw_graphql_query(url=url, query=query, headers=headers)"," response_json = response.json()"," csrf_data = response_json[\"data\"][\"createCsrfToken\"]"," self._csrf_token = csrf_data[\"csrfToken\"]"," self._app_session_token = csrf_data[\"appSessionToken\"]"," return response",""," def raw_graphql_query(self, url, query, headers):"," response = requests.post(url, json=query, headers=headers)"," if response.status_code != 200:"," log.warning(f\"Graphql error: Response status: {response.status_code} Reason: {response.reason}\")"," return response",""," def gateway_headers(self):"," headers = HEADERS"," headers.update("," {"," \"Csrf-Token\": self._csrf_token,"," \"A-Sess\": self._app_session_token,"," \"U-Sess\": self._user_session_token,"," \"Dc-Cid\": f\"m-ios-{uuid.uuid4()}\","," }"," )"," return headers",""," def transaction_headers(self):"," headers = self.gateway_headers()"," headers.update("," {"," \"dc-cid\": f\"t2d--{uuid.uuid4()}--{uuid.uuid4()}\","," \"csrf-token\": self._csrf_token,"," \"app-id\": \"t2d\""," }"," )"," return headers",""," def vehicle_orders(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"vehicleOrders\","," \"query\": \"query vehicleOrders { orders(input: {orderTypes: [PRE_ORDER, VEHICLE], pageInfo: {from: 0, size: 10000}}) { __typename data { __typename id orderDate state configurationStatus fulfillmentSummaryStatus items { __typename sku } consumerStatuses { __typename isConsumerFlowComplete } } } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def delivery(self, order_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"delivery\","," \"query\": \"query delivery($orderId: ID!) { delivery(orderId: $orderId) { __typename status carrier deliveryAddress { __typename addressLine1 addressLine2 city state country zipcode } appointmentDetails { __typename appointmentId startDateTime endDateTime timeZone } vehicleVIN } }\","," \"variables\": {"," \"orderId\": order_id,"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def transaction_status(self, order_id):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"transactionStatus\","," \"query\": \"query transactionStatus($orderId: ID!) { transactionStatus(orderId: $orderId) { titleAndReg { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } tradeIn { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } finance { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } delivery { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } insurance { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } documentUpload { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } contracts { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } payment { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } } }\","," \"variables\": {"," \"orderId\": order_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_TRANSACTIONS_PATH, query=query, headers=headers)"," return response.json()",""," def finance_summary(self, order_id):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"financeSummary\","," \"query\": \"query financeSummary($orderId: ID!) { ...FinanceSummaryFragment } fragment FinanceSummaryFragment on Query { financeSummary(orderId: $orderId) { orderId status financeChoice { financeChoice institutionName paymentMethod trackingNumber preApprovedAmount loanOfficerName loanOfficerContact downPayment rate term rateAndTermSkipped } } }\","," \"variables\": {\"orderId\": order_id},"," }"," response = self.raw_graphql_query(url=RIVIAN_TRANSACTIONS_PATH, query=query, headers=headers)"," return response.json()",""," def order(self, order_id):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"order\","," \"query\": \"query order($id: String!) { order(id: $id) { vin state billingAddress { firstName lastName line1 line2 city state country postalCode } shippingAddress { firstName lastName line1 line2 city state country postalCode } orderCancelDate orderEmail currency locale storeId type subtotal discountTotal taxTotal feesTotal paidTotal remainingTotal outstandingBalance costAfterCredits total payments { id intent date method amount referenceNumber status card { last4 expiryDate brand } bank { bankName country last4 } transactionNotes } tradeIns { tradeInReferenceId amount } vehicle { vehicleId vin modelYear model make } items { id discounts { total items { amount title code } } subtotal quantity title productId type unitPrice fees { items { description amount code type } total } taxes { items { description amount code rate type } total } sku shippingAddress { firstName lastName line1 line2 city state country postalCode } configuration { ruleset { meta { rulesetId storeId country vehicle version effectiveDate currency locale availableLocales } defaults { basePrice initialSelection } groups options specs rules } basePrice version options { optionId optionName optionDetails { name attrs price visualExterior visualInterior hidden disabled required } groupId groupName groupDetails { name attrs multiselect required options } price } } } }}\","," \"variables\": {\"id\": order_id},"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def retail_orders(self):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"searchOrders\","," \"query\": \"query searchOrders($input: UserOrderSearchInput!) { searchOrders(input: $input) { total data { id type orderDate state fulfillmentSummaryStatus items { id title type sku __typename } __typename } __typename }}\","," \"variables\": {"," \"input\": {"," \"orderTypes\": [\"RETAIL\"],"," \"orderStates\": None,"," \"pageInfo\": {"," \"from\": 0,"," \"size\": 5"," },"," \"dateRange\": None,"," \"sortFields\": {"," \"orderDate\": \"DESC\""," }"," }"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def get_order(self, order_id):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"getOrder\","," \"query\": \"query getOrder($orderId: String!) { order(id: $orderId) { id storeId userId orderDate orderCancelDate type state currency locale subtotal discountTotal taxTotal total shippingAddress { firstName lastName line1 line2 city state country postalCode __typename } payments { method currency status type card { last4 expiryDate brand __typename } __typename } items { id title type sku unitPrice quantity state productDetails { ... on ChildProduct { dimensionValues { name valueName localizedStrings __typename } __typename } __typename } __typename } fulfillmentSummaryStatus fulfillmentInfo { fulfillments { fulfillmentId fulfillmentStatus fulfillmentMethod fulfillmentVendor tracking { status carrier number url shipDate deliveredDate serviceType __typename } estimatedDeliveryWindow { startDate endDate __typename } items { orderItemId quantityFulfilled isPartialFulfillment __typename } __typename } pendingFulfillmentItems { orderItemId quantity __typename } __typename } __typename }}\","," \"variables\": {"," \"orderId\": order_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def payment_methods(self):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"paymentMethods\","," \"query\": \"query paymentMethods { paymentMethods { id type default card { lastFour brand expiration postalCode } } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def get_user_information(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getUserInfo\","," \"query\": \"query getUserInfo { currentUser { __typename id firstName lastName email address { __typename country } vehicles { __typename id name owner roles vin vas { __typename vasVehicleId vehiclePublicKey } state createdAt updatedAt vehicle { __typename id vin modelYear make model expectedBuildDate plannedBuildDate expectedGeneralAssemblyStartDate actualGeneralAssemblyDate mobileConfiguration { __typename trimOption { __typename optionId optionName } exteriorColorOption { __typename optionId optionName } interiorColorOption { __typename optionId optionName } } vehicleState { __typename supportedFeatures { __typename name status } } otaEarlyAccessStatus } settings { __typename name { __typename value } } } enrolledPhones { __typename vas { __typename vasPhoneId publicKey } enrolled { __typename deviceType deviceName vehicleId identityId shortName } } pendingInvites { __typename id invitedByFirstName role status vehicleId vehicleModel email } } }\","," # \"query\": \"query getUserInfo {currentUser {__typename id firstName lastName email address { __typename country } vehicles {id name owner roles vin vas {__typename vasVehicleId vehiclePublicKey } state createdAt updatedAt vehicle { __typename id vin modelYear make model expectedBuildDate plannedBuildDate expectedGeneralAssemblyStartDate actualGeneralAssemblyDate } } }}\","," \"variables\": None,"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def get_vehicle_state(self, vehicle_id, minimal=False):"," headers = self.gateway_headers()"," if minimal:"," query = \"query GetVehicleState($vehicleID: String!) { vehicleState(id: $vehicleID) { \" \\"," \"cloudConnection { lastSync } \" \\"," \"powerState { value } \" \\"," \"driveMode { value } \" \\"," \"gearStatus { value } \" \\"," \"vehicleMileage { value } \" \\"," \"batteryLevel { value } \" \\"," \"distanceToEmpty { value } \" \\"," \"gnssLocation { latitude longitude } \" \\"," \"gnssSpeed { value } \" \\"," \"chargerStatus { value } \" \\"," \"chargerState { value } \" \\"," \"batteryLimit { value } \" \\"," \"timeToEndOfCharge { value } \" \\"," \"} }\""," else:"," query = \"query GetVehicleState($vehicleID: String!) { \" \\"," \"vehicleState(id: $vehicleID) { __typename \" \\"," \"cloudConnection { __typename lastSync } \" \\"," \"gnssLocation { __typename latitude longitude timeStamp } \" \\"," \"gnssSpeed { __typename timeStamp value } \" \\"," \"gnssBearing { __typename timeStamp value } \" \\"," \"gnssAltitude { __typename timeStamp value } \" \\"," \"gnssError { __typename timeStamp positionVertical positionHorizontal speed bearing } \" \\"," \"alarmSoundStatus { __typename timeStamp value } \" \\"," \"timeToEndOfCharge { __typename timeStamp value } \" \\"," \"doorFrontLeftLocked { __typename timeStamp value } \" \\"," \"doorFrontLeftClosed { __typename timeStamp value } \" \\"," \"doorFrontRightLocked { __typename timeStamp value } \" \\"," \"doorFrontRightClosed { __typename timeStamp value } \" \\"," \"doorRearLeftLocked { __typename timeStamp value } \" \\"," \"doorRearLeftClosed { __typename timeStamp value } \" \\"," \"doorRearRightLocked { __typename timeStamp value } \" \\"," \"doorRearRightClosed { __typename timeStamp value } \" \\"," \"windowFrontLeftClosed { __typename timeStamp value } \" \\"," \"windowFrontRightClosed { __typename timeStamp value } \" \\"," \"windowRearLeftClosed { __typename timeStamp value } \" \\"," \"windowRearRightClosed { __typename timeStamp value } \" \\"," \"windowFrontLeftCalibrated { __typename timeStamp value } \" \\"," \"windowFrontRightCalibrated { __typename timeStamp value } \" \\"," \"windowRearLeftCalibrated { __typename timeStamp value } \" \\"," \"windowRearRightCalibrated { __typename timeStamp value } \" \\"," \"windowsNextAction { __typename timeStamp value } \" \\"," \"closureFrunkLocked { __typename timeStamp value } \" \\"," \"closureFrunkClosed { __typename timeStamp value } \" \\"," \"closureFrunkNextAction { __typename timeStamp value } \" \\"," \"gearGuardLocked { __typename timeStamp value } \" \\"," \"closureLiftgateLocked { __typename timeStamp value } \" \\"," \"closureLiftgateClosed { __typename timeStamp value } \" \\"," \"closureLiftgateNextAction { __typename timeStamp value } \" \\"," \"windowRearLeftClosed { __typename timeStamp value } \" \\"," \"windowRearRightClosed { __typename timeStamp value } \" \\"," \"closureSideBinLeftLocked { __typename timeStamp value } \" \\"," \"closureSideBinLeftClosed { __typename timeStamp value } \" \\"," \"closureSideBinRightLocked { __typename timeStamp value } \" \\"," \"closureSideBinRightClosed { __typename timeStamp value } \" \\"," \"closureTailgateLocked { __typename timeStamp value } \" \\"," \"closureTailgateClosed { __typename timeStamp value } \" \\"," \"closureTonneauLocked { __typename timeStamp value } \" \\"," \"closureTonneauClosed { __typename timeStamp value } \" \\"," \"wiperFluidState { __typename timeStamp value } \" \\"," \"powerState { __typename timeStamp value } \" \\"," \"batteryHvThermalEventPropagation { __typename timeStamp value } \" \\"," \"vehicleMileage { __typename timeStamp value } \" \\"," \"brakeFluidLow { __typename timeStamp value } \" \\"," \"gearStatus { __typename timeStamp value } \" \\"," \"tirePressureStatusFrontLeft { __typename timeStamp value } \" \\"," \"tirePressureStatusValidFrontLeft { __typename timeStamp value } \" \\"," \"tirePressureStatusFrontRight { __typename timeStamp value } \" \\"," \"tirePressureStatusValidFrontRight { __typename timeStamp value } \" \\"," \"tirePressureStatusRearLeft { __typename timeStamp value } \" \\"," \"tirePressureStatusValidRearLeft { __typename timeStamp value } \" \\"," \"tirePressureStatusRearRight { __typename timeStamp value } \" \\"," \"tirePressureStatusValidRearRight { __typename timeStamp value } \" \\"," \"batteryLevel { __typename timeStamp value } \" \\"," \"chargerState { __typename timeStamp value } \" \\"," \"batteryLimit { __typename timeStamp value } \" \\"," \"batteryCapacity { __typename timeStamp value } \" \\"," \"remoteChargingAvailable { __typename timeStamp value } \" \\"," \"batteryHvThermalEvent { __typename timeStamp value } \" \\"," \"rangeThreshold { __typename timeStamp value } \" \\"," \"distanceToEmpty { __typename timeStamp value } \" \\"," \"otaAvailableVersion { __typename timeStamp value } \" \\"," \"otaAvailableVersionWeek { __typename timeStamp value } \" \\"," \"otaAvailableVersionYear { __typename timeStamp value } \" \\"," \"otaCurrentVersion { __typename timeStamp value } \" \\"," \"otaCurrentVersionNumber { __typename timeStamp value } \" \\"," \"otaCurrentVersionWeek { __typename timeStamp value } \" \\"," \"otaCurrentVersionYear { __typename timeStamp value } \" \\"," \"otaDownloadProgress { __typename timeStamp value } \" \\"," \"otaInstallDuration { __typename timeStamp value } \" \\"," \"otaInstallProgress { __typename timeStamp value } \" \\"," \"otaInstallReady { __typename timeStamp value } \" \\"," \"otaInstallTime { __typename timeStamp value } \" \\"," \"otaInstallType { __typename timeStamp value } \" \\"," \"otaStatus { __typename timeStamp value } \" \\"," \"otaCurrentStatus { __typename timeStamp value } \" \\"," \"cabinClimateInteriorTemperature { __typename timeStamp value } \" \\"," \"cabinPreconditioningStatus { __typename timeStamp value } \" \\"," \"cabinPreconditioningType { __typename timeStamp value } \" \\"," \"petModeStatus { __typename timeStamp value } \" \\"," \"petModeTemperatureStatus { __typename timeStamp value } \" \\"," \"cabinClimateDriverTemperature { __typename timeStamp value } \" \\"," \"gearGuardVideoStatus { __typename timeStamp value } \" \\"," \"gearGuardVideoMode { __typename timeStamp value } \" \\"," \"gearGuardVideoTermsAccepted { __typename timeStamp value } \" \\"," \"defrostDefogStatus { __typename timeStamp value } \" \\"," \"steeringWheelHeat { __typename timeStamp value } \" \\"," \"seatFrontLeftHeat { __typename timeStamp value } \" \\"," \"seatFrontRightHeat { __typename timeStamp value } \" \\"," \"seatRearLeftHeat { __typename timeStamp value } \" \\"," \"seatRearRightHeat { __typename timeStamp value } \" \\"," \"chargerStatus { __typename timeStamp value } \" \\"," \"seatFrontLeftVent { __typename timeStamp value } \" \\"," \"seatFrontRightVent { __typename timeStamp value } \" \\"," \"chargerDerateStatus { __typename timeStamp value } \" \\"," \"driveMode { __typename timeStamp value } \" \\"," \"limitedAccelCold { __typename timeStamp value } \" \\"," \"limitedRegenCold { __typename timeStamp value } \" \\"," \"twelveVoltBatteryHealth { __typename timeStamp value } \" \\"," \"serviceMode { __typename timeStamp value } \" \\"," \"trailerStatus { __typename timeStamp value } \" \\"," \"btmFfHardwareFailureStatus { __typename timeStamp value } \" \\"," \"btmIcHardwareFailureStatus { __typename timeStamp value } \" \\"," \"btmLfdHardwareFailureStatus { __typename timeStamp value } \" \\"," \"btmRfHardwareFailureStatus { __typename timeStamp value } \" \\"," \"btmRfdHardwareFailureStatus { __typename timeStamp value } \" \\"," \"carWashMode { __typename timeStamp value } \" \\"," \"chargePortState { __typename timeStamp value } \" \\"," \"chargingTimeEstimationValidity { __typename timeStamp value } \" \\"," \"rearHitchStatus { __typename timeStamp value } \" \\"," \"} }\"",""," query = {"," \"operationName\": \"GetVehicleState\","," \"query\": query,"," \"variables\": {"," 'vehicleID': vehicle_id,"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def get_vehicle_last_connection(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetVehicleLastConnection\","," \"query\": \"query GetVehicleLastConnection($vehicleID: String!) { vehicleState(id: $vehicleID) { __typename cloudConnection { __typename lastSync } } }\","," \"variables\": {"," 'vehicleID': vehicle_id,"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def plan_trip(self, vehicle_id, starting_soc, starting_range_meters, origin_lat, origin_long, dest_lat, dest_long):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"planTrip\","," \"query\": \"query planTrip($origin: CoordinatesInput!, $destination: CoordinatesInput!, $bearing: Float!, $vehicleId: String!, $startingSoc: Float!, $startingRangeMeters: Float!) { planTrip(bearing: $bearing, vehicleId: $vehicleId, startingSoc: $startingSoc, origin: $origin, destination: $destination, startingRangeMeters: $startingRangeMeters) { routes { routeResponse destinationReached totalChargingDuration arrivalSOC arrivalReachableDistance waypoints { waypointType entityId name latitude longitude maxPower chargeDuration arrivalSOC arrivalReachableDistance departureSOC departureReachableDistance } energyConsumptionOnLeg batteryEmptyToDestinationDistance batteryEmptyLocationLatitude batteryEmptyLocationLongitude } tripPlanStatus chargeStationsAvailable socBelowLimit } }\","," \"variables\": {"," 'origin': {"," 'latitude': origin_lat,"," 'longitude': origin_long,"," },"," 'destination': {"," 'latitude': dest_lat,"," 'longitude': dest_long,"," },"," 'bearing': 0,"," 'vehicleId': vehicle_id,"," 'startingRangeMeters': starting_range_meters,"," 'startingSoc': starting_soc,"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def get_ota_details(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetVehicle\","," \"query\": \"query GetVehicle($vehicleId: String!) { getVehicle(id: $vehicleId) { availableOTAUpdateDetails { url version locale } currentOTAUpdateDetails { url version locale } } }\","," \"variables\": {"," 'vehicleId': vehicle_id,"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def check_by_rivian_id(self):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"CheckByRivianId\","," \"query\": \"query CheckByRivianId { chargepoint { checkByRivianId } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()",""," def get_linked_email_for_rivian_id(self):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"getLinkedEmailForRivianId\","," \"query\": \"query getLinkedEmailForRivianId { chargepoint { getLinkedEmailForRivianId { email } } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()",""," def get_parameter_store_values(self):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"getParameterStoreValues\","," \"query\": \"query getParameterStoreValues($keys: [String!]!) { getParameterStoreValues(keys: $keys) { key value } }\","," \"variables\": {"," \"keys\": [\"FF_ACCOUNT_ESTIMATED_DELIVERY_WINDOW_STATIC_MSG\"]"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def get_vehicle(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetVehicle\","," \"query\": \"query GetVehicle($getVehicleId: String) { getVehicle(id: $getVehicleId) { invitedUsers { __typename ... on ProvisionedUser { devices { type mappedIdentityId id hrid deviceName isPaired isEnabled } firstName lastName email roles userId } ... on UnprovisionedUser { email inviteId status } } } }\","," \"variables\": {"," \"getVehicleId\": vehicle_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def get_registered_wallboxes(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getRegisteredWallboxes\","," \"variables\": {},"," \"query\": \"query getRegisteredWallboxes { getRegisteredWallboxes { __typename wallboxId userId wifiId name linked latitude longitude chargingStatus power currentVoltage currentAmps softwareVersion model serialNumber maxPower maxVoltage maxAmps } }\""," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()",""," def get_provisioned_camp_speakers(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetProvisionedCampSpeakers\","," \"query\": \"query GetProvisionedCampSpeakers { currentUser { __typename vehicles { __typename id connectedProducts { __typename ... on CampSpeaker { serialNumber id } } } } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def get_vehicle_images(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getVehicleImages\","," \"query\": \"query getVehicleImages($extension: String!, $resolution: String!) { getVehicleOrderMobileImages(resolution: $resolution, extension: $extension) { __typename orderId url resolution size design placement } getVehicleMobileImages(resolution: $resolution, extension: $extension) { __typename vehicleId url resolution size design placement } }\","," \"variables\": {"," \"extension\": \"webp\","," \"resolution\": \"hdpi\""," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def user(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"user\","," # \"query\": \"query user { user { email { email } phone { formatted } firstName lastName addresses { id type line1 line2 city state country postalCode } newsletterSubscription smsSubscription registrationChannels2FA userId vehicles {id highestPriorityRole __typename } orderSnapshots(filterTypes: [PRE_ORDER, VEHICLE]) { ...OrderSnapshotsFragment __typename } __typename }} fragment OrderSnapshotsFragment on OrderSnapshot { id total paidTotal subtotal state configurationStatus currency orderDate type fulfillmentSummaryStatus items { id total unitPrice quantity productDetails { ... on VehicleProduct { sku store { country __typename } __typename } ... on StandaloneProduct { sku store { country __typename } __typename } ... on ChildProduct { sku store { country __typename } __typename } __typename } configuration { basePrice ruleset { meta { locale currency country vehicle version rulesetId effectiveDate __typename } groups rules specs options defaults { basePrice initialSelection __typename } __typename } options { optionId groupId price optionDetails { name attrs price visualExterior visualInterior __typename } __typename } __typename } __typename } __typename } } } \","," \"query\": \"query user { user { email { email } phone { formatted } firstName lastName addresses { id type line1 line2 city state country postalCode } newsletterSubscription smsSubscription registrationChannels2FA userId vehicles {id highestPriorityRole __typename } invites (filterStates: [PENDING]) {id inviteState vehicleModel vehicleId creatorFirstName} orderSnapshots(filterTypes: [PRE_ORDER, VEHICLE, RETAIL]) { ...OrderSnapshotsFragment } }} fragment OrderSnapshotsFragment on OrderSnapshot { id total paidTotal subtotal state configurationStatus currency orderDate type fulfillmentSummaryStatus }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def get_charging_schedule(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetChargingSchedule\","," \"query\": \"query GetChargingSchedule($vehicleId: String!) { getVehicle(id: $vehicleId) { chargingSchedules { startTime duration location { latitude longitude } amperage enabled weekDays } } }\","," \"variables\": {"," \"vehicleId\": vehicle_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()","","",""," def get_completed_session_summaries(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getCompletedSessionSummaries\","," \"query\": \"query getCompletedSessionSummaries { getCompletedSessionSummaries { chargerType currencyCode paidTotal startInstant endInstant totalEnergyKwh rangeAddedKm city transactionId vehicleId vehicleName vendor isRoamingNetwork isPublic isHomeCharger meta { transactionIdGroupingKey dataSources } }}\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()","",""," def get_charging_session_status(self, job_id, user_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetChargingSessionStatus\","," \"query\": \"query GetChargingSessionStatus($jobId: ID!, $userId: ID!) { getSessionStatus(jobId: $jobId, userId: $userId) { status errorMessage errorId sessionId } }\","," \"variables\": {"," \"jobId\": \"123\","," \"userId\": \"123\""," },"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()","",""," def get_non_rivian_user_session(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getNonRivianUserSession\","," \"query\": \"query getNonRivianUserSession { getNonRivianUserSession { chargerId transactionId isRivianCharger vehicleChargerState { value updatedAt } } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()",""," def get_live_session_data(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getLiveSessionData\","," \"query\": \"query getLiveSessionData($vehicleId: ID) \""," \"{ getLiveSessionData(vehicleId: $vehicleId) \""," \"{ isRivianCharger isFreeSession vehicleChargerState { value updatedAt } \""," \"chargerId startTime timeElapsed timeRemaining { value updatedAt } kilometersChargedPerHour \""," \"{ value updatedAt } power { value updatedAt } rangeAddedThisSession { value updatedAt } \""," \"totalChargedEnergy { value updatedAt } timeRemaining { value updatedAt } vehicleChargerState \""," \"{ value updatedAt } kilometersChargedPerHour { value updatedAt } \""," \"currentPrice soc { value } currentMiles { value } current { value } } }\","," \"variables\": {"," \"vehicleId\": vehicle_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()","",""," def get_live_session_history(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getLiveSessionHistory\","," \"query\": \"query getLiveSessionHistory($vehicleId: ID) { getLiveSessionHistory(vehicleId: $vehicleId) { chartData { kw time } } }\","," \"variables\": {"," \"vehicleId\": vehicle_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()","",""," # Vehicle commands require an HMAC signature to be sent with the request."," # The HMAC is generated using the command name and the current timestamp,"," # using a shared key generated from the phone’s private key and the vehicle’s"," # public key. The vehicle’s public key is available in the vehiclePublicKey"," # field of the getUserInfo endpoint."," def send_vehicle_command(self, vehicle_id, command, vasPhoneId, deviceId, vehiclePublicKey):"," headers = self.gateway_headers()",""," query = {"," \"operationName\": \"sendVehicleCommand\","," \"query\": \"mutation sendVehicleCommand($attrs: VehicleCommandAttributes!) { sendVehicleCommand(attrs: $attrs) { __typename id command state } }\","," \"variables\": {"," \"attrs\": {"," \"command\": command,"," \"hmac\": 0, #your-hmac"," \"timestamp\": time.time(),"," \"vasPhoneId\": vasPhoneId,"," \"deviceId\": deviceId,"," \"vehicleId\": vehicle_id,"," }"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()"],"stylingDirectives":[[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":14,"cssClass":"pl-s1"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":15,"cssClass":"pl-s1"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":11,"cssClass":"pl-s1"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":11,"cssClass":"pl-s1"}],[],[{"start":0,"end":16,"cssClass":"pl-v"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":47,"cssClass":"pl-s"}],[{"start":0,"end":19,"cssClass":"pl-v"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":38,"cssClass":"pl-v"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":59,"cssClass":"pl-s"}],[{"start":0,"end":20,"cssClass":"pl-v"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":23,"end":39,"cssClass":"pl-v"},{"start":40,"end":41,"cssClass":"pl-c1"},{"start":42,"end":62,"cssClass":"pl-s"}],[{"start":0,"end":18,"cssClass":"pl-v"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":37,"cssClass":"pl-v"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":40,"end":57,"cssClass":"pl-s"}],[{"start":0,"end":19,"cssClass":"pl-v"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":38,"cssClass":"pl-v"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":59,"cssClass":"pl-s"}],[{"start":0,"end":24,"cssClass":"pl-v"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":43,"cssClass":"pl-v"},{"start":44,"end":45,"cssClass":"pl-c1"},{"start":46,"end":60,"cssClass":"pl-s"}],[],[{"start":0,"end":3,"cssClass":"pl-s1"},{"start":4,"end":5,"cssClass":"pl-c1"},{"start":6,"end":13,"cssClass":"pl-s1"},{"start":14,"end":23,"cssClass":"pl-en"},{"start":24,"end":32,"cssClass":"pl-s1"}],[],[{"start":0,"end":7,"cssClass":"pl-v"},{"start":8,"end":9,"cssClass":"pl-c1"}],[{"start":4,"end":16,"cssClass":"pl-s"},{"start":18,"end":67,"cssClass":"pl-s"}],[{"start":4,"end":12,"cssClass":"pl-s"},{"start":14,"end":32,"cssClass":"pl-s"}],[{"start":4,"end":18,"cssClass":"pl-s"},{"start":20,"end":38,"cssClass":"pl-s"}],[{"start":4,"end":31,"cssClass":"pl-s"},{"start":33,"end":69,"cssClass":"pl-s"}],[],[],[],[{"start":0,"end":5,"cssClass":"pl-k"},{"start":6,"end":12,"cssClass":"pl-v"}],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":16,"cssClass":"pl-en"},{"start":17,"end":21,"cssClass":"pl-s1"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":35,"cssClass":"pl-c1"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":32,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":26,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":31,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":32,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":36,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":32,"cssClass":"pl-s1"},{"start":33,"end":34,"cssClass":"pl-c1"},{"start":35,"end":37,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":22,"cssClass":"pl-s1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":27,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":26,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":31,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":28,"cssClass":"pl-s1"},{"start":29,"end":30,"cssClass":"pl-c1"},{"start":31,"end":33,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-s"}],[],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":23,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":26,"end":31,"cssClass":"pl-c1"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":23,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":26,"end":28,"cssClass":"pl-s"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":13,"cssClass":"pl-en"},{"start":14,"end":18,"cssClass":"pl-s1"},{"start":20,"end":28,"cssClass":"pl-s1"},{"start":30,"end":38,"cssClass":"pl-s1"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":30,"cssClass":"pl-en"}],[{"start":8,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":33,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":22,"cssClass":"pl-en"}],[],[{"start":16,"end":28,"cssClass":"pl-s"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":35,"end":46,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":31,"end":49,"cssClass":"pl-s1"}],[{"start":16,"end":43,"cssClass":"pl-s"},{"start":45,"end":81,"cssClass":"pl-s"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":49,"cssClass":"pl-s"},{"start":34,"end":48,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-kos"},{"start":35,"end":39,"cssClass":"pl-s1"},{"start":40,"end":45,"cssClass":"pl-en"},{"start":47,"end":48,"cssClass":"pl-kos"}],[],[],[],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":36,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":347,"cssClass":"pl-s"},{"start":75,"end":77,"cssClass":"pl-cce"},{"start":122,"end":124,"cssClass":"pl-cce"},{"start":138,"end":140,"cssClass":"pl-cce"},{"start":172,"end":174,"cssClass":"pl-cce"},{"start":190,"end":192,"cssClass":"pl-cce"},{"start":209,"end":211,"cssClass":"pl-cce"},{"start":229,"end":231,"cssClass":"pl-cce"},{"start":253,"end":255,"cssClass":"pl-cce"},{"start":260,"end":262,"cssClass":"pl-cce"},{"start":297,"end":299,"cssClass":"pl-cce"},{"start":315,"end":317,"cssClass":"pl-cce"},{"start":331,"end":333,"cssClass":"pl-cce"},{"start":338,"end":340,"cssClass":"pl-cce"},{"start":343,"end":345,"cssClass":"pl-cce"}],[{"start":12,"end":23,"cssClass":"pl-s"},{"start":26,"end":33,"cssClass":"pl-s"},{"start":35,"end":43,"cssClass":"pl-s1"},{"start":45,"end":55,"cssClass":"pl-s"},{"start":57,"end":65,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":49,"cssClass":"pl-s1"},{"start":51,"end":56,"cssClass":"pl-s1"},{"start":56,"end":57,"cssClass":"pl-c1"},{"start":57,"end":62,"cssClass":"pl-s1"},{"start":64,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":79,"cssClass":"pl-s1"}],[{"start":8,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":32,"cssClass":"pl-s1"},{"start":33,"end":37,"cssClass":"pl-en"}],[{"start":8,"end":10,"cssClass":"pl-k"},{"start":11,"end":19,"cssClass":"pl-s1"},{"start":20,"end":31,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":35,"end":38,"cssClass":"pl-c1"},{"start":39,"end":42,"cssClass":"pl-c1"},{"start":43,"end":56,"cssClass":"pl-s1"},{"start":57,"end":63,"cssClass":"pl-s"},{"start":65,"end":68,"cssClass":"pl-c1"},{"start":69,"end":76,"cssClass":"pl-s"},{"start":77,"end":79,"cssClass":"pl-c1"},{"start":80,"end":93,"cssClass":"pl-s1"},{"start":94,"end":100,"cssClass":"pl-s"}],[{"start":12,"end":22,"cssClass":"pl-s1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":38,"cssClass":"pl-s1"},{"start":39,"end":45,"cssClass":"pl-s"},{"start":47,"end":54,"cssClass":"pl-s"}],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":15,"end":25,"cssClass":"pl-s"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":29,"end":39,"cssClass":"pl-s1"}],[{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":38,"cssClass":"pl-c1"}],[{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":44,"cssClass":"pl-s1"},{"start":45,"end":55,"cssClass":"pl-s"}],[{"start":12,"end":16,"cssClass":"pl-k"}],[{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":34,"cssClass":"pl-s1"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":37,"end":47,"cssClass":"pl-s1"},{"start":48,"end":61,"cssClass":"pl-s"}],[{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":35,"cssClass":"pl-s1"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":38,"end":48,"cssClass":"pl-s1"},{"start":49,"end":63,"cssClass":"pl-s"}],[{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-s1"},{"start":41,"end":42,"cssClass":"pl-c1"},{"start":43,"end":53,"cssClass":"pl-s1"},{"start":54,"end":72,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-k"}],[{"start":12,"end":19,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":81,"cssClass":"pl-s"},{"start":32,"end":54,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-kos"},{"start":33,"end":41,"cssClass":"pl-s1"},{"start":42,"end":53,"cssClass":"pl-s1"},{"start":53,"end":54,"cssClass":"pl-kos"},{"start":65,"end":80,"cssClass":"pl-s1"},{"start":65,"end":66,"cssClass":"pl-kos"},{"start":66,"end":79,"cssClass":"pl-s1"},{"start":79,"end":80,"cssClass":"pl-kos"}],[{"start":12,"end":17,"cssClass":"pl-en"},{"start":18,"end":44,"cssClass":"pl-s"},{"start":34,"end":43,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-kos"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":42,"end":43,"cssClass":"pl-kos"}],[{"start":12,"end":17,"cssClass":"pl-k"},{"start":18,"end":27,"cssClass":"pl-v"},{"start":28,"end":35,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":22,"cssClass":"pl-en"},{"start":23,"end":27,"cssClass":"pl-s1"},{"start":29,"end":37,"cssClass":"pl-s1"},{"start":39,"end":46,"cssClass":"pl-s1"},{"start":48,"end":56,"cssClass":"pl-s1"},{"start":56,"end":57,"cssClass":"pl-c1"},{"start":57,"end":61,"cssClass":"pl-c1"}],[{"start":8,"end":10,"cssClass":"pl-k"},{"start":11,"end":15,"cssClass":"pl-s1"},{"start":16,"end":27,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":31,"end":33,"cssClass":"pl-s"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":34,"cssClass":"pl-en"}],[{"start":8,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":33,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":22,"cssClass":"pl-en"}],[],[{"start":16,"end":28,"cssClass":"pl-s"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":35,"end":46,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":31,"end":49,"cssClass":"pl-s1"}],[{"start":16,"end":43,"cssClass":"pl-s"},{"start":45,"end":81,"cssClass":"pl-s"}],[],[],[],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":43,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":321,"cssClass":"pl-s"},{"start":101,"end":103,"cssClass":"pl-cce"},{"start":174,"end":176,"cssClass":"pl-cce"},{"start":190,"end":192,"cssClass":"pl-cce"},{"start":224,"end":226,"cssClass":"pl-cce"},{"start":242,"end":244,"cssClass":"pl-cce"},{"start":261,"end":263,"cssClass":"pl-cce"},{"start":281,"end":283,"cssClass":"pl-cce"},{"start":305,"end":307,"cssClass":"pl-cce"},{"start":312,"end":314,"cssClass":"pl-cce"},{"start":317,"end":319,"cssClass":"pl-cce"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":23,"cssClass":"pl-s"},{"start":25,"end":33,"cssClass":"pl-s1"}],[{"start":16,"end":25,"cssClass":"pl-s"},{"start":27,"end":34,"cssClass":"pl-s1"}],[{"start":16,"end":26,"cssClass":"pl-s"},{"start":28,"end":36,"cssClass":"pl-s1"},{"start":37,"end":39,"cssClass":"pl-c1"},{"start":40,"end":44,"cssClass":"pl-s1"},{"start":45,"end":55,"cssClass":"pl-s1"}],[],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":49,"cssClass":"pl-s1"},{"start":51,"end":56,"cssClass":"pl-s1"},{"start":56,"end":57,"cssClass":"pl-c1"},{"start":57,"end":62,"cssClass":"pl-s1"},{"start":64,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":79,"cssClass":"pl-s1"}],[{"start":8,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":32,"cssClass":"pl-s1"},{"start":33,"end":37,"cssClass":"pl-en"}],[{"start":8,"end":10,"cssClass":"pl-k"},{"start":11,"end":19,"cssClass":"pl-s1"},{"start":20,"end":31,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":35,"end":38,"cssClass":"pl-c1"},{"start":39,"end":42,"cssClass":"pl-c1"},{"start":43,"end":56,"cssClass":"pl-s1"},{"start":57,"end":63,"cssClass":"pl-s"},{"start":65,"end":68,"cssClass":"pl-c1"},{"start":69,"end":83,"cssClass":"pl-s"},{"start":84,"end":86,"cssClass":"pl-c1"},{"start":87,"end":100,"cssClass":"pl-s1"},{"start":101,"end":107,"cssClass":"pl-s"}],[{"start":12,"end":22,"cssClass":"pl-s1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":38,"cssClass":"pl-s1"},{"start":39,"end":45,"cssClass":"pl-s"},{"start":47,"end":61,"cssClass":"pl-s"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":30,"cssClass":"pl-s1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":43,"cssClass":"pl-s1"},{"start":44,"end":57,"cssClass":"pl-s"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":44,"cssClass":"pl-s1"},{"start":45,"end":59,"cssClass":"pl-s"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":36,"cssClass":"pl-s1"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":39,"end":49,"cssClass":"pl-s1"},{"start":50,"end":68,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-k"}],[{"start":12,"end":19,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":81,"cssClass":"pl-s"},{"start":32,"end":54,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-kos"},{"start":33,"end":41,"cssClass":"pl-s1"},{"start":42,"end":53,"cssClass":"pl-s1"},{"start":53,"end":54,"cssClass":"pl-kos"},{"start":65,"end":80,"cssClass":"pl-s1"},{"start":65,"end":66,"cssClass":"pl-kos"},{"start":66,"end":79,"cssClass":"pl-s1"},{"start":79,"end":80,"cssClass":"pl-kos"}],[{"start":12,"end":17,"cssClass":"pl-en"},{"start":18,"end":53,"cssClass":"pl-s"},{"start":43,"end":52,"cssClass":"pl-s1"},{"start":43,"end":44,"cssClass":"pl-kos"},{"start":44,"end":51,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-kos"}],[{"start":12,"end":17,"cssClass":"pl-k"},{"start":18,"end":27,"cssClass":"pl-v"},{"start":28,"end":35,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":25,"cssClass":"pl-en"},{"start":26,"end":30,"cssClass":"pl-s1"}],[{"start":8,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":33,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-v"}],[],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":46,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":104,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"},{"start":25,"end":29,"cssClass":"pl-c1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":49,"cssClass":"pl-s1"},{"start":51,"end":56,"cssClass":"pl-s1"},{"start":56,"end":57,"cssClass":"pl-c1"},{"start":57,"end":62,"cssClass":"pl-s1"},{"start":64,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":79,"cssClass":"pl-s1"}],[{"start":8,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":32,"cssClass":"pl-s1"},{"start":33,"end":37,"cssClass":"pl-en"}],[{"start":8,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":33,"cssClass":"pl-s1"},{"start":34,"end":40,"cssClass":"pl-s"},{"start":42,"end":59,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":36,"cssClass":"pl-s1"},{"start":37,"end":48,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":43,"cssClass":"pl-s1"},{"start":44,"end":61,"cssClass":"pl-s"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":25,"cssClass":"pl-en"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":32,"end":35,"cssClass":"pl-s1"},{"start":37,"end":42,"cssClass":"pl-s1"},{"start":44,"end":51,"cssClass":"pl-s1"}],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":27,"cssClass":"pl-s1"},{"start":28,"end":32,"cssClass":"pl-en"},{"start":33,"end":36,"cssClass":"pl-s1"},{"start":38,"end":42,"cssClass":"pl-s1"},{"start":42,"end":43,"cssClass":"pl-c1"},{"start":43,"end":48,"cssClass":"pl-s1"},{"start":50,"end":57,"cssClass":"pl-s1"},{"start":57,"end":58,"cssClass":"pl-c1"},{"start":58,"end":65,"cssClass":"pl-s1"}],[{"start":8,"end":10,"cssClass":"pl-k"},{"start":11,"end":19,"cssClass":"pl-s1"},{"start":20,"end":31,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":35,"end":38,"cssClass":"pl-c1"}],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":23,"cssClass":"pl-en"},{"start":24,"end":107,"cssClass":"pl-s"},{"start":58,"end":80,"cssClass":"pl-s1"},{"start":58,"end":59,"cssClass":"pl-kos"},{"start":59,"end":67,"cssClass":"pl-s1"},{"start":68,"end":79,"cssClass":"pl-s1"},{"start":79,"end":80,"cssClass":"pl-kos"},{"start":89,"end":106,"cssClass":"pl-s1"},{"start":89,"end":90,"cssClass":"pl-kos"},{"start":90,"end":98,"cssClass":"pl-s1"},{"start":99,"end":105,"cssClass":"pl-s1"},{"start":105,"end":106,"cssClass":"pl-kos"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":23,"cssClass":"pl-en"},{"start":24,"end":28,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":22,"cssClass":"pl-en"}],[],[{"start":16,"end":28,"cssClass":"pl-s"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":35,"end":46,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":31,"end":49,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":31,"end":50,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":49,"cssClass":"pl-s"},{"start":34,"end":48,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-kos"},{"start":35,"end":39,"cssClass":"pl-s1"},{"start":40,"end":45,"cssClass":"pl-en"},{"start":47,"end":48,"cssClass":"pl-kos"}],[],[],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":22,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":27,"cssClass":"pl-en"},{"start":28,"end":32,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":22,"cssClass":"pl-en"}],[],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":64,"cssClass":"pl-s"},{"start":33,"end":47,"cssClass":"pl-s1"},{"start":33,"end":34,"cssClass":"pl-kos"},{"start":34,"end":38,"cssClass":"pl-s1"},{"start":39,"end":44,"cssClass":"pl-en"},{"start":46,"end":47,"cssClass":"pl-kos"},{"start":49,"end":63,"cssClass":"pl-s1"},{"start":49,"end":50,"cssClass":"pl-kos"},{"start":50,"end":54,"cssClass":"pl-s1"},{"start":55,"end":60,"cssClass":"pl-en"},{"start":62,"end":63,"cssClass":"pl-kos"}],[{"start":16,"end":28,"cssClass":"pl-s"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":35,"end":46,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":31,"cssClass":"pl-s"}],[],[],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":22,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":22,"cssClass":"pl-en"},{"start":23,"end":27,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":44,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":309,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":16,"cssClass":"pl-en"},{"start":17,"end":21,"cssClass":"pl-s1"},{"start":23,"end":31,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":292,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":25,"cssClass":"pl-s"},{"start":27,"end":35,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":26,"cssClass":"pl-en"},{"start":27,"end":31,"cssClass":"pl-s1"},{"start":33,"end":41,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":48,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":1146,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":25,"cssClass":"pl-s"},{"start":27,"end":35,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":70,"cssClass":"pl-v"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":77,"end":78,"cssClass":"pl-c1"},{"start":78,"end":83,"cssClass":"pl-s1"},{"start":85,"end":92,"cssClass":"pl-s1"},{"start":92,"end":93,"cssClass":"pl-c1"},{"start":93,"end":100,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":23,"cssClass":"pl-en"},{"start":24,"end":28,"cssClass":"pl-s1"},{"start":30,"end":38,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":45,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":357,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"},{"start":26,"end":35,"cssClass":"pl-s"},{"start":37,"end":45,"cssClass":"pl-s1"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":70,"cssClass":"pl-v"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":77,"end":78,"cssClass":"pl-c1"},{"start":78,"end":83,"cssClass":"pl-s1"},{"start":85,"end":92,"cssClass":"pl-s1"},{"start":92,"end":93,"cssClass":"pl-c1"},{"start":93,"end":100,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":13,"cssClass":"pl-en"},{"start":14,"end":18,"cssClass":"pl-s1"},{"start":20,"end":28,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":36,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":1416,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"},{"start":26,"end":30,"cssClass":"pl-s"},{"start":32,"end":40,"cssClass":"pl-s1"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":21,"cssClass":"pl-en"},{"start":22,"end":26,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":43,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":232,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":23,"cssClass":"pl-s"}],[{"start":20,"end":32,"cssClass":"pl-s"},{"start":35,"end":43,"cssClass":"pl-s"}],[{"start":20,"end":33,"cssClass":"pl-s"},{"start":35,"end":39,"cssClass":"pl-c1"}],[{"start":20,"end":30,"cssClass":"pl-s"}],[{"start":24,"end":30,"cssClass":"pl-s"},{"start":32,"end":33,"cssClass":"pl-c1"}],[{"start":24,"end":30,"cssClass":"pl-s"},{"start":32,"end":33,"cssClass":"pl-c1"}],[],[{"start":20,"end":31,"cssClass":"pl-s"},{"start":33,"end":37,"cssClass":"pl-c1"}],[{"start":20,"end":32,"cssClass":"pl-s"}],[{"start":24,"end":35,"cssClass":"pl-s"},{"start":37,"end":43,"cssClass":"pl-s"}],[],[],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":17,"cssClass":"pl-en"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":24,"end":32,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":1008,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":25,"cssClass":"pl-s"},{"start":27,"end":35,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":23,"cssClass":"pl-en"},{"start":24,"end":28,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":45,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":128,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":28,"cssClass":"pl-en"},{"start":29,"end":33,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":42,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":973,"cssClass":"pl-s"}],[{"start":12,"end":385,"cssClass":"pl-c"}],[{"start":12,"end":23,"cssClass":"pl-s"},{"start":25,"end":29,"cssClass":"pl-c1"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":25,"cssClass":"pl-en"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":32,"end":42,"cssClass":"pl-s1"},{"start":44,"end":51,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-c1"},{"start":52,"end":57,"cssClass":"pl-c1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":10,"cssClass":"pl-k"},{"start":11,"end":18,"cssClass":"pl-s1"}],[{"start":12,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":98,"cssClass":"pl-s"}],[{"start":20,"end":51,"cssClass":"pl-s"}],[{"start":20,"end":43,"cssClass":"pl-s"}],[{"start":20,"end":42,"cssClass":"pl-s"}],[{"start":20,"end":43,"cssClass":"pl-s"}],[{"start":20,"end":47,"cssClass":"pl-s"}],[{"start":20,"end":45,"cssClass":"pl-s"}],[{"start":20,"end":48,"cssClass":"pl-s"}],[{"start":20,"end":58,"cssClass":"pl-s"}],[{"start":20,"end":42,"cssClass":"pl-s"}],[{"start":20,"end":46,"cssClass":"pl-s"}],[{"start":20,"end":45,"cssClass":"pl-s"}],[{"start":20,"end":45,"cssClass":"pl-s"}],[{"start":20,"end":50,"cssClass":"pl-s"}],[{"start":20,"end":25,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-k"}],[{"start":12,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":67,"cssClass":"pl-s"}],[{"start":20,"end":64,"cssClass":"pl-s"}],[{"start":20,"end":62,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":63,"cssClass":"pl-s"}],[{"start":20,"end":65,"cssClass":"pl-s"}],[{"start":20,"end":66,"cssClass":"pl-s"}],[{"start":20,"end":107,"cssClass":"pl-s"}],[{"start":20,"end":70,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":76,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":78,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":76,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":78,"cssClass":"pl-s"}],[{"start":20,"end":78,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":64,"cssClass":"pl-s"}],[{"start":20,"end":86,"cssClass":"pl-s"}],[{"start":20,"end":68,"cssClass":"pl-s"}],[{"start":20,"end":67,"cssClass":"pl-s"}],[{"start":20,"end":64,"cssClass":"pl-s"}],[{"start":20,"end":81,"cssClass":"pl-s"}],[{"start":20,"end":86,"cssClass":"pl-s"}],[{"start":20,"end":82,"cssClass":"pl-s"}],[{"start":20,"end":87,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":85,"cssClass":"pl-s"}],[{"start":20,"end":81,"cssClass":"pl-s"}],[{"start":20,"end":86,"cssClass":"pl-s"}],[{"start":20,"end":66,"cssClass":"pl-s"}],[{"start":20,"end":66,"cssClass":"pl-s"}],[{"start":20,"end":66,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":77,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":68,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":77,"cssClass":"pl-s"}],[{"start":20,"end":77,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":77,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":68,"cssClass":"pl-s"}],[{"start":20,"end":68,"cssClass":"pl-s"}],[{"start":20,"end":63,"cssClass":"pl-s"}],[{"start":20,"end":70,"cssClass":"pl-s"}],[{"start":20,"end":85,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":78,"cssClass":"pl-s"}],[{"start":20,"end":67,"cssClass":"pl-s"}],[{"start":20,"end":78,"cssClass":"pl-s"}],[{"start":20,"end":83,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":81,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":70,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":67,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":63,"cssClass":"pl-s"}],[{"start":20,"end":70,"cssClass":"pl-s"}],[{"start":20,"end":70,"cssClass":"pl-s"}],[{"start":20,"end":77,"cssClass":"pl-s"}],[{"start":20,"end":65,"cssClass":"pl-s"}],[{"start":20,"end":67,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":81,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":81,"cssClass":"pl-s"}],[{"start":20,"end":65,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":84,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":25,"cssClass":"pl-s"}],[],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":46,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":26,"cssClass":"pl-s1"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":35,"cssClass":"pl-en"},{"start":36,"end":40,"cssClass":"pl-s1"},{"start":42,"end":52,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":55,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":162,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":17,"cssClass":"pl-en"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":24,"end":34,"cssClass":"pl-s1"},{"start":36,"end":48,"cssClass":"pl-s1"},{"start":50,"end":71,"cssClass":"pl-s1"},{"start":73,"end":83,"cssClass":"pl-s1"},{"start":85,"end":96,"cssClass":"pl-s1"},{"start":98,"end":106,"cssClass":"pl-s1"},{"start":108,"end":117,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":793,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":24,"cssClass":"pl-s"}],[{"start":20,"end":30,"cssClass":"pl-s"},{"start":32,"end":42,"cssClass":"pl-s1"}],[{"start":20,"end":31,"cssClass":"pl-s"},{"start":33,"end":44,"cssClass":"pl-s1"}],[],[{"start":16,"end":29,"cssClass":"pl-s"}],[{"start":20,"end":30,"cssClass":"pl-s"},{"start":32,"end":40,"cssClass":"pl-s1"}],[{"start":20,"end":31,"cssClass":"pl-s"},{"start":33,"end":42,"cssClass":"pl-s1"}],[],[{"start":16,"end":25,"cssClass":"pl-s"},{"start":27,"end":28,"cssClass":"pl-c1"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[{"start":16,"end":37,"cssClass":"pl-s"},{"start":39,"end":60,"cssClass":"pl-s1"}],[{"start":16,"end":29,"cssClass":"pl-s"},{"start":31,"end":43,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":23,"cssClass":"pl-en"},{"start":24,"end":28,"cssClass":"pl-s1"},{"start":30,"end":40,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":41,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":191,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":26,"cssClass":"pl-en"},{"start":27,"end":31,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":46,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":80,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":38,"cssClass":"pl-en"},{"start":39,"end":43,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":56,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":110,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":34,"cssClass":"pl-en"},{"start":35,"end":39,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":54,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":126,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":22,"cssClass":"pl-s"},{"start":25,"end":74,"cssClass":"pl-s"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":19,"cssClass":"pl-en"},{"start":20,"end":24,"cssClass":"pl-s1"},{"start":26,"end":36,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":41,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":316,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":30,"cssClass":"pl-s"},{"start":32,"end":42,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":32,"cssClass":"pl-en"},{"start":33,"end":37,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":53,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":259,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":37,"cssClass":"pl-en"},{"start":38,"end":42,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":57,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":185,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":26,"cssClass":"pl-en"},{"start":27,"end":31,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":47,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":361,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":35,"cssClass":"pl-s"}],[{"start":16,"end":28,"cssClass":"pl-s"},{"start":30,"end":36,"cssClass":"pl-s"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":12,"cssClass":"pl-en"},{"start":13,"end":17,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":35,"cssClass":"pl-s"}],[{"start":12,"end":1193,"cssClass":"pl-c"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":615,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":29,"cssClass":"pl-en"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":36,"end":46,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":50,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":203,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":39,"cssClass":"pl-en"},{"start":40,"end":44,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":59,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":316,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":35,"cssClass":"pl-en"},{"start":36,"end":40,"cssClass":"pl-s1"},{"start":42,"end":48,"cssClass":"pl-s1"},{"start":50,"end":57,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":55,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":175,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":23,"cssClass":"pl-s"},{"start":25,"end":30,"cssClass":"pl-s"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":31,"cssClass":"pl-s"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":35,"cssClass":"pl-en"},{"start":36,"end":40,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":54,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":164,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":29,"cssClass":"pl-en"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":36,"end":46,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":49,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":64,"cssClass":"pl-s"}],[{"start":21,"end":67,"cssClass":"pl-s"}],[{"start":21,"end":95,"cssClass":"pl-s"}],[{"start":21,"end":114,"cssClass":"pl-s"}],[{"start":21,"end":111,"cssClass":"pl-s"}],[{"start":21,"end":116,"cssClass":"pl-s"}],[{"start":21,"end":88,"cssClass":"pl-s"}],[{"start":21,"end":94,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":32,"cssClass":"pl-en"},{"start":33,"end":37,"cssClass":"pl-s1"},{"start":39,"end":49,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":52,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":141,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[],[{"start":4,"end":77,"cssClass":"pl-c"}],[{"start":4,"end":77,"cssClass":"pl-c"}],[{"start":4,"end":81,"cssClass":"pl-c"}],[{"start":4,"end":79,"cssClass":"pl-c"}],[{"start":4,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":28,"cssClass":"pl-en"},{"start":29,"end":33,"cssClass":"pl-s1"},{"start":35,"end":45,"cssClass":"pl-s1"},{"start":47,"end":54,"cssClass":"pl-s1"},{"start":56,"end":66,"cssClass":"pl-s1"},{"start":68,"end":76,"cssClass":"pl-s1"},{"start":78,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":49,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":155,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":23,"cssClass":"pl-s"}],[{"start":20,"end":29,"cssClass":"pl-s"},{"start":31,"end":38,"cssClass":"pl-s1"}],[{"start":20,"end":26,"cssClass":"pl-s"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":31,"end":41,"cssClass":"pl-c"}],[{"start":20,"end":31,"cssClass":"pl-s"},{"start":33,"end":37,"cssClass":"pl-s1"},{"start":38,"end":42,"cssClass":"pl-en"}],[{"start":20,"end":32,"cssClass":"pl-s"},{"start":34,"end":44,"cssClass":"pl-s1"}],[{"start":20,"end":30,"cssClass":"pl-s"},{"start":32,"end":40,"cssClass":"pl-s1"}],[{"start":20,"end":31,"cssClass":"pl-s"},{"start":33,"end":43,"cssClass":"pl-s1"}],[],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}]],"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/the-mace/rivian-python-api/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"rivian_api.py","displayUrl":"https://github.com/the-mace/rivian-python-api/blob/main/src/rivian_python_api/rivian_api.py?raw=true","headerInfo":{"blobSize":"39 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","deleteInfo":{"deleteTooltip":"You must be signed in to make or propose changes"},"editInfo":{"editTooltip":"You must be signed in to make or propose changes"},"ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"gitLfsPath":null,"onBranch":true,"shortPath":"cb38eb9","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fthe-mace%2Frivian-python-api%2Fblob%2Fmain%2Fsrc%2Frivian_python_api%2Frivian_api.py","isCSV":false,"isRichtext":false,"toc":null,"lineInfo":{"truncatedLoc":"653","truncatedSloc":"599"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplateHelpUrl":"https://docs.github.com/articles/about-issue-and-pull-request-templates","issueTemplate":null,"discussionTemplate":null,"language":"Python","languageID":303,"large":false,"loggedIn":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/the-mace/rivian-python-api/blob/main/src/rivian_python_api/rivian_api.py","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/the-mace/rivian-python-api/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/the-mace/rivian-python-api/raw/main/src/rivian_python_api/rivian_api.py","renderImageOrRaw":false,"richText":null,"renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"repoOwner":"the-mace","repoName":"rivian-python-api","showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"RIVIAN_BASE_PATH","kind":"constant","ident_start":56,"ident_end":72,"extent_start":56,"extent_end":103,"fully_qualified_name":"RIVIAN_BASE_PATH","ident_utf16":{"start":{"line_number":5,"utf16_col":0},"end":{"line_number":5,"utf16_col":16}},"extent_utf16":{"start":{"line_number":5,"utf16_col":0},"end":{"line_number":5,"utf16_col":47}}},{"name":"RIVIAN_GATEWAY_PATH","kind":"constant","ident_start":104,"ident_end":123,"extent_start":104,"extent_end":163,"fully_qualified_name":"RIVIAN_GATEWAY_PATH","ident_utf16":{"start":{"line_number":6,"utf16_col":0},"end":{"line_number":6,"utf16_col":19}},"extent_utf16":{"start":{"line_number":6,"utf16_col":0},"end":{"line_number":6,"utf16_col":59}}},{"name":"RIVIAN_CHARGING_PATH","kind":"constant","ident_start":164,"ident_end":184,"extent_start":164,"extent_end":226,"fully_qualified_name":"RIVIAN_CHARGING_PATH","ident_utf16":{"start":{"line_number":7,"utf16_col":0},"end":{"line_number":7,"utf16_col":20}},"extent_utf16":{"start":{"line_number":7,"utf16_col":0},"end":{"line_number":7,"utf16_col":62}}},{"name":"RIVIAN_ORDERS_PATH","kind":"constant","ident_start":227,"ident_end":245,"extent_start":227,"extent_end":284,"fully_qualified_name":"RIVIAN_ORDERS_PATH","ident_utf16":{"start":{"line_number":8,"utf16_col":0},"end":{"line_number":8,"utf16_col":18}},"extent_utf16":{"start":{"line_number":8,"utf16_col":0},"end":{"line_number":8,"utf16_col":57}}},{"name":"RIVIAN_CONTENT_PATH","kind":"constant","ident_start":285,"ident_end":304,"extent_start":285,"extent_end":344,"fully_qualified_name":"RIVIAN_CONTENT_PATH","ident_utf16":{"start":{"line_number":9,"utf16_col":0},"end":{"line_number":9,"utf16_col":19}},"extent_utf16":{"start":{"line_number":9,"utf16_col":0},"end":{"line_number":9,"utf16_col":59}}},{"name":"RIVIAN_TRANSACTIONS_PATH","kind":"constant","ident_start":345,"ident_end":369,"extent_start":345,"extent_end":405,"fully_qualified_name":"RIVIAN_TRANSACTIONS_PATH","ident_utf16":{"start":{"line_number":10,"utf16_col":0},"end":{"line_number":10,"utf16_col":24}},"extent_utf16":{"start":{"line_number":10,"utf16_col":0},"end":{"line_number":10,"utf16_col":60}}},{"name":"log","kind":"constant","ident_start":407,"ident_end":410,"extent_start":407,"extent_end":440,"fully_qualified_name":"log","ident_utf16":{"start":{"line_number":12,"utf16_col":0},"end":{"line_number":12,"utf16_col":3}},"extent_utf16":{"start":{"line_number":12,"utf16_col":0},"end":{"line_number":12,"utf16_col":33}}},{"name":"HEADERS","kind":"constant","ident_start":442,"ident_end":449,"extent_start":442,"extent_end":669,"fully_qualified_name":"HEADERS","ident_utf16":{"start":{"line_number":14,"utf16_col":0},"end":{"line_number":14,"utf16_col":7}},"extent_utf16":{"start":{"line_number":14,"utf16_col":0},"end":{"line_number":19,"utf16_col":1}}},{"name":"Rivian","kind":"class","ident_start":678,"ident_end":684,"extent_start":672,"extent_end":39889,"fully_qualified_name":"Rivian","ident_utf16":{"start":{"line_number":22,"utf16_col":6},"end":{"line_number":22,"utf16_col":12}},"extent_utf16":{"start":{"line_number":22,"utf16_col":0},"end":{"line_number":652,"utf16_col":30}}},{"name":"__init__","kind":"function","ident_start":694,"ident_end":702,"extent_start":690,"extent_end":1104,"fully_qualified_name":"Rivian.__init__","ident_utf16":{"start":{"line_number":23,"utf16_col":8},"end":{"line_number":23,"utf16_col":16}},"extent_utf16":{"start":{"line_number":23,"utf16_col":4},"end":{"line_number":36,"utf16_col":28}}},{"name":"login","kind":"function","ident_start":1114,"ident_end":1119,"extent_start":1110,"extent_end":2859,"fully_qualified_name":"Rivian.login","ident_utf16":{"start":{"line_number":38,"utf16_col":8},"end":{"line_number":38,"utf16_col":13}},"extent_utf16":{"start":{"line_number":38,"utf16_col":4},"end":{"line_number":72,"utf16_col":23}}},{"name":"login_with_otp","kind":"function","ident_start":2869,"ident_end":2883,"extent_start":2865,"extent_end":4564,"fully_qualified_name":"Rivian.login_with_otp","ident_utf16":{"start":{"line_number":74,"utf16_col":8},"end":{"line_number":74,"utf16_col":22}},"extent_utf16":{"start":{"line_number":74,"utf16_col":4},"end":{"line_number":108,"utf16_col":23}}},{"name":"create_csrf_token","kind":"function","ident_start":4574,"ident_end":4591,"extent_start":4570,"extent_end":5192,"fully_qualified_name":"Rivian.create_csrf_token","ident_utf16":{"start":{"line_number":110,"utf16_col":8},"end":{"line_number":110,"utf16_col":25}},"extent_utf16":{"start":{"line_number":110,"utf16_col":4},"end":{"line_number":125,"utf16_col":23}}},{"name":"raw_graphql_query","kind":"function","ident_start":5202,"ident_end":5219,"extent_start":5198,"extent_end":5487,"fully_qualified_name":"Rivian.raw_graphql_query","ident_utf16":{"start":{"line_number":127,"utf16_col":8},"end":{"line_number":127,"utf16_col":25}},"extent_utf16":{"start":{"line_number":127,"utf16_col":4},"end":{"line_number":131,"utf16_col":23}}},{"name":"gateway_headers","kind":"function","ident_start":5497,"ident_end":5512,"extent_start":5493,"extent_end":5832,"fully_qualified_name":"Rivian.gateway_headers","ident_utf16":{"start":{"line_number":133,"utf16_col":8},"end":{"line_number":133,"utf16_col":23}},"extent_utf16":{"start":{"line_number":133,"utf16_col":4},"end":{"line_number":143,"utf16_col":22}}},{"name":"transaction_headers","kind":"function","ident_start":5842,"ident_end":5861,"extent_start":5838,"extent_end":6140,"fully_qualified_name":"Rivian.transaction_headers","ident_utf16":{"start":{"line_number":145,"utf16_col":8},"end":{"line_number":145,"utf16_col":27}},"extent_utf16":{"start":{"line_number":145,"utf16_col":4},"end":{"line_number":154,"utf16_col":22}}},{"name":"vehicle_orders","kind":"function","ident_start":6150,"ident_end":6164,"extent_start":6146,"extent_end":6754,"fully_qualified_name":"Rivian.vehicle_orders","ident_utf16":{"start":{"line_number":156,"utf16_col":8},"end":{"line_number":156,"utf16_col":22}},"extent_utf16":{"start":{"line_number":156,"utf16_col":4},"end":{"line_number":164,"utf16_col":30}}},{"name":"delivery","kind":"function","ident_start":6764,"ident_end":6772,"extent_start":6760,"extent_end":7400,"fully_qualified_name":"Rivian.delivery","ident_utf16":{"start":{"line_number":166,"utf16_col":8},"end":{"line_number":166,"utf16_col":16}},"extent_utf16":{"start":{"line_number":166,"utf16_col":4},"end":{"line_number":176,"utf16_col":30}}},{"name":"transaction_status","kind":"function","ident_start":7410,"ident_end":7428,"extent_start":7406,"extent_end":8927,"fully_qualified_name":"Rivian.transaction_status","ident_utf16":{"start":{"line_number":178,"utf16_col":8},"end":{"line_number":178,"utf16_col":26}},"extent_utf16":{"start":{"line_number":178,"utf16_col":4},"end":{"line_number":188,"utf16_col":30}}},{"name":"finance_summary","kind":"function","ident_start":8937,"ident_end":8952,"extent_start":8933,"extent_end":9629,"fully_qualified_name":"Rivian.finance_summary","ident_utf16":{"start":{"line_number":190,"utf16_col":8},"end":{"line_number":190,"utf16_col":23}},"extent_utf16":{"start":{"line_number":190,"utf16_col":4},"end":{"line_number":198,"utf16_col":30}}},{"name":"order","kind":"function","ident_start":9639,"ident_end":9644,"extent_start":9635,"extent_end":11360,"fully_qualified_name":"Rivian.order","ident_utf16":{"start":{"line_number":200,"utf16_col":8},"end":{"line_number":200,"utf16_col":13}},"extent_utf16":{"start":{"line_number":200,"utf16_col":4},"end":{"line_number":208,"utf16_col":30}}},{"name":"retail_orders","kind":"function","ident_start":11370,"ident_end":11383,"extent_start":11366,"extent_end":12310,"fully_qualified_name":"Rivian.retail_orders","ident_utf16":{"start":{"line_number":210,"utf16_col":8},"end":{"line_number":210,"utf16_col":21}},"extent_utf16":{"start":{"line_number":210,"utf16_col":4},"end":{"line_number":231,"utf16_col":30}}},{"name":"get_order","kind":"function","ident_start":12320,"ident_end":12329,"extent_start":12316,"extent_end":13675,"fully_qualified_name":"Rivian.get_order","ident_utf16":{"start":{"line_number":233,"utf16_col":8},"end":{"line_number":233,"utf16_col":17}},"extent_utf16":{"start":{"line_number":233,"utf16_col":4},"end":{"line_number":243,"utf16_col":30}}},{"name":"payment_methods","kind":"function","ident_start":13685,"ident_end":13700,"extent_start":13681,"extent_end":14113,"fully_qualified_name":"Rivian.payment_methods","ident_utf16":{"start":{"line_number":245,"utf16_col":8},"end":{"line_number":245,"utf16_col":23}},"extent_utf16":{"start":{"line_number":245,"utf16_col":4},"end":{"line_number":253,"utf16_col":30}}},{"name":"get_user_information","kind":"function","ident_start":14123,"ident_end":14143,"extent_start":14119,"extent_end":15783,"fully_qualified_name":"Rivian.get_user_information","ident_utf16":{"start":{"line_number":255,"utf16_col":8},"end":{"line_number":255,"utf16_col":28}},"extent_utf16":{"start":{"line_number":255,"utf16_col":4},"end":{"line_number":264,"utf16_col":30}}},{"name":"get_vehicle_state","kind":"function","ident_start":15793,"ident_end":15810,"extent_start":15789,"extent_end":25872,"fully_qualified_name":"Rivian.get_vehicle_state","ident_utf16":{"start":{"line_number":266,"utf16_col":8},"end":{"line_number":266,"utf16_col":25}},"extent_utf16":{"start":{"line_number":266,"utf16_col":4},"end":{"line_number":410,"utf16_col":30}}},{"name":"get_vehicle_last_connection","kind":"function","ident_start":25882,"ident_end":25909,"extent_start":25878,"extent_end":26429,"fully_qualified_name":"Rivian.get_vehicle_last_connection","ident_utf16":{"start":{"line_number":412,"utf16_col":8},"end":{"line_number":412,"utf16_col":35}},"extent_utf16":{"start":{"line_number":412,"utf16_col":4},"end":{"line_number":422,"utf16_col":30}}},{"name":"plan_trip","kind":"function","ident_start":26439,"ident_end":26448,"extent_start":26435,"extent_end":28078,"fully_qualified_name":"Rivian.plan_trip","ident_utf16":{"start":{"line_number":424,"utf16_col":8},"end":{"line_number":424,"utf16_col":17}},"extent_utf16":{"start":{"line_number":424,"utf16_col":4},"end":{"line_number":445,"utf16_col":30}}},{"name":"get_ota_details","kind":"function","ident_start":28088,"ident_end":28103,"extent_start":28084,"extent_end":28638,"fully_qualified_name":"Rivian.get_ota_details","ident_utf16":{"start":{"line_number":447,"utf16_col":8},"end":{"line_number":447,"utf16_col":23}},"extent_utf16":{"start":{"line_number":447,"utf16_col":4},"end":{"line_number":457,"utf16_col":30}}},{"name":"check_by_rivian_id","kind":"function","ident_start":28648,"ident_end":28666,"extent_start":28644,"extent_end":29034,"fully_qualified_name":"Rivian.check_by_rivian_id","ident_utf16":{"start":{"line_number":459,"utf16_col":8},"end":{"line_number":459,"utf16_col":26}},"extent_utf16":{"start":{"line_number":459,"utf16_col":4},"end":{"line_number":467,"utf16_col":30}}},{"name":"get_linked_email_for_rivian_id","kind":"function","ident_start":29044,"ident_end":29074,"extent_start":29040,"extent_end":29482,"fully_qualified_name":"Rivian.get_linked_email_for_rivian_id","ident_utf16":{"start":{"line_number":469,"utf16_col":8},"end":{"line_number":469,"utf16_col":38}},"extent_utf16":{"start":{"line_number":469,"utf16_col":4},"end":{"line_number":477,"utf16_col":30}}},{"name":"get_parameter_store_values","kind":"function","ident_start":29492,"ident_end":29518,"extent_start":29488,"extent_end":30027,"fully_qualified_name":"Rivian.get_parameter_store_values","ident_utf16":{"start":{"line_number":479,"utf16_col":8},"end":{"line_number":479,"utf16_col":34}},"extent_utf16":{"start":{"line_number":479,"utf16_col":4},"end":{"line_number":489,"utf16_col":30}}},{"name":"get_vehicle","kind":"function","ident_start":30037,"ident_end":30048,"extent_start":30033,"extent_end":30710,"fully_qualified_name":"Rivian.get_vehicle","ident_utf16":{"start":{"line_number":491,"utf16_col":8},"end":{"line_number":491,"utf16_col":19}},"extent_utf16":{"start":{"line_number":491,"utf16_col":4},"end":{"line_number":501,"utf16_col":30}}},{"name":"get_registered_wallboxes","kind":"function","ident_start":30720,"ident_end":30744,"extent_start":30716,"extent_end":31293,"fully_qualified_name":"Rivian.get_registered_wallboxes","ident_utf16":{"start":{"line_number":503,"utf16_col":8},"end":{"line_number":503,"utf16_col":32}},"extent_utf16":{"start":{"line_number":503,"utf16_col":4},"end":{"line_number":511,"utf16_col":30}}},{"name":"get_provisioned_camp_speakers","kind":"function","ident_start":31303,"ident_end":31332,"extent_start":31299,"extent_end":31811,"fully_qualified_name":"Rivian.get_provisioned_camp_speakers","ident_utf16":{"start":{"line_number":513,"utf16_col":8},"end":{"line_number":513,"utf16_col":37}},"extent_utf16":{"start":{"line_number":513,"utf16_col":4},"end":{"line_number":521,"utf16_col":30}}},{"name":"get_vehicle_images","kind":"function","ident_start":31821,"ident_end":31839,"extent_start":31817,"extent_end":32571,"fully_qualified_name":"Rivian.get_vehicle_images","ident_utf16":{"start":{"line_number":523,"utf16_col":8},"end":{"line_number":523,"utf16_col":26}},"extent_utf16":{"start":{"line_number":523,"utf16_col":4},"end":{"line_number":534,"utf16_col":30}}},{"name":"user","kind":"function","ident_start":32581,"ident_end":32585,"extent_start":32577,"extent_end":34665,"fully_qualified_name":"Rivian.user","ident_utf16":{"start":{"line_number":536,"utf16_col":8},"end":{"line_number":536,"utf16_col":12}},"extent_utf16":{"start":{"line_number":536,"utf16_col":4},"end":{"line_number":545,"utf16_col":30}}},{"name":"get_charging_schedule","kind":"function","ident_start":34675,"ident_end":34696,"extent_start":34671,"extent_end":35251,"fully_qualified_name":"Rivian.get_charging_schedule","ident_utf16":{"start":{"line_number":547,"utf16_col":8},"end":{"line_number":547,"utf16_col":29}},"extent_utf16":{"start":{"line_number":547,"utf16_col":4},"end":{"line_number":557,"utf16_col":30}}},{"name":"get_completed_session_summaries","kind":"function","ident_start":35263,"ident_end":35294,"extent_start":35259,"extent_end":35907,"fully_qualified_name":"Rivian.get_completed_session_summaries","ident_utf16":{"start":{"line_number":561,"utf16_col":8},"end":{"line_number":561,"utf16_col":39}},"extent_utf16":{"start":{"line_number":561,"utf16_col":4},"end":{"line_number":569,"utf16_col":30}}},{"name":"get_charging_session_status","kind":"function","ident_start":35918,"ident_end":35945,"extent_start":35914,"extent_end":36507,"fully_qualified_name":"Rivian.get_charging_session_status","ident_utf16":{"start":{"line_number":572,"utf16_col":8},"end":{"line_number":572,"utf16_col":35}},"extent_utf16":{"start":{"line_number":572,"utf16_col":4},"end":{"line_number":583,"utf16_col":30}}},{"name":"get_non_rivian_user_session","kind":"function","ident_start":36518,"ident_end":36545,"extent_start":36514,"extent_end":37001,"fully_qualified_name":"Rivian.get_non_rivian_user_session","ident_utf16":{"start":{"line_number":586,"utf16_col":8},"end":{"line_number":586,"utf16_col":35}},"extent_utf16":{"start":{"line_number":586,"utf16_col":4},"end":{"line_number":594,"utf16_col":30}}},{"name":"get_live_session_data","kind":"function","ident_start":37011,"ident_end":37032,"extent_start":37007,"extent_end":38140,"fully_qualified_name":"Rivian.get_live_session_data","ident_utf16":{"start":{"line_number":596,"utf16_col":8},"end":{"line_number":596,"utf16_col":29}},"extent_utf16":{"start":{"line_number":596,"utf16_col":4},"end":{"line_number":613,"utf16_col":30}}},{"name":"get_live_session_history","kind":"function","ident_start":38151,"ident_end":38175,"extent_start":38147,"extent_end":38671,"fully_qualified_name":"Rivian.get_live_session_history","ident_utf16":{"start":{"line_number":616,"utf16_col":8},"end":{"line_number":616,"utf16_col":32}},"extent_utf16":{"start":{"line_number":616,"utf16_col":4},"end":{"line_number":626,"utf16_col":30}}},{"name":"send_vehicle_command","kind":"function","ident_start":39047,"ident_end":39067,"extent_start":39043,"extent_end":39889,"fully_qualified_name":"Rivian.send_vehicle_command","ident_utf16":{"start":{"line_number":634,"utf16_col":8},"end":{"line_number":634,"utf16_col":28}},"extent_utf16":{"start":{"line_number":634,"utf16_col":4},"end":{"line_number":652,"utf16_col":30}}}]}},"copilotInfo":null,"copilotAccessAllowed":false,"csrf_tokens":{"/the-mace/rivian-python-api/branches":{"post":"MgwDfWYBPhxHwDzMCZnfo2ITW6JoaBiz3S0bewx_uI_40HLAJmfTts_-KA3PcTih3dPOugbI6GmkAOhG67coVw"},"/repos/preferences":{"post":"iy4vz0Z4ZoygLWzHUgf-AKwV02d5RFBeE6nB3PwZ4wYFWae6ngIVpGnO_GHsPE6J3i-ud1U6oVAYjbFoWbJUJQ"}}},"title":"rivian-python-api/src/rivian_python_api/rivian_api.py at main · the-mace/rivian-python-api"} \ No newline at end of file From f09910b11400c2acb5d16f27eb50ba6e60f43e62 Mon Sep 17 00:00:00 2001 From: Ron Sweeney Date: Sun, 3 Mar 2024 18:29:44 -0500 Subject: [PATCH 2/3] quick build script --- build.sh | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 build.sh diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..034dcff --- /dev/null +++ b/build.sh @@ -0,0 +1,3 @@ +docker build -t rivian-databricks . +docker image tag rivian-databricks sween/rivian-databricks:latest +docker push sween/rivian-databricks:latest \ No newline at end of file From 8395f2aaec320c16d0b4f3e19d5afbfddabf87ae Mon Sep 17 00:00:00 2001 From: Ron Sweeney Date: Sun, 3 Mar 2024 18:37:46 -0500 Subject: [PATCH 3/3] oy vey --- src/rivian_api.py | 654 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 653 insertions(+), 1 deletion(-) diff --git a/src/rivian_api.py b/src/rivian_api.py index cef7e69..0b2c2b7 100644 --- a/src/rivian_api.py +++ b/src/rivian_api.py @@ -1 +1,653 @@ -{"payload":{"allShortcutsEnabled":false,"fileTree":{"src/rivian_python_api":{"items":[{"name":"__init__.py","path":"src/rivian_python_api/__init__.py","contentType":"file"},{"name":"rivian_api.py","path":"src/rivian_python_api/rivian_api.py","contentType":"file"},{"name":"rivian_cli.py","path":"src/rivian_python_api/rivian_cli.py","contentType":"file"},{"name":"rivian_map.py","path":"src/rivian_python_api/rivian_map.py","contentType":"file"}],"totalCount":4},"src":{"items":[{"name":"rivian_python_api","path":"src/rivian_python_api","contentType":"directory"}],"totalCount":1},"":{"items":[{"name":"bin","path":"bin","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":"tests","path":"tests","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".python-version","path":".python-version","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"pyproject.toml","path":"pyproject.toml","contentType":"file"},{"name":"requirements.txt","path":"requirements.txt","contentType":"file"},{"name":"techstack.md","path":"techstack.md","contentType":"file"},{"name":"techstack.yml","path":"techstack.yml","contentType":"file"}],"totalCount":11}},"fileTreeProcessingTime":15.464704,"foldersToFetch":[],"repo":{"id":606545184,"defaultBranch":"main","name":"rivian-python-api","ownerLogin":"the-mace","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2023-02-25T20:13:01.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/2512112?v=4","public":true,"private":false,"isOrgOwned":false},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"main","listCacheKey":"v0:1709235417.0","canEdit":false,"refType":"branch","currentOid":"ae750816879b45f7ba5b9c791c8a65d36a5179ee"},"path":"src/rivian_python_api/rivian_api.py","currentUser":null,"blob":{"rawLines":["import logging","import requests","import uuid","import time","","RIVIAN_BASE_PATH = \"https://rivian.com/api/gql\"","RIVIAN_GATEWAY_PATH = RIVIAN_BASE_PATH + \"/gateway/graphql\"","RIVIAN_CHARGING_PATH = RIVIAN_BASE_PATH + \"/chrg/user/graphql\"","RIVIAN_ORDERS_PATH = RIVIAN_BASE_PATH + '/orders/graphql'","RIVIAN_CONTENT_PATH = RIVIAN_BASE_PATH + '/content/graphql'","RIVIAN_TRANSACTIONS_PATH = RIVIAN_BASE_PATH + '/t2d/graphql'","","log = logging.getLogger(__name__)","","HEADERS = {"," \"User-Agent\": \"RivianApp/1304 CFNetwork/1404.0.5 Darwin/22.3.0\","," \"Accept\": \"application/json\","," \"Content-Type\": \"application/json\","," \"Apollographql-Client-Name\": \"com.rivian.ios.consumer-apollo-ios\",","}","","","class Rivian:"," def __init__(self):"," self._close_session = False"," self._session_token = \"\""," self._access_token = \"\""," self._refresh_token = \"\""," self._app_session_token = \"\""," self._user_session_token = \"\""," self.client_id = \"\""," self.client_secret = \"\""," self.request_timeout = \"\""," self._csrf_token = \"\"",""," self.otp_needed = False"," self._otp_token = \"\"",""," def login(self, username, password):"," self.create_csrf_token()"," url = RIVIAN_GATEWAY_PATH"," headers = HEADERS"," headers.update("," {"," \"Csrf-Token\": self._csrf_token,"," \"A-Sess\": self._app_session_token,"," \"Apollographql-Client-Name\": \"com.rivian.ios.consumer-apollo-ios\","," \"Dc-Cid\": f\"m-ios-{uuid.uuid4()}\","," }"," )",""," query = {"," \"operationName\": \"Login\","," \"query\": \"mutation Login($email: String!, $password: String!) {\\n login(email: $email, password: $password) {\\n __typename\\n ... on MobileLoginResponse {\\n __typename\\n accessToken\\n refreshToken\\n userSessionToken\\n }\\n ... on MobileMFALoginResponse {\\n __typename\\n otpToken\\n }\\n }\\n}\","," \"variables\": {\"email\": username, \"password\": password},"," }",""," response = self.raw_graphql_query(url=url, query=query, headers=headers)"," response_json = response.json()"," if response.status_code == 200 and response_json[\"data\"] and \"login\" in response_json[\"data\"]:"," login_data = response_json[\"data\"][\"login\"]"," if \"otpToken\" in login_data:"," self.otp_needed = True"," self._otp_token = login_data[\"otpToken\"]"," else:"," self._access_token = login_data[\"accessToken\"]"," self._refresh_token = login_data[\"refreshToken\"]"," self._user_session_token = login_data[\"userSessionToken\"]"," else:"," message = f\"Status: {response.status_code}: Details: {response_json}\""," print(f\"Login failed: {message}\")"," raise Exception(message)"," return response",""," def login_with_otp(self, username, otpCode, otpToken=None):"," if self._csrf_token == \"\":"," self.create_csrf_token()"," url = RIVIAN_GATEWAY_PATH"," headers = HEADERS"," headers.update("," {"," \"Csrf-Token\": self._csrf_token,"," \"A-Sess\": self._app_session_token,"," \"Apollographql-Client-Name\": \"com.rivian.ios.consumer-apollo-ios\","," }"," )",""," query = {"," \"operationName\": \"LoginWithOTP\","," \"query\": \"mutation LoginWithOTP($email: String!, $otpCode: String!, $otpToken: String!) {\\n loginWithOTP(email: $email, otpCode: $otpCode, otpToken: $otpToken) {\\n __typename\\n ... on MobileLoginResponse {\\n __typename\\n accessToken\\n refreshToken\\n userSessionToken\\n }\\n }\\n}\","," \"variables\": {"," \"email\": username,"," \"otpCode\": otpCode,"," \"otpToken\": otpToken or self._otp_token,"," },"," }",""," response = self.raw_graphql_query(url=url, query=query, headers=headers)"," response_json = response.json()"," if response.status_code == 200 and response_json[\"data\"] and \"loginWithOTP\" in response_json[\"data\"]:"," login_data = response_json[\"data\"][\"loginWithOTP\"]"," self._access_token = login_data[\"accessToken\"]"," self._refresh_token = login_data[\"refreshToken\"]"," self._user_session_token = login_data[\"userSessionToken\"]"," else:"," message = f\"Status: {response.status_code}: Details: {response_json}\""," print(f\"Login with otp failed: {message}\")"," raise Exception(message)"," return response",""," def create_csrf_token(self):"," url = RIVIAN_GATEWAY_PATH"," headers = HEADERS",""," query = {"," \"operationName\": \"CreateCSRFToken\","," \"query\": \"mutation CreateCSRFToken {createCsrfToken {__typename csrfToken appSessionToken}}\","," \"variables\": None,"," }",""," response = self.raw_graphql_query(url=url, query=query, headers=headers)"," response_json = response.json()"," csrf_data = response_json[\"data\"][\"createCsrfToken\"]"," self._csrf_token = csrf_data[\"csrfToken\"]"," self._app_session_token = csrf_data[\"appSessionToken\"]"," return response",""," def raw_graphql_query(self, url, query, headers):"," response = requests.post(url, json=query, headers=headers)"," if response.status_code != 200:"," log.warning(f\"Graphql error: Response status: {response.status_code} Reason: {response.reason}\")"," return response",""," def gateway_headers(self):"," headers = HEADERS"," headers.update("," {"," \"Csrf-Token\": self._csrf_token,"," \"A-Sess\": self._app_session_token,"," \"U-Sess\": self._user_session_token,"," \"Dc-Cid\": f\"m-ios-{uuid.uuid4()}\","," }"," )"," return headers",""," def transaction_headers(self):"," headers = self.gateway_headers()"," headers.update("," {"," \"dc-cid\": f\"t2d--{uuid.uuid4()}--{uuid.uuid4()}\","," \"csrf-token\": self._csrf_token,"," \"app-id\": \"t2d\""," }"," )"," return headers",""," def vehicle_orders(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"vehicleOrders\","," \"query\": \"query vehicleOrders { orders(input: {orderTypes: [PRE_ORDER, VEHICLE], pageInfo: {from: 0, size: 10000}}) { __typename data { __typename id orderDate state configurationStatus fulfillmentSummaryStatus items { __typename sku } consumerStatuses { __typename isConsumerFlowComplete } } } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def delivery(self, order_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"delivery\","," \"query\": \"query delivery($orderId: ID!) { delivery(orderId: $orderId) { __typename status carrier deliveryAddress { __typename addressLine1 addressLine2 city state country zipcode } appointmentDetails { __typename appointmentId startDateTime endDateTime timeZone } vehicleVIN } }\","," \"variables\": {"," \"orderId\": order_id,"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def transaction_status(self, order_id):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"transactionStatus\","," \"query\": \"query transactionStatus($orderId: ID!) { transactionStatus(orderId: $orderId) { titleAndReg { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } tradeIn { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } finance { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } delivery { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } insurance { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } documentUpload { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } contracts { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } payment { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } } }\","," \"variables\": {"," \"orderId\": order_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_TRANSACTIONS_PATH, query=query, headers=headers)"," return response.json()",""," def finance_summary(self, order_id):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"financeSummary\","," \"query\": \"query financeSummary($orderId: ID!) { ...FinanceSummaryFragment } fragment FinanceSummaryFragment on Query { financeSummary(orderId: $orderId) { orderId status financeChoice { financeChoice institutionName paymentMethod trackingNumber preApprovedAmount loanOfficerName loanOfficerContact downPayment rate term rateAndTermSkipped } } }\","," \"variables\": {\"orderId\": order_id},"," }"," response = self.raw_graphql_query(url=RIVIAN_TRANSACTIONS_PATH, query=query, headers=headers)"," return response.json()",""," def order(self, order_id):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"order\","," \"query\": \"query order($id: String!) { order(id: $id) { vin state billingAddress { firstName lastName line1 line2 city state country postalCode } shippingAddress { firstName lastName line1 line2 city state country postalCode } orderCancelDate orderEmail currency locale storeId type subtotal discountTotal taxTotal feesTotal paidTotal remainingTotal outstandingBalance costAfterCredits total payments { id intent date method amount referenceNumber status card { last4 expiryDate brand } bank { bankName country last4 } transactionNotes } tradeIns { tradeInReferenceId amount } vehicle { vehicleId vin modelYear model make } items { id discounts { total items { amount title code } } subtotal quantity title productId type unitPrice fees { items { description amount code type } total } taxes { items { description amount code rate type } total } sku shippingAddress { firstName lastName line1 line2 city state country postalCode } configuration { ruleset { meta { rulesetId storeId country vehicle version effectiveDate currency locale availableLocales } defaults { basePrice initialSelection } groups options specs rules } basePrice version options { optionId optionName optionDetails { name attrs price visualExterior visualInterior hidden disabled required } groupId groupName groupDetails { name attrs multiselect required options } price } } } }}\","," \"variables\": {\"id\": order_id},"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def retail_orders(self):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"searchOrders\","," \"query\": \"query searchOrders($input: UserOrderSearchInput!) { searchOrders(input: $input) { total data { id type orderDate state fulfillmentSummaryStatus items { id title type sku __typename } __typename } __typename }}\","," \"variables\": {"," \"input\": {"," \"orderTypes\": [\"RETAIL\"],"," \"orderStates\": None,"," \"pageInfo\": {"," \"from\": 0,"," \"size\": 5"," },"," \"dateRange\": None,"," \"sortFields\": {"," \"orderDate\": \"DESC\""," }"," }"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def get_order(self, order_id):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"getOrder\","," \"query\": \"query getOrder($orderId: String!) { order(id: $orderId) { id storeId userId orderDate orderCancelDate type state currency locale subtotal discountTotal taxTotal total shippingAddress { firstName lastName line1 line2 city state country postalCode __typename } payments { method currency status type card { last4 expiryDate brand __typename } __typename } items { id title type sku unitPrice quantity state productDetails { ... on ChildProduct { dimensionValues { name valueName localizedStrings __typename } __typename } __typename } __typename } fulfillmentSummaryStatus fulfillmentInfo { fulfillments { fulfillmentId fulfillmentStatus fulfillmentMethod fulfillmentVendor tracking { status carrier number url shipDate deliveredDate serviceType __typename } estimatedDeliveryWindow { startDate endDate __typename } items { orderItemId quantityFulfilled isPartialFulfillment __typename } __typename } pendingFulfillmentItems { orderItemId quantity __typename } __typename } __typename }}\","," \"variables\": {"," \"orderId\": order_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def payment_methods(self):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"paymentMethods\","," \"query\": \"query paymentMethods { paymentMethods { id type default card { lastFour brand expiration postalCode } } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def get_user_information(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getUserInfo\","," \"query\": \"query getUserInfo { currentUser { __typename id firstName lastName email address { __typename country } vehicles { __typename id name owner roles vin vas { __typename vasVehicleId vehiclePublicKey } state createdAt updatedAt vehicle { __typename id vin modelYear make model expectedBuildDate plannedBuildDate expectedGeneralAssemblyStartDate actualGeneralAssemblyDate mobileConfiguration { __typename trimOption { __typename optionId optionName } exteriorColorOption { __typename optionId optionName } interiorColorOption { __typename optionId optionName } } vehicleState { __typename supportedFeatures { __typename name status } } otaEarlyAccessStatus } settings { __typename name { __typename value } } } enrolledPhones { __typename vas { __typename vasPhoneId publicKey } enrolled { __typename deviceType deviceName vehicleId identityId shortName } } pendingInvites { __typename id invitedByFirstName role status vehicleId vehicleModel email } } }\","," # \"query\": \"query getUserInfo {currentUser {__typename id firstName lastName email address { __typename country } vehicles {id name owner roles vin vas {__typename vasVehicleId vehiclePublicKey } state createdAt updatedAt vehicle { __typename id vin modelYear make model expectedBuildDate plannedBuildDate expectedGeneralAssemblyStartDate actualGeneralAssemblyDate } } }}\","," \"variables\": None,"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def get_vehicle_state(self, vehicle_id, minimal=False):"," headers = self.gateway_headers()"," if minimal:"," query = \"query GetVehicleState($vehicleID: String!) { vehicleState(id: $vehicleID) { \" \\"," \"cloudConnection { lastSync } \" \\"," \"powerState { value } \" \\"," \"driveMode { value } \" \\"," \"gearStatus { value } \" \\"," \"vehicleMileage { value } \" \\"," \"batteryLevel { value } \" \\"," \"distanceToEmpty { value } \" \\"," \"gnssLocation { latitude longitude } \" \\"," \"gnssSpeed { value } \" \\"," \"chargerStatus { value } \" \\"," \"chargerState { value } \" \\"," \"batteryLimit { value } \" \\"," \"timeToEndOfCharge { value } \" \\"," \"} }\""," else:"," query = \"query GetVehicleState($vehicleID: String!) { \" \\"," \"vehicleState(id: $vehicleID) { __typename \" \\"," \"cloudConnection { __typename lastSync } \" \\"," \"gnssLocation { __typename latitude longitude timeStamp } \" \\"," \"gnssSpeed { __typename timeStamp value } \" \\"," \"gnssBearing { __typename timeStamp value } \" \\"," \"gnssAltitude { __typename timeStamp value } \" \\"," \"gnssError { __typename timeStamp positionVertical positionHorizontal speed bearing } \" \\"," \"alarmSoundStatus { __typename timeStamp value } \" \\"," \"timeToEndOfCharge { __typename timeStamp value } \" \\"," \"doorFrontLeftLocked { __typename timeStamp value } \" \\"," \"doorFrontLeftClosed { __typename timeStamp value } \" \\"," \"doorFrontRightLocked { __typename timeStamp value } \" \\"," \"doorFrontRightClosed { __typename timeStamp value } \" \\"," \"doorRearLeftLocked { __typename timeStamp value } \" \\"," \"doorRearLeftClosed { __typename timeStamp value } \" \\"," \"doorRearRightLocked { __typename timeStamp value } \" \\"," \"doorRearRightClosed { __typename timeStamp value } \" \\"," \"windowFrontLeftClosed { __typename timeStamp value } \" \\"," \"windowFrontRightClosed { __typename timeStamp value } \" \\"," \"windowRearLeftClosed { __typename timeStamp value } \" \\"," \"windowRearRightClosed { __typename timeStamp value } \" \\"," \"windowFrontLeftCalibrated { __typename timeStamp value } \" \\"," \"windowFrontRightCalibrated { __typename timeStamp value } \" \\"," \"windowRearLeftCalibrated { __typename timeStamp value } \" \\"," \"windowRearRightCalibrated { __typename timeStamp value } \" \\"," \"windowsNextAction { __typename timeStamp value } \" \\"," \"closureFrunkLocked { __typename timeStamp value } \" \\"," \"closureFrunkClosed { __typename timeStamp value } \" \\"," \"closureFrunkNextAction { __typename timeStamp value } \" \\"," \"gearGuardLocked { __typename timeStamp value } \" \\"," \"closureLiftgateLocked { __typename timeStamp value } \" \\"," \"closureLiftgateClosed { __typename timeStamp value } \" \\"," \"closureLiftgateNextAction { __typename timeStamp value } \" \\"," \"windowRearLeftClosed { __typename timeStamp value } \" \\"," \"windowRearRightClosed { __typename timeStamp value } \" \\"," \"closureSideBinLeftLocked { __typename timeStamp value } \" \\"," \"closureSideBinLeftClosed { __typename timeStamp value } \" \\"," \"closureSideBinRightLocked { __typename timeStamp value } \" \\"," \"closureSideBinRightClosed { __typename timeStamp value } \" \\"," \"closureTailgateLocked { __typename timeStamp value } \" \\"," \"closureTailgateClosed { __typename timeStamp value } \" \\"," \"closureTonneauLocked { __typename timeStamp value } \" \\"," \"closureTonneauClosed { __typename timeStamp value } \" \\"," \"wiperFluidState { __typename timeStamp value } \" \\"," \"powerState { __typename timeStamp value } \" \\"," \"batteryHvThermalEventPropagation { __typename timeStamp value } \" \\"," \"vehicleMileage { __typename timeStamp value } \" \\"," \"brakeFluidLow { __typename timeStamp value } \" \\"," \"gearStatus { __typename timeStamp value } \" \\"," \"tirePressureStatusFrontLeft { __typename timeStamp value } \" \\"," \"tirePressureStatusValidFrontLeft { __typename timeStamp value } \" \\"," \"tirePressureStatusFrontRight { __typename timeStamp value } \" \\"," \"tirePressureStatusValidFrontRight { __typename timeStamp value } \" \\"," \"tirePressureStatusRearLeft { __typename timeStamp value } \" \\"," \"tirePressureStatusValidRearLeft { __typename timeStamp value } \" \\"," \"tirePressureStatusRearRight { __typename timeStamp value } \" \\"," \"tirePressureStatusValidRearRight { __typename timeStamp value } \" \\"," \"batteryLevel { __typename timeStamp value } \" \\"," \"chargerState { __typename timeStamp value } \" \\"," \"batteryLimit { __typename timeStamp value } \" \\"," \"batteryCapacity { __typename timeStamp value } \" \\"," \"remoteChargingAvailable { __typename timeStamp value } \" \\"," \"batteryHvThermalEvent { __typename timeStamp value } \" \\"," \"rangeThreshold { __typename timeStamp value } \" \\"," \"distanceToEmpty { __typename timeStamp value } \" \\"," \"otaAvailableVersion { __typename timeStamp value } \" \\"," \"otaAvailableVersionWeek { __typename timeStamp value } \" \\"," \"otaAvailableVersionYear { __typename timeStamp value } \" \\"," \"otaCurrentVersion { __typename timeStamp value } \" \\"," \"otaCurrentVersionNumber { __typename timeStamp value } \" \\"," \"otaCurrentVersionWeek { __typename timeStamp value } \" \\"," \"otaCurrentVersionYear { __typename timeStamp value } \" \\"," \"otaDownloadProgress { __typename timeStamp value } \" \\"," \"otaInstallDuration { __typename timeStamp value } \" \\"," \"otaInstallProgress { __typename timeStamp value } \" \\"," \"otaInstallReady { __typename timeStamp value } \" \\"," \"otaInstallTime { __typename timeStamp value } \" \\"," \"otaInstallType { __typename timeStamp value } \" \\"," \"otaStatus { __typename timeStamp value } \" \\"," \"otaCurrentStatus { __typename timeStamp value } \" \\"," \"cabinClimateInteriorTemperature { __typename timeStamp value } \" \\"," \"cabinPreconditioningStatus { __typename timeStamp value } \" \\"," \"cabinPreconditioningType { __typename timeStamp value } \" \\"," \"petModeStatus { __typename timeStamp value } \" \\"," \"petModeTemperatureStatus { __typename timeStamp value } \" \\"," \"cabinClimateDriverTemperature { __typename timeStamp value } \" \\"," \"gearGuardVideoStatus { __typename timeStamp value } \" \\"," \"gearGuardVideoMode { __typename timeStamp value } \" \\"," \"gearGuardVideoTermsAccepted { __typename timeStamp value } \" \\"," \"defrostDefogStatus { __typename timeStamp value } \" \\"," \"steeringWheelHeat { __typename timeStamp value } \" \\"," \"seatFrontLeftHeat { __typename timeStamp value } \" \\"," \"seatFrontRightHeat { __typename timeStamp value } \" \\"," \"seatRearLeftHeat { __typename timeStamp value } \" \\"," \"seatRearRightHeat { __typename timeStamp value } \" \\"," \"chargerStatus { __typename timeStamp value } \" \\"," \"seatFrontLeftVent { __typename timeStamp value } \" \\"," \"seatFrontRightVent { __typename timeStamp value } \" \\"," \"chargerDerateStatus { __typename timeStamp value } \" \\"," \"driveMode { __typename timeStamp value } \" \\"," \"limitedAccelCold { __typename timeStamp value } \" \\"," \"limitedRegenCold { __typename timeStamp value } \" \\"," \"twelveVoltBatteryHealth { __typename timeStamp value } \" \\"," \"serviceMode { __typename timeStamp value } \" \\"," \"trailerStatus { __typename timeStamp value } \" \\"," \"btmFfHardwareFailureStatus { __typename timeStamp value } \" \\"," \"btmIcHardwareFailureStatus { __typename timeStamp value } \" \\"," \"btmLfdHardwareFailureStatus { __typename timeStamp value } \" \\"," \"btmRfHardwareFailureStatus { __typename timeStamp value } \" \\"," \"btmRfdHardwareFailureStatus { __typename timeStamp value } \" \\"," \"carWashMode { __typename timeStamp value } \" \\"," \"chargePortState { __typename timeStamp value } \" \\"," \"chargingTimeEstimationValidity { __typename timeStamp value } \" \\"," \"rearHitchStatus { __typename timeStamp value } \" \\"," \"} }\"",""," query = {"," \"operationName\": \"GetVehicleState\","," \"query\": query,"," \"variables\": {"," 'vehicleID': vehicle_id,"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def get_vehicle_last_connection(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetVehicleLastConnection\","," \"query\": \"query GetVehicleLastConnection($vehicleID: String!) { vehicleState(id: $vehicleID) { __typename cloudConnection { __typename lastSync } } }\","," \"variables\": {"," 'vehicleID': vehicle_id,"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def plan_trip(self, vehicle_id, starting_soc, starting_range_meters, origin_lat, origin_long, dest_lat, dest_long):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"planTrip\","," \"query\": \"query planTrip($origin: CoordinatesInput!, $destination: CoordinatesInput!, $bearing: Float!, $vehicleId: String!, $startingSoc: Float!, $startingRangeMeters: Float!) { planTrip(bearing: $bearing, vehicleId: $vehicleId, startingSoc: $startingSoc, origin: $origin, destination: $destination, startingRangeMeters: $startingRangeMeters) { routes { routeResponse destinationReached totalChargingDuration arrivalSOC arrivalReachableDistance waypoints { waypointType entityId name latitude longitude maxPower chargeDuration arrivalSOC arrivalReachableDistance departureSOC departureReachableDistance } energyConsumptionOnLeg batteryEmptyToDestinationDistance batteryEmptyLocationLatitude batteryEmptyLocationLongitude } tripPlanStatus chargeStationsAvailable socBelowLimit } }\","," \"variables\": {"," 'origin': {"," 'latitude': origin_lat,"," 'longitude': origin_long,"," },"," 'destination': {"," 'latitude': dest_lat,"," 'longitude': dest_long,"," },"," 'bearing': 0,"," 'vehicleId': vehicle_id,"," 'startingRangeMeters': starting_range_meters,"," 'startingSoc': starting_soc,"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def get_ota_details(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetVehicle\","," \"query\": \"query GetVehicle($vehicleId: String!) { getVehicle(id: $vehicleId) { availableOTAUpdateDetails { url version locale } currentOTAUpdateDetails { url version locale } } }\","," \"variables\": {"," 'vehicleId': vehicle_id,"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def check_by_rivian_id(self):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"CheckByRivianId\","," \"query\": \"query CheckByRivianId { chargepoint { checkByRivianId } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()",""," def get_linked_email_for_rivian_id(self):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"getLinkedEmailForRivianId\","," \"query\": \"query getLinkedEmailForRivianId { chargepoint { getLinkedEmailForRivianId { email } } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()",""," def get_parameter_store_values(self):"," headers = self.transaction_headers()"," query = {"," \"operationName\": \"getParameterStoreValues\","," \"query\": \"query getParameterStoreValues($keys: [String!]!) { getParameterStoreValues(keys: $keys) { key value } }\","," \"variables\": {"," \"keys\": [\"FF_ACCOUNT_ESTIMATED_DELIVERY_WINDOW_STATIC_MSG\"]"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def get_vehicle(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetVehicle\","," \"query\": \"query GetVehicle($getVehicleId: String) { getVehicle(id: $getVehicleId) { invitedUsers { __typename ... on ProvisionedUser { devices { type mappedIdentityId id hrid deviceName isPaired isEnabled } firstName lastName email roles userId } ... on UnprovisionedUser { email inviteId status } } } }\","," \"variables\": {"," \"getVehicleId\": vehicle_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def get_registered_wallboxes(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getRegisteredWallboxes\","," \"variables\": {},"," \"query\": \"query getRegisteredWallboxes { getRegisteredWallboxes { __typename wallboxId userId wifiId name linked latitude longitude chargingStatus power currentVoltage currentAmps softwareVersion model serialNumber maxPower maxVoltage maxAmps } }\""," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()",""," def get_provisioned_camp_speakers(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetProvisionedCampSpeakers\","," \"query\": \"query GetProvisionedCampSpeakers { currentUser { __typename vehicles { __typename id connectedProducts { __typename ... on CampSpeaker { serialNumber id } } } } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def get_vehicle_images(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getVehicleImages\","," \"query\": \"query getVehicleImages($extension: String!, $resolution: String!) { getVehicleOrderMobileImages(resolution: $resolution, extension: $extension) { __typename orderId url resolution size design placement } getVehicleMobileImages(resolution: $resolution, extension: $extension) { __typename vehicleId url resolution size design placement } }\","," \"variables\": {"," \"extension\": \"webp\","," \"resolution\": \"hdpi\""," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()",""," def user(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"user\","," # \"query\": \"query user { user { email { email } phone { formatted } firstName lastName addresses { id type line1 line2 city state country postalCode } newsletterSubscription smsSubscription registrationChannels2FA userId vehicles {id highestPriorityRole __typename } orderSnapshots(filterTypes: [PRE_ORDER, VEHICLE]) { ...OrderSnapshotsFragment __typename } __typename }} fragment OrderSnapshotsFragment on OrderSnapshot { id total paidTotal subtotal state configurationStatus currency orderDate type fulfillmentSummaryStatus items { id total unitPrice quantity productDetails { ... on VehicleProduct { sku store { country __typename } __typename } ... on StandaloneProduct { sku store { country __typename } __typename } ... on ChildProduct { sku store { country __typename } __typename } __typename } configuration { basePrice ruleset { meta { locale currency country vehicle version rulesetId effectiveDate __typename } groups rules specs options defaults { basePrice initialSelection __typename } __typename } options { optionId groupId price optionDetails { name attrs price visualExterior visualInterior __typename } __typename } __typename } __typename } __typename } } } \","," \"query\": \"query user { user { email { email } phone { formatted } firstName lastName addresses { id type line1 line2 city state country postalCode } newsletterSubscription smsSubscription registrationChannels2FA userId vehicles {id highestPriorityRole __typename } invites (filterStates: [PENDING]) {id inviteState vehicleModel vehicleId creatorFirstName} orderSnapshots(filterTypes: [PRE_ORDER, VEHICLE, RETAIL]) { ...OrderSnapshotsFragment } }} fragment OrderSnapshotsFragment on OrderSnapshot { id total paidTotal subtotal state configurationStatus currency orderDate type fulfillmentSummaryStatus }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers)"," return response.json()",""," def get_charging_schedule(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetChargingSchedule\","," \"query\": \"query GetChargingSchedule($vehicleId: String!) { getVehicle(id: $vehicleId) { chargingSchedules { startTime duration location { latitude longitude } amperage enabled weekDays } } }\","," \"variables\": {"," \"vehicleId\": vehicle_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()","","",""," def get_completed_session_summaries(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getCompletedSessionSummaries\","," \"query\": \"query getCompletedSessionSummaries { getCompletedSessionSummaries { chargerType currencyCode paidTotal startInstant endInstant totalEnergyKwh rangeAddedKm city transactionId vehicleId vehicleName vendor isRoamingNetwork isPublic isHomeCharger meta { transactionIdGroupingKey dataSources } }}\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()","",""," def get_charging_session_status(self, job_id, user_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"GetChargingSessionStatus\","," \"query\": \"query GetChargingSessionStatus($jobId: ID!, $userId: ID!) { getSessionStatus(jobId: $jobId, userId: $userId) { status errorMessage errorId sessionId } }\","," \"variables\": {"," \"jobId\": \"123\","," \"userId\": \"123\""," },"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()","",""," def get_non_rivian_user_session(self):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getNonRivianUserSession\","," \"query\": \"query getNonRivianUserSession { getNonRivianUserSession { chargerId transactionId isRivianCharger vehicleChargerState { value updatedAt } } }\","," \"variables\": {},"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()",""," def get_live_session_data(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getLiveSessionData\","," \"query\": \"query getLiveSessionData($vehicleId: ID) \""," \"{ getLiveSessionData(vehicleId: $vehicleId) \""," \"{ isRivianCharger isFreeSession vehicleChargerState { value updatedAt } \""," \"chargerId startTime timeElapsed timeRemaining { value updatedAt } kilometersChargedPerHour \""," \"{ value updatedAt } power { value updatedAt } rangeAddedThisSession { value updatedAt } \""," \"totalChargedEnergy { value updatedAt } timeRemaining { value updatedAt } vehicleChargerState \""," \"{ value updatedAt } kilometersChargedPerHour { value updatedAt } \""," \"currentPrice soc { value } currentMiles { value } current { value } } }\","," \"variables\": {"," \"vehicleId\": vehicle_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()","",""," def get_live_session_history(self, vehicle_id):"," headers = self.gateway_headers()"," query = {"," \"operationName\": \"getLiveSessionHistory\","," \"query\": \"query getLiveSessionHistory($vehicleId: ID) { getLiveSessionHistory(vehicleId: $vehicleId) { chartData { kw time } } }\","," \"variables\": {"," \"vehicleId\": vehicle_id"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers)"," return response.json()","",""," # Vehicle commands require an HMAC signature to be sent with the request."," # The HMAC is generated using the command name and the current timestamp,"," # using a shared key generated from the phone’s private key and the vehicle’s"," # public key. The vehicle’s public key is available in the vehiclePublicKey"," # field of the getUserInfo endpoint."," def send_vehicle_command(self, vehicle_id, command, vasPhoneId, deviceId, vehiclePublicKey):"," headers = self.gateway_headers()",""," query = {"," \"operationName\": \"sendVehicleCommand\","," \"query\": \"mutation sendVehicleCommand($attrs: VehicleCommandAttributes!) { sendVehicleCommand(attrs: $attrs) { __typename id command state } }\","," \"variables\": {"," \"attrs\": {"," \"command\": command,"," \"hmac\": 0, #your-hmac"," \"timestamp\": time.time(),"," \"vasPhoneId\": vasPhoneId,"," \"deviceId\": deviceId,"," \"vehicleId\": vehicle_id,"," }"," },"," }"," response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers)"," return response.json()"],"stylingDirectives":[[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":14,"cssClass":"pl-s1"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":15,"cssClass":"pl-s1"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":11,"cssClass":"pl-s1"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":11,"cssClass":"pl-s1"}],[],[{"start":0,"end":16,"cssClass":"pl-v"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":47,"cssClass":"pl-s"}],[{"start":0,"end":19,"cssClass":"pl-v"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":38,"cssClass":"pl-v"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":59,"cssClass":"pl-s"}],[{"start":0,"end":20,"cssClass":"pl-v"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":23,"end":39,"cssClass":"pl-v"},{"start":40,"end":41,"cssClass":"pl-c1"},{"start":42,"end":62,"cssClass":"pl-s"}],[{"start":0,"end":18,"cssClass":"pl-v"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":37,"cssClass":"pl-v"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":40,"end":57,"cssClass":"pl-s"}],[{"start":0,"end":19,"cssClass":"pl-v"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":38,"cssClass":"pl-v"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":59,"cssClass":"pl-s"}],[{"start":0,"end":24,"cssClass":"pl-v"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":43,"cssClass":"pl-v"},{"start":44,"end":45,"cssClass":"pl-c1"},{"start":46,"end":60,"cssClass":"pl-s"}],[],[{"start":0,"end":3,"cssClass":"pl-s1"},{"start":4,"end":5,"cssClass":"pl-c1"},{"start":6,"end":13,"cssClass":"pl-s1"},{"start":14,"end":23,"cssClass":"pl-en"},{"start":24,"end":32,"cssClass":"pl-s1"}],[],[{"start":0,"end":7,"cssClass":"pl-v"},{"start":8,"end":9,"cssClass":"pl-c1"}],[{"start":4,"end":16,"cssClass":"pl-s"},{"start":18,"end":67,"cssClass":"pl-s"}],[{"start":4,"end":12,"cssClass":"pl-s"},{"start":14,"end":32,"cssClass":"pl-s"}],[{"start":4,"end":18,"cssClass":"pl-s"},{"start":20,"end":38,"cssClass":"pl-s"}],[{"start":4,"end":31,"cssClass":"pl-s"},{"start":33,"end":69,"cssClass":"pl-s"}],[],[],[],[{"start":0,"end":5,"cssClass":"pl-k"},{"start":6,"end":12,"cssClass":"pl-v"}],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":16,"cssClass":"pl-en"},{"start":17,"end":21,"cssClass":"pl-s1"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":35,"cssClass":"pl-c1"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":32,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":26,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":31,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":32,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":36,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":32,"cssClass":"pl-s1"},{"start":33,"end":34,"cssClass":"pl-c1"},{"start":35,"end":37,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":22,"cssClass":"pl-s1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":27,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":26,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":31,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":28,"cssClass":"pl-s1"},{"start":29,"end":30,"cssClass":"pl-c1"},{"start":31,"end":33,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-s"}],[],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":23,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":26,"end":31,"cssClass":"pl-c1"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":23,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":26,"end":28,"cssClass":"pl-s"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":13,"cssClass":"pl-en"},{"start":14,"end":18,"cssClass":"pl-s1"},{"start":20,"end":28,"cssClass":"pl-s1"},{"start":30,"end":38,"cssClass":"pl-s1"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":30,"cssClass":"pl-en"}],[{"start":8,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":33,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":22,"cssClass":"pl-en"}],[],[{"start":16,"end":28,"cssClass":"pl-s"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":35,"end":46,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":31,"end":49,"cssClass":"pl-s1"}],[{"start":16,"end":43,"cssClass":"pl-s"},{"start":45,"end":81,"cssClass":"pl-s"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":49,"cssClass":"pl-s"},{"start":34,"end":48,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-kos"},{"start":35,"end":39,"cssClass":"pl-s1"},{"start":40,"end":45,"cssClass":"pl-en"},{"start":47,"end":48,"cssClass":"pl-kos"}],[],[],[],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":36,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":347,"cssClass":"pl-s"},{"start":75,"end":77,"cssClass":"pl-cce"},{"start":122,"end":124,"cssClass":"pl-cce"},{"start":138,"end":140,"cssClass":"pl-cce"},{"start":172,"end":174,"cssClass":"pl-cce"},{"start":190,"end":192,"cssClass":"pl-cce"},{"start":209,"end":211,"cssClass":"pl-cce"},{"start":229,"end":231,"cssClass":"pl-cce"},{"start":253,"end":255,"cssClass":"pl-cce"},{"start":260,"end":262,"cssClass":"pl-cce"},{"start":297,"end":299,"cssClass":"pl-cce"},{"start":315,"end":317,"cssClass":"pl-cce"},{"start":331,"end":333,"cssClass":"pl-cce"},{"start":338,"end":340,"cssClass":"pl-cce"},{"start":343,"end":345,"cssClass":"pl-cce"}],[{"start":12,"end":23,"cssClass":"pl-s"},{"start":26,"end":33,"cssClass":"pl-s"},{"start":35,"end":43,"cssClass":"pl-s1"},{"start":45,"end":55,"cssClass":"pl-s"},{"start":57,"end":65,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":49,"cssClass":"pl-s1"},{"start":51,"end":56,"cssClass":"pl-s1"},{"start":56,"end":57,"cssClass":"pl-c1"},{"start":57,"end":62,"cssClass":"pl-s1"},{"start":64,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":79,"cssClass":"pl-s1"}],[{"start":8,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":32,"cssClass":"pl-s1"},{"start":33,"end":37,"cssClass":"pl-en"}],[{"start":8,"end":10,"cssClass":"pl-k"},{"start":11,"end":19,"cssClass":"pl-s1"},{"start":20,"end":31,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":35,"end":38,"cssClass":"pl-c1"},{"start":39,"end":42,"cssClass":"pl-c1"},{"start":43,"end":56,"cssClass":"pl-s1"},{"start":57,"end":63,"cssClass":"pl-s"},{"start":65,"end":68,"cssClass":"pl-c1"},{"start":69,"end":76,"cssClass":"pl-s"},{"start":77,"end":79,"cssClass":"pl-c1"},{"start":80,"end":93,"cssClass":"pl-s1"},{"start":94,"end":100,"cssClass":"pl-s"}],[{"start":12,"end":22,"cssClass":"pl-s1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":38,"cssClass":"pl-s1"},{"start":39,"end":45,"cssClass":"pl-s"},{"start":47,"end":54,"cssClass":"pl-s"}],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":15,"end":25,"cssClass":"pl-s"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":29,"end":39,"cssClass":"pl-s1"}],[{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":38,"cssClass":"pl-c1"}],[{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":44,"cssClass":"pl-s1"},{"start":45,"end":55,"cssClass":"pl-s"}],[{"start":12,"end":16,"cssClass":"pl-k"}],[{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":34,"cssClass":"pl-s1"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":37,"end":47,"cssClass":"pl-s1"},{"start":48,"end":61,"cssClass":"pl-s"}],[{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":35,"cssClass":"pl-s1"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":38,"end":48,"cssClass":"pl-s1"},{"start":49,"end":63,"cssClass":"pl-s"}],[{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-s1"},{"start":41,"end":42,"cssClass":"pl-c1"},{"start":43,"end":53,"cssClass":"pl-s1"},{"start":54,"end":72,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-k"}],[{"start":12,"end":19,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":81,"cssClass":"pl-s"},{"start":32,"end":54,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-kos"},{"start":33,"end":41,"cssClass":"pl-s1"},{"start":42,"end":53,"cssClass":"pl-s1"},{"start":53,"end":54,"cssClass":"pl-kos"},{"start":65,"end":80,"cssClass":"pl-s1"},{"start":65,"end":66,"cssClass":"pl-kos"},{"start":66,"end":79,"cssClass":"pl-s1"},{"start":79,"end":80,"cssClass":"pl-kos"}],[{"start":12,"end":17,"cssClass":"pl-en"},{"start":18,"end":44,"cssClass":"pl-s"},{"start":34,"end":43,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-kos"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":42,"end":43,"cssClass":"pl-kos"}],[{"start":12,"end":17,"cssClass":"pl-k"},{"start":18,"end":27,"cssClass":"pl-v"},{"start":28,"end":35,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":22,"cssClass":"pl-en"},{"start":23,"end":27,"cssClass":"pl-s1"},{"start":29,"end":37,"cssClass":"pl-s1"},{"start":39,"end":46,"cssClass":"pl-s1"},{"start":48,"end":56,"cssClass":"pl-s1"},{"start":56,"end":57,"cssClass":"pl-c1"},{"start":57,"end":61,"cssClass":"pl-c1"}],[{"start":8,"end":10,"cssClass":"pl-k"},{"start":11,"end":15,"cssClass":"pl-s1"},{"start":16,"end":27,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":31,"end":33,"cssClass":"pl-s"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":34,"cssClass":"pl-en"}],[{"start":8,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":33,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":22,"cssClass":"pl-en"}],[],[{"start":16,"end":28,"cssClass":"pl-s"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":35,"end":46,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":31,"end":49,"cssClass":"pl-s1"}],[{"start":16,"end":43,"cssClass":"pl-s"},{"start":45,"end":81,"cssClass":"pl-s"}],[],[],[],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":43,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":321,"cssClass":"pl-s"},{"start":101,"end":103,"cssClass":"pl-cce"},{"start":174,"end":176,"cssClass":"pl-cce"},{"start":190,"end":192,"cssClass":"pl-cce"},{"start":224,"end":226,"cssClass":"pl-cce"},{"start":242,"end":244,"cssClass":"pl-cce"},{"start":261,"end":263,"cssClass":"pl-cce"},{"start":281,"end":283,"cssClass":"pl-cce"},{"start":305,"end":307,"cssClass":"pl-cce"},{"start":312,"end":314,"cssClass":"pl-cce"},{"start":317,"end":319,"cssClass":"pl-cce"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":23,"cssClass":"pl-s"},{"start":25,"end":33,"cssClass":"pl-s1"}],[{"start":16,"end":25,"cssClass":"pl-s"},{"start":27,"end":34,"cssClass":"pl-s1"}],[{"start":16,"end":26,"cssClass":"pl-s"},{"start":28,"end":36,"cssClass":"pl-s1"},{"start":37,"end":39,"cssClass":"pl-c1"},{"start":40,"end":44,"cssClass":"pl-s1"},{"start":45,"end":55,"cssClass":"pl-s1"}],[],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":49,"cssClass":"pl-s1"},{"start":51,"end":56,"cssClass":"pl-s1"},{"start":56,"end":57,"cssClass":"pl-c1"},{"start":57,"end":62,"cssClass":"pl-s1"},{"start":64,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":79,"cssClass":"pl-s1"}],[{"start":8,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":32,"cssClass":"pl-s1"},{"start":33,"end":37,"cssClass":"pl-en"}],[{"start":8,"end":10,"cssClass":"pl-k"},{"start":11,"end":19,"cssClass":"pl-s1"},{"start":20,"end":31,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":35,"end":38,"cssClass":"pl-c1"},{"start":39,"end":42,"cssClass":"pl-c1"},{"start":43,"end":56,"cssClass":"pl-s1"},{"start":57,"end":63,"cssClass":"pl-s"},{"start":65,"end":68,"cssClass":"pl-c1"},{"start":69,"end":83,"cssClass":"pl-s"},{"start":84,"end":86,"cssClass":"pl-c1"},{"start":87,"end":100,"cssClass":"pl-s1"},{"start":101,"end":107,"cssClass":"pl-s"}],[{"start":12,"end":22,"cssClass":"pl-s1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":38,"cssClass":"pl-s1"},{"start":39,"end":45,"cssClass":"pl-s"},{"start":47,"end":61,"cssClass":"pl-s"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":30,"cssClass":"pl-s1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":43,"cssClass":"pl-s1"},{"start":44,"end":57,"cssClass":"pl-s"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":44,"cssClass":"pl-s1"},{"start":45,"end":59,"cssClass":"pl-s"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":36,"cssClass":"pl-s1"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":39,"end":49,"cssClass":"pl-s1"},{"start":50,"end":68,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-k"}],[{"start":12,"end":19,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":81,"cssClass":"pl-s"},{"start":32,"end":54,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-kos"},{"start":33,"end":41,"cssClass":"pl-s1"},{"start":42,"end":53,"cssClass":"pl-s1"},{"start":53,"end":54,"cssClass":"pl-kos"},{"start":65,"end":80,"cssClass":"pl-s1"},{"start":65,"end":66,"cssClass":"pl-kos"},{"start":66,"end":79,"cssClass":"pl-s1"},{"start":79,"end":80,"cssClass":"pl-kos"}],[{"start":12,"end":17,"cssClass":"pl-en"},{"start":18,"end":53,"cssClass":"pl-s"},{"start":43,"end":52,"cssClass":"pl-s1"},{"start":43,"end":44,"cssClass":"pl-kos"},{"start":44,"end":51,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-kos"}],[{"start":12,"end":17,"cssClass":"pl-k"},{"start":18,"end":27,"cssClass":"pl-v"},{"start":28,"end":35,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":25,"cssClass":"pl-en"},{"start":26,"end":30,"cssClass":"pl-s1"}],[{"start":8,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":33,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-v"}],[],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":46,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":104,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"},{"start":25,"end":29,"cssClass":"pl-c1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":49,"cssClass":"pl-s1"},{"start":51,"end":56,"cssClass":"pl-s1"},{"start":56,"end":57,"cssClass":"pl-c1"},{"start":57,"end":62,"cssClass":"pl-s1"},{"start":64,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":79,"cssClass":"pl-s1"}],[{"start":8,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":32,"cssClass":"pl-s1"},{"start":33,"end":37,"cssClass":"pl-en"}],[{"start":8,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":33,"cssClass":"pl-s1"},{"start":34,"end":40,"cssClass":"pl-s"},{"start":42,"end":59,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":36,"cssClass":"pl-s1"},{"start":37,"end":48,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":43,"cssClass":"pl-s1"},{"start":44,"end":61,"cssClass":"pl-s"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":25,"cssClass":"pl-en"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":32,"end":35,"cssClass":"pl-s1"},{"start":37,"end":42,"cssClass":"pl-s1"},{"start":44,"end":51,"cssClass":"pl-s1"}],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":27,"cssClass":"pl-s1"},{"start":28,"end":32,"cssClass":"pl-en"},{"start":33,"end":36,"cssClass":"pl-s1"},{"start":38,"end":42,"cssClass":"pl-s1"},{"start":42,"end":43,"cssClass":"pl-c1"},{"start":43,"end":48,"cssClass":"pl-s1"},{"start":50,"end":57,"cssClass":"pl-s1"},{"start":57,"end":58,"cssClass":"pl-c1"},{"start":58,"end":65,"cssClass":"pl-s1"}],[{"start":8,"end":10,"cssClass":"pl-k"},{"start":11,"end":19,"cssClass":"pl-s1"},{"start":20,"end":31,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":35,"end":38,"cssClass":"pl-c1"}],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":23,"cssClass":"pl-en"},{"start":24,"end":107,"cssClass":"pl-s"},{"start":58,"end":80,"cssClass":"pl-s1"},{"start":58,"end":59,"cssClass":"pl-kos"},{"start":59,"end":67,"cssClass":"pl-s1"},{"start":68,"end":79,"cssClass":"pl-s1"},{"start":79,"end":80,"cssClass":"pl-kos"},{"start":89,"end":106,"cssClass":"pl-s1"},{"start":89,"end":90,"cssClass":"pl-kos"},{"start":90,"end":98,"cssClass":"pl-s1"},{"start":99,"end":105,"cssClass":"pl-s1"},{"start":105,"end":106,"cssClass":"pl-kos"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":23,"cssClass":"pl-en"},{"start":24,"end":28,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-v"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":22,"cssClass":"pl-en"}],[],[{"start":16,"end":28,"cssClass":"pl-s"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":35,"end":46,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":31,"end":49,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":31,"end":50,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":49,"cssClass":"pl-s"},{"start":34,"end":48,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-kos"},{"start":35,"end":39,"cssClass":"pl-s1"},{"start":40,"end":45,"cssClass":"pl-en"},{"start":47,"end":48,"cssClass":"pl-kos"}],[],[],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":22,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":27,"cssClass":"pl-en"},{"start":28,"end":32,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":22,"cssClass":"pl-en"}],[],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":64,"cssClass":"pl-s"},{"start":33,"end":47,"cssClass":"pl-s1"},{"start":33,"end":34,"cssClass":"pl-kos"},{"start":34,"end":38,"cssClass":"pl-s1"},{"start":39,"end":44,"cssClass":"pl-en"},{"start":46,"end":47,"cssClass":"pl-kos"},{"start":49,"end":63,"cssClass":"pl-s1"},{"start":49,"end":50,"cssClass":"pl-kos"},{"start":50,"end":54,"cssClass":"pl-s1"},{"start":55,"end":60,"cssClass":"pl-en"},{"start":62,"end":63,"cssClass":"pl-kos"}],[{"start":16,"end":28,"cssClass":"pl-s"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":35,"end":46,"cssClass":"pl-s1"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":31,"cssClass":"pl-s"}],[],[],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":22,"cssClass":"pl-s1"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":22,"cssClass":"pl-en"},{"start":23,"end":27,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":44,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":309,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":16,"cssClass":"pl-en"},{"start":17,"end":21,"cssClass":"pl-s1"},{"start":23,"end":31,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":292,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":25,"cssClass":"pl-s"},{"start":27,"end":35,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":26,"cssClass":"pl-en"},{"start":27,"end":31,"cssClass":"pl-s1"},{"start":33,"end":41,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":48,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":1146,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":25,"cssClass":"pl-s"},{"start":27,"end":35,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":70,"cssClass":"pl-v"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":77,"end":78,"cssClass":"pl-c1"},{"start":78,"end":83,"cssClass":"pl-s1"},{"start":85,"end":92,"cssClass":"pl-s1"},{"start":92,"end":93,"cssClass":"pl-c1"},{"start":93,"end":100,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":23,"cssClass":"pl-en"},{"start":24,"end":28,"cssClass":"pl-s1"},{"start":30,"end":38,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":45,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":357,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"},{"start":26,"end":35,"cssClass":"pl-s"},{"start":37,"end":45,"cssClass":"pl-s1"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":70,"cssClass":"pl-v"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":77,"end":78,"cssClass":"pl-c1"},{"start":78,"end":83,"cssClass":"pl-s1"},{"start":85,"end":92,"cssClass":"pl-s1"},{"start":92,"end":93,"cssClass":"pl-c1"},{"start":93,"end":100,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":13,"cssClass":"pl-en"},{"start":14,"end":18,"cssClass":"pl-s1"},{"start":20,"end":28,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":36,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":1416,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"},{"start":26,"end":30,"cssClass":"pl-s"},{"start":32,"end":40,"cssClass":"pl-s1"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":21,"cssClass":"pl-en"},{"start":22,"end":26,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":43,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":232,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":23,"cssClass":"pl-s"}],[{"start":20,"end":32,"cssClass":"pl-s"},{"start":35,"end":43,"cssClass":"pl-s"}],[{"start":20,"end":33,"cssClass":"pl-s"},{"start":35,"end":39,"cssClass":"pl-c1"}],[{"start":20,"end":30,"cssClass":"pl-s"}],[{"start":24,"end":30,"cssClass":"pl-s"},{"start":32,"end":33,"cssClass":"pl-c1"}],[{"start":24,"end":30,"cssClass":"pl-s"},{"start":32,"end":33,"cssClass":"pl-c1"}],[],[{"start":20,"end":31,"cssClass":"pl-s"},{"start":33,"end":37,"cssClass":"pl-c1"}],[{"start":20,"end":32,"cssClass":"pl-s"}],[{"start":24,"end":35,"cssClass":"pl-s"},{"start":37,"end":43,"cssClass":"pl-s"}],[],[],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":17,"cssClass":"pl-en"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":24,"end":32,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":1008,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":25,"cssClass":"pl-s"},{"start":27,"end":35,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":23,"cssClass":"pl-en"},{"start":24,"end":28,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":45,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":128,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":28,"cssClass":"pl-en"},{"start":29,"end":33,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":42,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":973,"cssClass":"pl-s"}],[{"start":12,"end":385,"cssClass":"pl-c"}],[{"start":12,"end":23,"cssClass":"pl-s"},{"start":25,"end":29,"cssClass":"pl-c1"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":25,"cssClass":"pl-en"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":32,"end":42,"cssClass":"pl-s1"},{"start":44,"end":51,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-c1"},{"start":52,"end":57,"cssClass":"pl-c1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":10,"cssClass":"pl-k"},{"start":11,"end":18,"cssClass":"pl-s1"}],[{"start":12,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":98,"cssClass":"pl-s"}],[{"start":20,"end":51,"cssClass":"pl-s"}],[{"start":20,"end":43,"cssClass":"pl-s"}],[{"start":20,"end":42,"cssClass":"pl-s"}],[{"start":20,"end":43,"cssClass":"pl-s"}],[{"start":20,"end":47,"cssClass":"pl-s"}],[{"start":20,"end":45,"cssClass":"pl-s"}],[{"start":20,"end":48,"cssClass":"pl-s"}],[{"start":20,"end":58,"cssClass":"pl-s"}],[{"start":20,"end":42,"cssClass":"pl-s"}],[{"start":20,"end":46,"cssClass":"pl-s"}],[{"start":20,"end":45,"cssClass":"pl-s"}],[{"start":20,"end":45,"cssClass":"pl-s"}],[{"start":20,"end":50,"cssClass":"pl-s"}],[{"start":20,"end":25,"cssClass":"pl-s"}],[{"start":8,"end":12,"cssClass":"pl-k"}],[{"start":12,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":67,"cssClass":"pl-s"}],[{"start":20,"end":64,"cssClass":"pl-s"}],[{"start":20,"end":62,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":63,"cssClass":"pl-s"}],[{"start":20,"end":65,"cssClass":"pl-s"}],[{"start":20,"end":66,"cssClass":"pl-s"}],[{"start":20,"end":107,"cssClass":"pl-s"}],[{"start":20,"end":70,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":76,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":78,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":76,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":78,"cssClass":"pl-s"}],[{"start":20,"end":78,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":79,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":64,"cssClass":"pl-s"}],[{"start":20,"end":86,"cssClass":"pl-s"}],[{"start":20,"end":68,"cssClass":"pl-s"}],[{"start":20,"end":67,"cssClass":"pl-s"}],[{"start":20,"end":64,"cssClass":"pl-s"}],[{"start":20,"end":81,"cssClass":"pl-s"}],[{"start":20,"end":86,"cssClass":"pl-s"}],[{"start":20,"end":82,"cssClass":"pl-s"}],[{"start":20,"end":87,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":85,"cssClass":"pl-s"}],[{"start":20,"end":81,"cssClass":"pl-s"}],[{"start":20,"end":86,"cssClass":"pl-s"}],[{"start":20,"end":66,"cssClass":"pl-s"}],[{"start":20,"end":66,"cssClass":"pl-s"}],[{"start":20,"end":66,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":77,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":68,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":77,"cssClass":"pl-s"}],[{"start":20,"end":77,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":77,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":75,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":68,"cssClass":"pl-s"}],[{"start":20,"end":68,"cssClass":"pl-s"}],[{"start":20,"end":63,"cssClass":"pl-s"}],[{"start":20,"end":70,"cssClass":"pl-s"}],[{"start":20,"end":85,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":78,"cssClass":"pl-s"}],[{"start":20,"end":67,"cssClass":"pl-s"}],[{"start":20,"end":78,"cssClass":"pl-s"}],[{"start":20,"end":83,"cssClass":"pl-s"}],[{"start":20,"end":74,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":81,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":70,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":67,"cssClass":"pl-s"}],[{"start":20,"end":71,"cssClass":"pl-s"}],[{"start":20,"end":72,"cssClass":"pl-s"}],[{"start":20,"end":73,"cssClass":"pl-s"}],[{"start":20,"end":63,"cssClass":"pl-s"}],[{"start":20,"end":70,"cssClass":"pl-s"}],[{"start":20,"end":70,"cssClass":"pl-s"}],[{"start":20,"end":77,"cssClass":"pl-s"}],[{"start":20,"end":65,"cssClass":"pl-s"}],[{"start":20,"end":67,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":81,"cssClass":"pl-s"}],[{"start":20,"end":80,"cssClass":"pl-s"}],[{"start":20,"end":81,"cssClass":"pl-s"}],[{"start":20,"end":65,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":84,"cssClass":"pl-s"}],[{"start":20,"end":69,"cssClass":"pl-s"}],[{"start":20,"end":25,"cssClass":"pl-s"}],[],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":46,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":26,"cssClass":"pl-s1"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":35,"cssClass":"pl-en"},{"start":36,"end":40,"cssClass":"pl-s1"},{"start":42,"end":52,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":55,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":162,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":17,"cssClass":"pl-en"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":24,"end":34,"cssClass":"pl-s1"},{"start":36,"end":48,"cssClass":"pl-s1"},{"start":50,"end":71,"cssClass":"pl-s1"},{"start":73,"end":83,"cssClass":"pl-s1"},{"start":85,"end":96,"cssClass":"pl-s1"},{"start":98,"end":106,"cssClass":"pl-s1"},{"start":108,"end":117,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":793,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":24,"cssClass":"pl-s"}],[{"start":20,"end":30,"cssClass":"pl-s"},{"start":32,"end":42,"cssClass":"pl-s1"}],[{"start":20,"end":31,"cssClass":"pl-s"},{"start":33,"end":44,"cssClass":"pl-s1"}],[],[{"start":16,"end":29,"cssClass":"pl-s"}],[{"start":20,"end":30,"cssClass":"pl-s"},{"start":32,"end":40,"cssClass":"pl-s1"}],[{"start":20,"end":31,"cssClass":"pl-s"},{"start":33,"end":42,"cssClass":"pl-s1"}],[],[{"start":16,"end":25,"cssClass":"pl-s"},{"start":27,"end":28,"cssClass":"pl-c1"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[{"start":16,"end":37,"cssClass":"pl-s"},{"start":39,"end":60,"cssClass":"pl-s1"}],[{"start":16,"end":29,"cssClass":"pl-s"},{"start":31,"end":43,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":23,"cssClass":"pl-en"},{"start":24,"end":28,"cssClass":"pl-s1"},{"start":30,"end":40,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":41,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":191,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":26,"cssClass":"pl-en"},{"start":27,"end":31,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":46,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":80,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":38,"cssClass":"pl-en"},{"start":39,"end":43,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":56,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":110,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":34,"cssClass":"pl-en"},{"start":35,"end":39,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":42,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":54,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":126,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":22,"cssClass":"pl-s"},{"start":25,"end":74,"cssClass":"pl-s"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":19,"cssClass":"pl-en"},{"start":20,"end":24,"cssClass":"pl-s1"},{"start":26,"end":36,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":41,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":316,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":30,"cssClass":"pl-s"},{"start":32,"end":42,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":32,"cssClass":"pl-en"},{"start":33,"end":37,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":53,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":259,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":37,"cssClass":"pl-en"},{"start":38,"end":42,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":57,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":185,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":26,"cssClass":"pl-en"},{"start":27,"end":31,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":47,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":361,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":35,"cssClass":"pl-s"}],[{"start":16,"end":28,"cssClass":"pl-s"},{"start":30,"end":36,"cssClass":"pl-s"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":12,"cssClass":"pl-en"},{"start":13,"end":17,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":35,"cssClass":"pl-s"}],[{"start":12,"end":1193,"cssClass":"pl-c"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":615,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":64,"cssClass":"pl-v"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":71,"end":72,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-s1"},{"start":79,"end":86,"cssClass":"pl-s1"},{"start":86,"end":87,"cssClass":"pl-c1"},{"start":87,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":29,"cssClass":"pl-en"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":36,"end":46,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":50,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":203,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":39,"cssClass":"pl-en"},{"start":40,"end":44,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":59,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":316,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":35,"cssClass":"pl-en"},{"start":36,"end":40,"cssClass":"pl-s1"},{"start":42,"end":48,"cssClass":"pl-s1"},{"start":50,"end":57,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":55,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":175,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":23,"cssClass":"pl-s"},{"start":25,"end":30,"cssClass":"pl-s"}],[{"start":16,"end":24,"cssClass":"pl-s"},{"start":26,"end":31,"cssClass":"pl-s"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":35,"cssClass":"pl-en"},{"start":36,"end":40,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":54,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":164,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":29,"cssClass":"pl-en"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":36,"end":46,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":49,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":64,"cssClass":"pl-s"}],[{"start":21,"end":67,"cssClass":"pl-s"}],[{"start":21,"end":95,"cssClass":"pl-s"}],[{"start":21,"end":114,"cssClass":"pl-s"}],[{"start":21,"end":111,"cssClass":"pl-s"}],[{"start":21,"end":116,"cssClass":"pl-s"}],[{"start":21,"end":88,"cssClass":"pl-s"}],[{"start":21,"end":94,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":32,"cssClass":"pl-en"},{"start":33,"end":37,"cssClass":"pl-s1"},{"start":39,"end":49,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":52,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":141,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":27,"cssClass":"pl-s"},{"start":29,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":66,"cssClass":"pl-v"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":88,"cssClass":"pl-s1"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}],[],[],[{"start":4,"end":77,"cssClass":"pl-c"}],[{"start":4,"end":77,"cssClass":"pl-c"}],[{"start":4,"end":81,"cssClass":"pl-c"}],[{"start":4,"end":79,"cssClass":"pl-c"}],[{"start":4,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":7,"cssClass":"pl-k"},{"start":8,"end":28,"cssClass":"pl-en"},{"start":29,"end":33,"cssClass":"pl-s1"},{"start":35,"end":45,"cssClass":"pl-s1"},{"start":47,"end":54,"cssClass":"pl-s1"},{"start":56,"end":66,"cssClass":"pl-s1"},{"start":68,"end":76,"cssClass":"pl-s1"},{"start":78,"end":94,"cssClass":"pl-s1"}],[{"start":8,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":38,"cssClass":"pl-en"}],[],[{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":12,"end":27,"cssClass":"pl-s"},{"start":29,"end":49,"cssClass":"pl-s"}],[{"start":12,"end":19,"cssClass":"pl-s"},{"start":21,"end":155,"cssClass":"pl-s"}],[{"start":12,"end":23,"cssClass":"pl-s"}],[{"start":16,"end":23,"cssClass":"pl-s"}],[{"start":20,"end":29,"cssClass":"pl-s"},{"start":31,"end":38,"cssClass":"pl-s1"}],[{"start":20,"end":26,"cssClass":"pl-s"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":31,"end":41,"cssClass":"pl-c"}],[{"start":20,"end":31,"cssClass":"pl-s"},{"start":33,"end":37,"cssClass":"pl-s1"},{"start":38,"end":42,"cssClass":"pl-en"}],[{"start":20,"end":32,"cssClass":"pl-s"},{"start":34,"end":44,"cssClass":"pl-s1"}],[{"start":20,"end":30,"cssClass":"pl-s"},{"start":32,"end":40,"cssClass":"pl-s1"}],[{"start":20,"end":31,"cssClass":"pl-s"},{"start":33,"end":43,"cssClass":"pl-s1"}],[],[],[],[{"start":8,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-s1"},{"start":24,"end":41,"cssClass":"pl-en"},{"start":42,"end":45,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":65,"cssClass":"pl-v"},{"start":67,"end":72,"cssClass":"pl-s1"},{"start":72,"end":73,"cssClass":"pl-c1"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":80,"end":87,"cssClass":"pl-s1"},{"start":87,"end":88,"cssClass":"pl-c1"},{"start":88,"end":95,"cssClass":"pl-s1"}],[{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":23,"cssClass":"pl-s1"},{"start":24,"end":28,"cssClass":"pl-en"}]],"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/the-mace/rivian-python-api/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"rivian_api.py","displayUrl":"https://github.com/the-mace/rivian-python-api/blob/main/src/rivian_python_api/rivian_api.py?raw=true","headerInfo":{"blobSize":"39 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","deleteInfo":{"deleteTooltip":"You must be signed in to make or propose changes"},"editInfo":{"editTooltip":"You must be signed in to make or propose changes"},"ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"gitLfsPath":null,"onBranch":true,"shortPath":"cb38eb9","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fthe-mace%2Frivian-python-api%2Fblob%2Fmain%2Fsrc%2Frivian_python_api%2Frivian_api.py","isCSV":false,"isRichtext":false,"toc":null,"lineInfo":{"truncatedLoc":"653","truncatedSloc":"599"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplateHelpUrl":"https://docs.github.com/articles/about-issue-and-pull-request-templates","issueTemplate":null,"discussionTemplate":null,"language":"Python","languageID":303,"large":false,"loggedIn":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/the-mace/rivian-python-api/blob/main/src/rivian_python_api/rivian_api.py","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/the-mace/rivian-python-api/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/the-mace/rivian-python-api/raw/main/src/rivian_python_api/rivian_api.py","renderImageOrRaw":false,"richText":null,"renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"repoOwner":"the-mace","repoName":"rivian-python-api","showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"RIVIAN_BASE_PATH","kind":"constant","ident_start":56,"ident_end":72,"extent_start":56,"extent_end":103,"fully_qualified_name":"RIVIAN_BASE_PATH","ident_utf16":{"start":{"line_number":5,"utf16_col":0},"end":{"line_number":5,"utf16_col":16}},"extent_utf16":{"start":{"line_number":5,"utf16_col":0},"end":{"line_number":5,"utf16_col":47}}},{"name":"RIVIAN_GATEWAY_PATH","kind":"constant","ident_start":104,"ident_end":123,"extent_start":104,"extent_end":163,"fully_qualified_name":"RIVIAN_GATEWAY_PATH","ident_utf16":{"start":{"line_number":6,"utf16_col":0},"end":{"line_number":6,"utf16_col":19}},"extent_utf16":{"start":{"line_number":6,"utf16_col":0},"end":{"line_number":6,"utf16_col":59}}},{"name":"RIVIAN_CHARGING_PATH","kind":"constant","ident_start":164,"ident_end":184,"extent_start":164,"extent_end":226,"fully_qualified_name":"RIVIAN_CHARGING_PATH","ident_utf16":{"start":{"line_number":7,"utf16_col":0},"end":{"line_number":7,"utf16_col":20}},"extent_utf16":{"start":{"line_number":7,"utf16_col":0},"end":{"line_number":7,"utf16_col":62}}},{"name":"RIVIAN_ORDERS_PATH","kind":"constant","ident_start":227,"ident_end":245,"extent_start":227,"extent_end":284,"fully_qualified_name":"RIVIAN_ORDERS_PATH","ident_utf16":{"start":{"line_number":8,"utf16_col":0},"end":{"line_number":8,"utf16_col":18}},"extent_utf16":{"start":{"line_number":8,"utf16_col":0},"end":{"line_number":8,"utf16_col":57}}},{"name":"RIVIAN_CONTENT_PATH","kind":"constant","ident_start":285,"ident_end":304,"extent_start":285,"extent_end":344,"fully_qualified_name":"RIVIAN_CONTENT_PATH","ident_utf16":{"start":{"line_number":9,"utf16_col":0},"end":{"line_number":9,"utf16_col":19}},"extent_utf16":{"start":{"line_number":9,"utf16_col":0},"end":{"line_number":9,"utf16_col":59}}},{"name":"RIVIAN_TRANSACTIONS_PATH","kind":"constant","ident_start":345,"ident_end":369,"extent_start":345,"extent_end":405,"fully_qualified_name":"RIVIAN_TRANSACTIONS_PATH","ident_utf16":{"start":{"line_number":10,"utf16_col":0},"end":{"line_number":10,"utf16_col":24}},"extent_utf16":{"start":{"line_number":10,"utf16_col":0},"end":{"line_number":10,"utf16_col":60}}},{"name":"log","kind":"constant","ident_start":407,"ident_end":410,"extent_start":407,"extent_end":440,"fully_qualified_name":"log","ident_utf16":{"start":{"line_number":12,"utf16_col":0},"end":{"line_number":12,"utf16_col":3}},"extent_utf16":{"start":{"line_number":12,"utf16_col":0},"end":{"line_number":12,"utf16_col":33}}},{"name":"HEADERS","kind":"constant","ident_start":442,"ident_end":449,"extent_start":442,"extent_end":669,"fully_qualified_name":"HEADERS","ident_utf16":{"start":{"line_number":14,"utf16_col":0},"end":{"line_number":14,"utf16_col":7}},"extent_utf16":{"start":{"line_number":14,"utf16_col":0},"end":{"line_number":19,"utf16_col":1}}},{"name":"Rivian","kind":"class","ident_start":678,"ident_end":684,"extent_start":672,"extent_end":39889,"fully_qualified_name":"Rivian","ident_utf16":{"start":{"line_number":22,"utf16_col":6},"end":{"line_number":22,"utf16_col":12}},"extent_utf16":{"start":{"line_number":22,"utf16_col":0},"end":{"line_number":652,"utf16_col":30}}},{"name":"__init__","kind":"function","ident_start":694,"ident_end":702,"extent_start":690,"extent_end":1104,"fully_qualified_name":"Rivian.__init__","ident_utf16":{"start":{"line_number":23,"utf16_col":8},"end":{"line_number":23,"utf16_col":16}},"extent_utf16":{"start":{"line_number":23,"utf16_col":4},"end":{"line_number":36,"utf16_col":28}}},{"name":"login","kind":"function","ident_start":1114,"ident_end":1119,"extent_start":1110,"extent_end":2859,"fully_qualified_name":"Rivian.login","ident_utf16":{"start":{"line_number":38,"utf16_col":8},"end":{"line_number":38,"utf16_col":13}},"extent_utf16":{"start":{"line_number":38,"utf16_col":4},"end":{"line_number":72,"utf16_col":23}}},{"name":"login_with_otp","kind":"function","ident_start":2869,"ident_end":2883,"extent_start":2865,"extent_end":4564,"fully_qualified_name":"Rivian.login_with_otp","ident_utf16":{"start":{"line_number":74,"utf16_col":8},"end":{"line_number":74,"utf16_col":22}},"extent_utf16":{"start":{"line_number":74,"utf16_col":4},"end":{"line_number":108,"utf16_col":23}}},{"name":"create_csrf_token","kind":"function","ident_start":4574,"ident_end":4591,"extent_start":4570,"extent_end":5192,"fully_qualified_name":"Rivian.create_csrf_token","ident_utf16":{"start":{"line_number":110,"utf16_col":8},"end":{"line_number":110,"utf16_col":25}},"extent_utf16":{"start":{"line_number":110,"utf16_col":4},"end":{"line_number":125,"utf16_col":23}}},{"name":"raw_graphql_query","kind":"function","ident_start":5202,"ident_end":5219,"extent_start":5198,"extent_end":5487,"fully_qualified_name":"Rivian.raw_graphql_query","ident_utf16":{"start":{"line_number":127,"utf16_col":8},"end":{"line_number":127,"utf16_col":25}},"extent_utf16":{"start":{"line_number":127,"utf16_col":4},"end":{"line_number":131,"utf16_col":23}}},{"name":"gateway_headers","kind":"function","ident_start":5497,"ident_end":5512,"extent_start":5493,"extent_end":5832,"fully_qualified_name":"Rivian.gateway_headers","ident_utf16":{"start":{"line_number":133,"utf16_col":8},"end":{"line_number":133,"utf16_col":23}},"extent_utf16":{"start":{"line_number":133,"utf16_col":4},"end":{"line_number":143,"utf16_col":22}}},{"name":"transaction_headers","kind":"function","ident_start":5842,"ident_end":5861,"extent_start":5838,"extent_end":6140,"fully_qualified_name":"Rivian.transaction_headers","ident_utf16":{"start":{"line_number":145,"utf16_col":8},"end":{"line_number":145,"utf16_col":27}},"extent_utf16":{"start":{"line_number":145,"utf16_col":4},"end":{"line_number":154,"utf16_col":22}}},{"name":"vehicle_orders","kind":"function","ident_start":6150,"ident_end":6164,"extent_start":6146,"extent_end":6754,"fully_qualified_name":"Rivian.vehicle_orders","ident_utf16":{"start":{"line_number":156,"utf16_col":8},"end":{"line_number":156,"utf16_col":22}},"extent_utf16":{"start":{"line_number":156,"utf16_col":4},"end":{"line_number":164,"utf16_col":30}}},{"name":"delivery","kind":"function","ident_start":6764,"ident_end":6772,"extent_start":6760,"extent_end":7400,"fully_qualified_name":"Rivian.delivery","ident_utf16":{"start":{"line_number":166,"utf16_col":8},"end":{"line_number":166,"utf16_col":16}},"extent_utf16":{"start":{"line_number":166,"utf16_col":4},"end":{"line_number":176,"utf16_col":30}}},{"name":"transaction_status","kind":"function","ident_start":7410,"ident_end":7428,"extent_start":7406,"extent_end":8927,"fully_qualified_name":"Rivian.transaction_status","ident_utf16":{"start":{"line_number":178,"utf16_col":8},"end":{"line_number":178,"utf16_col":26}},"extent_utf16":{"start":{"line_number":178,"utf16_col":4},"end":{"line_number":188,"utf16_col":30}}},{"name":"finance_summary","kind":"function","ident_start":8937,"ident_end":8952,"extent_start":8933,"extent_end":9629,"fully_qualified_name":"Rivian.finance_summary","ident_utf16":{"start":{"line_number":190,"utf16_col":8},"end":{"line_number":190,"utf16_col":23}},"extent_utf16":{"start":{"line_number":190,"utf16_col":4},"end":{"line_number":198,"utf16_col":30}}},{"name":"order","kind":"function","ident_start":9639,"ident_end":9644,"extent_start":9635,"extent_end":11360,"fully_qualified_name":"Rivian.order","ident_utf16":{"start":{"line_number":200,"utf16_col":8},"end":{"line_number":200,"utf16_col":13}},"extent_utf16":{"start":{"line_number":200,"utf16_col":4},"end":{"line_number":208,"utf16_col":30}}},{"name":"retail_orders","kind":"function","ident_start":11370,"ident_end":11383,"extent_start":11366,"extent_end":12310,"fully_qualified_name":"Rivian.retail_orders","ident_utf16":{"start":{"line_number":210,"utf16_col":8},"end":{"line_number":210,"utf16_col":21}},"extent_utf16":{"start":{"line_number":210,"utf16_col":4},"end":{"line_number":231,"utf16_col":30}}},{"name":"get_order","kind":"function","ident_start":12320,"ident_end":12329,"extent_start":12316,"extent_end":13675,"fully_qualified_name":"Rivian.get_order","ident_utf16":{"start":{"line_number":233,"utf16_col":8},"end":{"line_number":233,"utf16_col":17}},"extent_utf16":{"start":{"line_number":233,"utf16_col":4},"end":{"line_number":243,"utf16_col":30}}},{"name":"payment_methods","kind":"function","ident_start":13685,"ident_end":13700,"extent_start":13681,"extent_end":14113,"fully_qualified_name":"Rivian.payment_methods","ident_utf16":{"start":{"line_number":245,"utf16_col":8},"end":{"line_number":245,"utf16_col":23}},"extent_utf16":{"start":{"line_number":245,"utf16_col":4},"end":{"line_number":253,"utf16_col":30}}},{"name":"get_user_information","kind":"function","ident_start":14123,"ident_end":14143,"extent_start":14119,"extent_end":15783,"fully_qualified_name":"Rivian.get_user_information","ident_utf16":{"start":{"line_number":255,"utf16_col":8},"end":{"line_number":255,"utf16_col":28}},"extent_utf16":{"start":{"line_number":255,"utf16_col":4},"end":{"line_number":264,"utf16_col":30}}},{"name":"get_vehicle_state","kind":"function","ident_start":15793,"ident_end":15810,"extent_start":15789,"extent_end":25872,"fully_qualified_name":"Rivian.get_vehicle_state","ident_utf16":{"start":{"line_number":266,"utf16_col":8},"end":{"line_number":266,"utf16_col":25}},"extent_utf16":{"start":{"line_number":266,"utf16_col":4},"end":{"line_number":410,"utf16_col":30}}},{"name":"get_vehicle_last_connection","kind":"function","ident_start":25882,"ident_end":25909,"extent_start":25878,"extent_end":26429,"fully_qualified_name":"Rivian.get_vehicle_last_connection","ident_utf16":{"start":{"line_number":412,"utf16_col":8},"end":{"line_number":412,"utf16_col":35}},"extent_utf16":{"start":{"line_number":412,"utf16_col":4},"end":{"line_number":422,"utf16_col":30}}},{"name":"plan_trip","kind":"function","ident_start":26439,"ident_end":26448,"extent_start":26435,"extent_end":28078,"fully_qualified_name":"Rivian.plan_trip","ident_utf16":{"start":{"line_number":424,"utf16_col":8},"end":{"line_number":424,"utf16_col":17}},"extent_utf16":{"start":{"line_number":424,"utf16_col":4},"end":{"line_number":445,"utf16_col":30}}},{"name":"get_ota_details","kind":"function","ident_start":28088,"ident_end":28103,"extent_start":28084,"extent_end":28638,"fully_qualified_name":"Rivian.get_ota_details","ident_utf16":{"start":{"line_number":447,"utf16_col":8},"end":{"line_number":447,"utf16_col":23}},"extent_utf16":{"start":{"line_number":447,"utf16_col":4},"end":{"line_number":457,"utf16_col":30}}},{"name":"check_by_rivian_id","kind":"function","ident_start":28648,"ident_end":28666,"extent_start":28644,"extent_end":29034,"fully_qualified_name":"Rivian.check_by_rivian_id","ident_utf16":{"start":{"line_number":459,"utf16_col":8},"end":{"line_number":459,"utf16_col":26}},"extent_utf16":{"start":{"line_number":459,"utf16_col":4},"end":{"line_number":467,"utf16_col":30}}},{"name":"get_linked_email_for_rivian_id","kind":"function","ident_start":29044,"ident_end":29074,"extent_start":29040,"extent_end":29482,"fully_qualified_name":"Rivian.get_linked_email_for_rivian_id","ident_utf16":{"start":{"line_number":469,"utf16_col":8},"end":{"line_number":469,"utf16_col":38}},"extent_utf16":{"start":{"line_number":469,"utf16_col":4},"end":{"line_number":477,"utf16_col":30}}},{"name":"get_parameter_store_values","kind":"function","ident_start":29492,"ident_end":29518,"extent_start":29488,"extent_end":30027,"fully_qualified_name":"Rivian.get_parameter_store_values","ident_utf16":{"start":{"line_number":479,"utf16_col":8},"end":{"line_number":479,"utf16_col":34}},"extent_utf16":{"start":{"line_number":479,"utf16_col":4},"end":{"line_number":489,"utf16_col":30}}},{"name":"get_vehicle","kind":"function","ident_start":30037,"ident_end":30048,"extent_start":30033,"extent_end":30710,"fully_qualified_name":"Rivian.get_vehicle","ident_utf16":{"start":{"line_number":491,"utf16_col":8},"end":{"line_number":491,"utf16_col":19}},"extent_utf16":{"start":{"line_number":491,"utf16_col":4},"end":{"line_number":501,"utf16_col":30}}},{"name":"get_registered_wallboxes","kind":"function","ident_start":30720,"ident_end":30744,"extent_start":30716,"extent_end":31293,"fully_qualified_name":"Rivian.get_registered_wallboxes","ident_utf16":{"start":{"line_number":503,"utf16_col":8},"end":{"line_number":503,"utf16_col":32}},"extent_utf16":{"start":{"line_number":503,"utf16_col":4},"end":{"line_number":511,"utf16_col":30}}},{"name":"get_provisioned_camp_speakers","kind":"function","ident_start":31303,"ident_end":31332,"extent_start":31299,"extent_end":31811,"fully_qualified_name":"Rivian.get_provisioned_camp_speakers","ident_utf16":{"start":{"line_number":513,"utf16_col":8},"end":{"line_number":513,"utf16_col":37}},"extent_utf16":{"start":{"line_number":513,"utf16_col":4},"end":{"line_number":521,"utf16_col":30}}},{"name":"get_vehicle_images","kind":"function","ident_start":31821,"ident_end":31839,"extent_start":31817,"extent_end":32571,"fully_qualified_name":"Rivian.get_vehicle_images","ident_utf16":{"start":{"line_number":523,"utf16_col":8},"end":{"line_number":523,"utf16_col":26}},"extent_utf16":{"start":{"line_number":523,"utf16_col":4},"end":{"line_number":534,"utf16_col":30}}},{"name":"user","kind":"function","ident_start":32581,"ident_end":32585,"extent_start":32577,"extent_end":34665,"fully_qualified_name":"Rivian.user","ident_utf16":{"start":{"line_number":536,"utf16_col":8},"end":{"line_number":536,"utf16_col":12}},"extent_utf16":{"start":{"line_number":536,"utf16_col":4},"end":{"line_number":545,"utf16_col":30}}},{"name":"get_charging_schedule","kind":"function","ident_start":34675,"ident_end":34696,"extent_start":34671,"extent_end":35251,"fully_qualified_name":"Rivian.get_charging_schedule","ident_utf16":{"start":{"line_number":547,"utf16_col":8},"end":{"line_number":547,"utf16_col":29}},"extent_utf16":{"start":{"line_number":547,"utf16_col":4},"end":{"line_number":557,"utf16_col":30}}},{"name":"get_completed_session_summaries","kind":"function","ident_start":35263,"ident_end":35294,"extent_start":35259,"extent_end":35907,"fully_qualified_name":"Rivian.get_completed_session_summaries","ident_utf16":{"start":{"line_number":561,"utf16_col":8},"end":{"line_number":561,"utf16_col":39}},"extent_utf16":{"start":{"line_number":561,"utf16_col":4},"end":{"line_number":569,"utf16_col":30}}},{"name":"get_charging_session_status","kind":"function","ident_start":35918,"ident_end":35945,"extent_start":35914,"extent_end":36507,"fully_qualified_name":"Rivian.get_charging_session_status","ident_utf16":{"start":{"line_number":572,"utf16_col":8},"end":{"line_number":572,"utf16_col":35}},"extent_utf16":{"start":{"line_number":572,"utf16_col":4},"end":{"line_number":583,"utf16_col":30}}},{"name":"get_non_rivian_user_session","kind":"function","ident_start":36518,"ident_end":36545,"extent_start":36514,"extent_end":37001,"fully_qualified_name":"Rivian.get_non_rivian_user_session","ident_utf16":{"start":{"line_number":586,"utf16_col":8},"end":{"line_number":586,"utf16_col":35}},"extent_utf16":{"start":{"line_number":586,"utf16_col":4},"end":{"line_number":594,"utf16_col":30}}},{"name":"get_live_session_data","kind":"function","ident_start":37011,"ident_end":37032,"extent_start":37007,"extent_end":38140,"fully_qualified_name":"Rivian.get_live_session_data","ident_utf16":{"start":{"line_number":596,"utf16_col":8},"end":{"line_number":596,"utf16_col":29}},"extent_utf16":{"start":{"line_number":596,"utf16_col":4},"end":{"line_number":613,"utf16_col":30}}},{"name":"get_live_session_history","kind":"function","ident_start":38151,"ident_end":38175,"extent_start":38147,"extent_end":38671,"fully_qualified_name":"Rivian.get_live_session_history","ident_utf16":{"start":{"line_number":616,"utf16_col":8},"end":{"line_number":616,"utf16_col":32}},"extent_utf16":{"start":{"line_number":616,"utf16_col":4},"end":{"line_number":626,"utf16_col":30}}},{"name":"send_vehicle_command","kind":"function","ident_start":39047,"ident_end":39067,"extent_start":39043,"extent_end":39889,"fully_qualified_name":"Rivian.send_vehicle_command","ident_utf16":{"start":{"line_number":634,"utf16_col":8},"end":{"line_number":634,"utf16_col":28}},"extent_utf16":{"start":{"line_number":634,"utf16_col":4},"end":{"line_number":652,"utf16_col":30}}}]}},"copilotInfo":null,"copilotAccessAllowed":false,"csrf_tokens":{"/the-mace/rivian-python-api/branches":{"post":"MgwDfWYBPhxHwDzMCZnfo2ITW6JoaBiz3S0bewx_uI_40HLAJmfTts_-KA3PcTih3dPOugbI6GmkAOhG67coVw"},"/repos/preferences":{"post":"iy4vz0Z4ZoygLWzHUgf-AKwV02d5RFBeE6nB3PwZ4wYFWae6ngIVpGnO_GHsPE6J3i-ud1U6oVAYjbFoWbJUJQ"}}},"title":"rivian-python-api/src/rivian_python_api/rivian_api.py at main · the-mace/rivian-python-api"} \ No newline at end of file +import logging +import requests +import uuid +import time + +RIVIAN_BASE_PATH = "https://rivian.com/api/gql" +RIVIAN_GATEWAY_PATH = RIVIAN_BASE_PATH + "/gateway/graphql" +RIVIAN_CHARGING_PATH = RIVIAN_BASE_PATH + "/chrg/user/graphql" +RIVIAN_ORDERS_PATH = RIVIAN_BASE_PATH + '/orders/graphql' +RIVIAN_CONTENT_PATH = RIVIAN_BASE_PATH + '/content/graphql' +RIVIAN_TRANSACTIONS_PATH = RIVIAN_BASE_PATH + '/t2d/graphql' + +log = logging.getLogger(__name__) + +HEADERS = { + "User-Agent": "RivianApp/1304 CFNetwork/1404.0.5 Darwin/22.3.0", + "Accept": "application/json", + "Content-Type": "application/json", + "Apollographql-Client-Name": "com.rivian.ios.consumer-apollo-ios", +} + + +class Rivian: + def __init__(self): + self._close_session = False + self._session_token = "" + self._access_token = "" + self._refresh_token = "" + self._app_session_token = "" + self._user_session_token = "" + self.client_id = "" + self.client_secret = "" + self.request_timeout = "" + self._csrf_token = "" + + self.otp_needed = False + self._otp_token = "" + + def login(self, username, password): + self.create_csrf_token() + url = RIVIAN_GATEWAY_PATH + headers = HEADERS + headers.update( + { + "Csrf-Token": self._csrf_token, + "A-Sess": self._app_session_token, + "Apollographql-Client-Name": "com.rivian.ios.consumer-apollo-ios", + "Dc-Cid": f"m-ios-{uuid.uuid4()}", + } + ) + + query = { + "operationName": "Login", + "query": "mutation Login($email: String!, $password: String!) {\n login(email: $email, password: $password) {\n __typename\n ... on MobileLoginResponse {\n __typename\n accessToken\n refreshToken\n userSessionToken\n }\n ... on MobileMFALoginResponse {\n __typename\n otpToken\n }\n }\n}", + "variables": {"email": username, "password": password}, + } + + response = self.raw_graphql_query(url=url, query=query, headers=headers) + response_json = response.json() + if response.status_code == 200 and response_json["data"] and "login" in response_json["data"]: + login_data = response_json["data"]["login"] + if "otpToken" in login_data: + self.otp_needed = True + self._otp_token = login_data["otpToken"] + else: + self._access_token = login_data["accessToken"] + self._refresh_token = login_data["refreshToken"] + self._user_session_token = login_data["userSessionToken"] + else: + message = f"Status: {response.status_code}: Details: {response_json}" + print(f"Login failed: {message}") + raise Exception(message) + return response + + def login_with_otp(self, username, otpCode, otpToken=None): + if self._csrf_token == "": + self.create_csrf_token() + url = RIVIAN_GATEWAY_PATH + headers = HEADERS + headers.update( + { + "Csrf-Token": self._csrf_token, + "A-Sess": self._app_session_token, + "Apollographql-Client-Name": "com.rivian.ios.consumer-apollo-ios", + } + ) + + query = { + "operationName": "LoginWithOTP", + "query": "mutation LoginWithOTP($email: String!, $otpCode: String!, $otpToken: String!) {\n loginWithOTP(email: $email, otpCode: $otpCode, otpToken: $otpToken) {\n __typename\n ... on MobileLoginResponse {\n __typename\n accessToken\n refreshToken\n userSessionToken\n }\n }\n}", + "variables": { + "email": username, + "otpCode": otpCode, + "otpToken": otpToken or self._otp_token, + }, + } + + response = self.raw_graphql_query(url=url, query=query, headers=headers) + response_json = response.json() + if response.status_code == 200 and response_json["data"] and "loginWithOTP" in response_json["data"]: + login_data = response_json["data"]["loginWithOTP"] + self._access_token = login_data["accessToken"] + self._refresh_token = login_data["refreshToken"] + self._user_session_token = login_data["userSessionToken"] + else: + message = f"Status: {response.status_code}: Details: {response_json}" + print(f"Login with otp failed: {message}") + raise Exception(message) + return response + + def create_csrf_token(self): + url = RIVIAN_GATEWAY_PATH + headers = HEADERS + + query = { + "operationName": "CreateCSRFToken", + "query": "mutation CreateCSRFToken {createCsrfToken {__typename csrfToken appSessionToken}}", + "variables": None, + } + + response = self.raw_graphql_query(url=url, query=query, headers=headers) + response_json = response.json() + csrf_data = response_json["data"]["createCsrfToken"] + self._csrf_token = csrf_data["csrfToken"] + self._app_session_token = csrf_data["appSessionToken"] + return response + + def raw_graphql_query(self, url, query, headers): + response = requests.post(url, json=query, headers=headers) + if response.status_code != 200: + log.warning(f"Graphql error: Response status: {response.status_code} Reason: {response.reason}") + return response + + def gateway_headers(self): + headers = HEADERS + headers.update( + { + "Csrf-Token": self._csrf_token, + "A-Sess": self._app_session_token, + "U-Sess": self._user_session_token, + "Dc-Cid": f"m-ios-{uuid.uuid4()}", + } + ) + return headers + + def transaction_headers(self): + headers = self.gateway_headers() + headers.update( + { + "dc-cid": f"t2d--{uuid.uuid4()}--{uuid.uuid4()}", + "csrf-token": self._csrf_token, + "app-id": "t2d" + } + ) + return headers + + def vehicle_orders(self): + headers = self.gateway_headers() + query = { + "operationName": "vehicleOrders", + "query": "query vehicleOrders { orders(input: {orderTypes: [PRE_ORDER, VEHICLE], pageInfo: {from: 0, size: 10000}}) { __typename data { __typename id orderDate state configurationStatus fulfillmentSummaryStatus items { __typename sku } consumerStatuses { __typename isConsumerFlowComplete } } } }", + "variables": {}, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() + + def delivery(self, order_id): + headers = self.gateway_headers() + query = { + "operationName": "delivery", + "query": "query delivery($orderId: ID!) { delivery(orderId: $orderId) { __typename status carrier deliveryAddress { __typename addressLine1 addressLine2 city state country zipcode } appointmentDetails { __typename appointmentId startDateTime endDateTime timeZone } vehicleVIN } }", + "variables": { + "orderId": order_id, + }, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() + + def transaction_status(self, order_id): + headers = self.transaction_headers() + query = { + "operationName": "transactionStatus", + "query": "query transactionStatus($orderId: ID!) { transactionStatus(orderId: $orderId) { titleAndReg { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } tradeIn { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } finance { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } delivery { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } insurance { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } documentUpload { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } contracts { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } payment { sourceStatus { status details } consumerStatus { displayOrder current complete locked inProgress notStarted error } } } }", + "variables": { + "orderId": order_id + }, + } + response = self.raw_graphql_query(url=RIVIAN_TRANSACTIONS_PATH, query=query, headers=headers) + return response.json() + + def finance_summary(self, order_id): + headers = self.transaction_headers() + query = { + "operationName": "financeSummary", + "query": "query financeSummary($orderId: ID!) { ...FinanceSummaryFragment } fragment FinanceSummaryFragment on Query { financeSummary(orderId: $orderId) { orderId status financeChoice { financeChoice institutionName paymentMethod trackingNumber preApprovedAmount loanOfficerName loanOfficerContact downPayment rate term rateAndTermSkipped } } }", + "variables": {"orderId": order_id}, + } + response = self.raw_graphql_query(url=RIVIAN_TRANSACTIONS_PATH, query=query, headers=headers) + return response.json() + + def order(self, order_id): + headers = self.transaction_headers() + query = { + "operationName": "order", + "query": "query order($id: String!) { order(id: $id) { vin state billingAddress { firstName lastName line1 line2 city state country postalCode } shippingAddress { firstName lastName line1 line2 city state country postalCode } orderCancelDate orderEmail currency locale storeId type subtotal discountTotal taxTotal feesTotal paidTotal remainingTotal outstandingBalance costAfterCredits total payments { id intent date method amount referenceNumber status card { last4 expiryDate brand } bank { bankName country last4 } transactionNotes } tradeIns { tradeInReferenceId amount } vehicle { vehicleId vin modelYear model make } items { id discounts { total items { amount title code } } subtotal quantity title productId type unitPrice fees { items { description amount code type } total } taxes { items { description amount code rate type } total } sku shippingAddress { firstName lastName line1 line2 city state country postalCode } configuration { ruleset { meta { rulesetId storeId country vehicle version effectiveDate currency locale availableLocales } defaults { basePrice initialSelection } groups options specs rules } basePrice version options { optionId optionName optionDetails { name attrs price visualExterior visualInterior hidden disabled required } groupId groupName groupDetails { name attrs multiselect required options } price } } } }}", + "variables": {"id": order_id}, + } + response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) + return response.json() + + def retail_orders(self): + headers = self.transaction_headers() + query = { + "operationName": "searchOrders", + "query": "query searchOrders($input: UserOrderSearchInput!) { searchOrders(input: $input) { total data { id type orderDate state fulfillmentSummaryStatus items { id title type sku __typename } __typename } __typename }}", + "variables": { + "input": { + "orderTypes": ["RETAIL"], + "orderStates": None, + "pageInfo": { + "from": 0, + "size": 5 + }, + "dateRange": None, + "sortFields": { + "orderDate": "DESC" + } + } + }, + } + response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) + return response.json() + + def get_order(self, order_id): + headers = self.transaction_headers() + query = { + "operationName": "getOrder", + "query": "query getOrder($orderId: String!) { order(id: $orderId) { id storeId userId orderDate orderCancelDate type state currency locale subtotal discountTotal taxTotal total shippingAddress { firstName lastName line1 line2 city state country postalCode __typename } payments { method currency status type card { last4 expiryDate brand __typename } __typename } items { id title type sku unitPrice quantity state productDetails { ... on ChildProduct { dimensionValues { name valueName localizedStrings __typename } __typename } __typename } __typename } fulfillmentSummaryStatus fulfillmentInfo { fulfillments { fulfillmentId fulfillmentStatus fulfillmentMethod fulfillmentVendor tracking { status carrier number url shipDate deliveredDate serviceType __typename } estimatedDeliveryWindow { startDate endDate __typename } items { orderItemId quantityFulfilled isPartialFulfillment __typename } __typename } pendingFulfillmentItems { orderItemId quantity __typename } __typename } __typename }}", + "variables": { + "orderId": order_id + }, + } + response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) + return response.json() + + def payment_methods(self): + headers = self.transaction_headers() + query = { + "operationName": "paymentMethods", + "query": "query paymentMethods { paymentMethods { id type default card { lastFour brand expiration postalCode } } }", + "variables": {}, + } + response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) + return response.json() + + def get_user_information(self): + headers = self.gateway_headers() + query = { + "operationName": "getUserInfo", + "query": "query getUserInfo { currentUser { __typename id firstName lastName email address { __typename country } vehicles { __typename id name owner roles vin vas { __typename vasVehicleId vehiclePublicKey } state createdAt updatedAt vehicle { __typename id vin modelYear make model expectedBuildDate plannedBuildDate expectedGeneralAssemblyStartDate actualGeneralAssemblyDate mobileConfiguration { __typename trimOption { __typename optionId optionName } exteriorColorOption { __typename optionId optionName } interiorColorOption { __typename optionId optionName } } vehicleState { __typename supportedFeatures { __typename name status } } otaEarlyAccessStatus } settings { __typename name { __typename value } } } enrolledPhones { __typename vas { __typename vasPhoneId publicKey } enrolled { __typename deviceType deviceName vehicleId identityId shortName } } pendingInvites { __typename id invitedByFirstName role status vehicleId vehicleModel email } } }", + # "query": "query getUserInfo {currentUser {__typename id firstName lastName email address { __typename country } vehicles {id name owner roles vin vas {__typename vasVehicleId vehiclePublicKey } state createdAt updatedAt vehicle { __typename id vin modelYear make model expectedBuildDate plannedBuildDate expectedGeneralAssemblyStartDate actualGeneralAssemblyDate } } }}", + "variables": None, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() + + def get_vehicle_state(self, vehicle_id, minimal=False): + headers = self.gateway_headers() + if minimal: + query = "query GetVehicleState($vehicleID: String!) { vehicleState(id: $vehicleID) { " \ + "cloudConnection { lastSync } " \ + "powerState { value } " \ + "driveMode { value } " \ + "gearStatus { value } " \ + "vehicleMileage { value } " \ + "batteryLevel { value } " \ + "distanceToEmpty { value } " \ + "gnssLocation { latitude longitude } " \ + "gnssSpeed { value } " \ + "chargerStatus { value } " \ + "chargerState { value } " \ + "batteryLimit { value } " \ + "timeToEndOfCharge { value } " \ + "} }" + else: + query = "query GetVehicleState($vehicleID: String!) { " \ + "vehicleState(id: $vehicleID) { __typename " \ + "cloudConnection { __typename lastSync } " \ + "gnssLocation { __typename latitude longitude timeStamp } " \ + "gnssSpeed { __typename timeStamp value } " \ + "gnssBearing { __typename timeStamp value } " \ + "gnssAltitude { __typename timeStamp value } " \ + "gnssError { __typename timeStamp positionVertical positionHorizontal speed bearing } " \ + "alarmSoundStatus { __typename timeStamp value } " \ + "timeToEndOfCharge { __typename timeStamp value } " \ + "doorFrontLeftLocked { __typename timeStamp value } " \ + "doorFrontLeftClosed { __typename timeStamp value } " \ + "doorFrontRightLocked { __typename timeStamp value } " \ + "doorFrontRightClosed { __typename timeStamp value } " \ + "doorRearLeftLocked { __typename timeStamp value } " \ + "doorRearLeftClosed { __typename timeStamp value } " \ + "doorRearRightLocked { __typename timeStamp value } " \ + "doorRearRightClosed { __typename timeStamp value } " \ + "windowFrontLeftClosed { __typename timeStamp value } " \ + "windowFrontRightClosed { __typename timeStamp value } " \ + "windowRearLeftClosed { __typename timeStamp value } " \ + "windowRearRightClosed { __typename timeStamp value } " \ + "windowFrontLeftCalibrated { __typename timeStamp value } " \ + "windowFrontRightCalibrated { __typename timeStamp value } " \ + "windowRearLeftCalibrated { __typename timeStamp value } " \ + "windowRearRightCalibrated { __typename timeStamp value } " \ + "windowsNextAction { __typename timeStamp value } " \ + "closureFrunkLocked { __typename timeStamp value } " \ + "closureFrunkClosed { __typename timeStamp value } " \ + "closureFrunkNextAction { __typename timeStamp value } " \ + "gearGuardLocked { __typename timeStamp value } " \ + "closureLiftgateLocked { __typename timeStamp value } " \ + "closureLiftgateClosed { __typename timeStamp value } " \ + "closureLiftgateNextAction { __typename timeStamp value } " \ + "windowRearLeftClosed { __typename timeStamp value } " \ + "windowRearRightClosed { __typename timeStamp value } " \ + "closureSideBinLeftLocked { __typename timeStamp value } " \ + "closureSideBinLeftClosed { __typename timeStamp value } " \ + "closureSideBinRightLocked { __typename timeStamp value } " \ + "closureSideBinRightClosed { __typename timeStamp value } " \ + "closureTailgateLocked { __typename timeStamp value } " \ + "closureTailgateClosed { __typename timeStamp value } " \ + "closureTonneauLocked { __typename timeStamp value } " \ + "closureTonneauClosed { __typename timeStamp value } " \ + "wiperFluidState { __typename timeStamp value } " \ + "powerState { __typename timeStamp value } " \ + "batteryHvThermalEventPropagation { __typename timeStamp value } " \ + "vehicleMileage { __typename timeStamp value } " \ + "brakeFluidLow { __typename timeStamp value } " \ + "gearStatus { __typename timeStamp value } " \ + "tirePressureStatusFrontLeft { __typename timeStamp value } " \ + "tirePressureStatusValidFrontLeft { __typename timeStamp value } " \ + "tirePressureStatusFrontRight { __typename timeStamp value } " \ + "tirePressureStatusValidFrontRight { __typename timeStamp value } " \ + "tirePressureStatusRearLeft { __typename timeStamp value } " \ + "tirePressureStatusValidRearLeft { __typename timeStamp value } " \ + "tirePressureStatusRearRight { __typename timeStamp value } " \ + "tirePressureStatusValidRearRight { __typename timeStamp value } " \ + "batteryLevel { __typename timeStamp value } " \ + "chargerState { __typename timeStamp value } " \ + "batteryLimit { __typename timeStamp value } " \ + "batteryCapacity { __typename timeStamp value } " \ + "remoteChargingAvailable { __typename timeStamp value } " \ + "batteryHvThermalEvent { __typename timeStamp value } " \ + "rangeThreshold { __typename timeStamp value } " \ + "distanceToEmpty { __typename timeStamp value } " \ + "otaAvailableVersion { __typename timeStamp value } " \ + "otaAvailableVersionWeek { __typename timeStamp value } " \ + "otaAvailableVersionYear { __typename timeStamp value } " \ + "otaCurrentVersion { __typename timeStamp value } " \ + "otaCurrentVersionNumber { __typename timeStamp value } " \ + "otaCurrentVersionWeek { __typename timeStamp value } " \ + "otaCurrentVersionYear { __typename timeStamp value } " \ + "otaDownloadProgress { __typename timeStamp value } " \ + "otaInstallDuration { __typename timeStamp value } " \ + "otaInstallProgress { __typename timeStamp value } " \ + "otaInstallReady { __typename timeStamp value } " \ + "otaInstallTime { __typename timeStamp value } " \ + "otaInstallType { __typename timeStamp value } " \ + "otaStatus { __typename timeStamp value } " \ + "otaCurrentStatus { __typename timeStamp value } " \ + "cabinClimateInteriorTemperature { __typename timeStamp value } " \ + "cabinPreconditioningStatus { __typename timeStamp value } " \ + "cabinPreconditioningType { __typename timeStamp value } " \ + "petModeStatus { __typename timeStamp value } " \ + "petModeTemperatureStatus { __typename timeStamp value } " \ + "cabinClimateDriverTemperature { __typename timeStamp value } " \ + "gearGuardVideoStatus { __typename timeStamp value } " \ + "gearGuardVideoMode { __typename timeStamp value } " \ + "gearGuardVideoTermsAccepted { __typename timeStamp value } " \ + "defrostDefogStatus { __typename timeStamp value } " \ + "steeringWheelHeat { __typename timeStamp value } " \ + "seatFrontLeftHeat { __typename timeStamp value } " \ + "seatFrontRightHeat { __typename timeStamp value } " \ + "seatRearLeftHeat { __typename timeStamp value } " \ + "seatRearRightHeat { __typename timeStamp value } " \ + "chargerStatus { __typename timeStamp value } " \ + "seatFrontLeftVent { __typename timeStamp value } " \ + "seatFrontRightVent { __typename timeStamp value } " \ + "chargerDerateStatus { __typename timeStamp value } " \ + "driveMode { __typename timeStamp value } " \ + "limitedAccelCold { __typename timeStamp value } " \ + "limitedRegenCold { __typename timeStamp value } " \ + "twelveVoltBatteryHealth { __typename timeStamp value } " \ + "serviceMode { __typename timeStamp value } " \ + "trailerStatus { __typename timeStamp value } " \ + "btmFfHardwareFailureStatus { __typename timeStamp value } " \ + "btmIcHardwareFailureStatus { __typename timeStamp value } " \ + "btmLfdHardwareFailureStatus { __typename timeStamp value } " \ + "btmRfHardwareFailureStatus { __typename timeStamp value } " \ + "btmRfdHardwareFailureStatus { __typename timeStamp value } " \ + "carWashMode { __typename timeStamp value } " \ + "chargePortState { __typename timeStamp value } " \ + "chargingTimeEstimationValidity { __typename timeStamp value } " \ + "rearHitchStatus { __typename timeStamp value } " \ + "} }" + + query = { + "operationName": "GetVehicleState", + "query": query, + "variables": { + 'vehicleID': vehicle_id, + }, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() + + def get_vehicle_last_connection(self, vehicle_id): + headers = self.gateway_headers() + query = { + "operationName": "GetVehicleLastConnection", + "query": "query GetVehicleLastConnection($vehicleID: String!) { vehicleState(id: $vehicleID) { __typename cloudConnection { __typename lastSync } } }", + "variables": { + 'vehicleID': vehicle_id, + }, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() + + def plan_trip(self, vehicle_id, starting_soc, starting_range_meters, origin_lat, origin_long, dest_lat, dest_long): + headers = self.gateway_headers() + query = { + "operationName": "planTrip", + "query": "query planTrip($origin: CoordinatesInput!, $destination: CoordinatesInput!, $bearing: Float!, $vehicleId: String!, $startingSoc: Float!, $startingRangeMeters: Float!) { planTrip(bearing: $bearing, vehicleId: $vehicleId, startingSoc: $startingSoc, origin: $origin, destination: $destination, startingRangeMeters: $startingRangeMeters) { routes { routeResponse destinationReached totalChargingDuration arrivalSOC arrivalReachableDistance waypoints { waypointType entityId name latitude longitude maxPower chargeDuration arrivalSOC arrivalReachableDistance departureSOC departureReachableDistance } energyConsumptionOnLeg batteryEmptyToDestinationDistance batteryEmptyLocationLatitude batteryEmptyLocationLongitude } tripPlanStatus chargeStationsAvailable socBelowLimit } }", + "variables": { + 'origin': { + 'latitude': origin_lat, + 'longitude': origin_long, + }, + 'destination': { + 'latitude': dest_lat, + 'longitude': dest_long, + }, + 'bearing': 0, + 'vehicleId': vehicle_id, + 'startingRangeMeters': starting_range_meters, + 'startingSoc': starting_soc, + }, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() + + def get_ota_details(self, vehicle_id): + headers = self.gateway_headers() + query = { + "operationName": "GetVehicle", + "query": "query GetVehicle($vehicleId: String!) { getVehicle(id: $vehicleId) { availableOTAUpdateDetails { url version locale } currentOTAUpdateDetails { url version locale } } }", + "variables": { + 'vehicleId': vehicle_id, + }, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() + + def check_by_rivian_id(self): + headers = self.transaction_headers() + query = { + "operationName": "CheckByRivianId", + "query": "query CheckByRivianId { chargepoint { checkByRivianId } }", + "variables": {}, + } + response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) + return response.json() + + def get_linked_email_for_rivian_id(self): + headers = self.transaction_headers() + query = { + "operationName": "getLinkedEmailForRivianId", + "query": "query getLinkedEmailForRivianId { chargepoint { getLinkedEmailForRivianId { email } } }", + "variables": {}, + } + response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) + return response.json() + + def get_parameter_store_values(self): + headers = self.transaction_headers() + query = { + "operationName": "getParameterStoreValues", + "query": "query getParameterStoreValues($keys: [String!]!) { getParameterStoreValues(keys: $keys) { key value } }", + "variables": { + "keys": ["FF_ACCOUNT_ESTIMATED_DELIVERY_WINDOW_STATIC_MSG"] + }, + } + response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) + return response.json() + + def get_vehicle(self, vehicle_id): + headers = self.gateway_headers() + query = { + "operationName": "GetVehicle", + "query": "query GetVehicle($getVehicleId: String) { getVehicle(id: $getVehicleId) { invitedUsers { __typename ... on ProvisionedUser { devices { type mappedIdentityId id hrid deviceName isPaired isEnabled } firstName lastName email roles userId } ... on UnprovisionedUser { email inviteId status } } } }", + "variables": { + "getVehicleId": vehicle_id + }, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() + + def get_registered_wallboxes(self): + headers = self.gateway_headers() + query = { + "operationName": "getRegisteredWallboxes", + "variables": {}, + "query": "query getRegisteredWallboxes { getRegisteredWallboxes { __typename wallboxId userId wifiId name linked latitude longitude chargingStatus power currentVoltage currentAmps softwareVersion model serialNumber maxPower maxVoltage maxAmps } }" + } + response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) + return response.json() + + def get_provisioned_camp_speakers(self): + headers = self.gateway_headers() + query = { + "operationName": "GetProvisionedCampSpeakers", + "query": "query GetProvisionedCampSpeakers { currentUser { __typename vehicles { __typename id connectedProducts { __typename ... on CampSpeaker { serialNumber id } } } } }", + "variables": {}, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() + + def get_vehicle_images(self): + headers = self.gateway_headers() + query = { + "operationName": "getVehicleImages", + "query": "query getVehicleImages($extension: String!, $resolution: String!) { getVehicleOrderMobileImages(resolution: $resolution, extension: $extension) { __typename orderId url resolution size design placement } getVehicleMobileImages(resolution: $resolution, extension: $extension) { __typename vehicleId url resolution size design placement } }", + "variables": { + "extension": "webp", + "resolution": "hdpi" + }, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() + + def user(self): + headers = self.gateway_headers() + query = { + "operationName": "user", + # "query": "query user { user { email { email } phone { formatted } firstName lastName addresses { id type line1 line2 city state country postalCode } newsletterSubscription smsSubscription registrationChannels2FA userId vehicles {id highestPriorityRole __typename } orderSnapshots(filterTypes: [PRE_ORDER, VEHICLE]) { ...OrderSnapshotsFragment __typename } __typename }} fragment OrderSnapshotsFragment on OrderSnapshot { id total paidTotal subtotal state configurationStatus currency orderDate type fulfillmentSummaryStatus items { id total unitPrice quantity productDetails { ... on VehicleProduct { sku store { country __typename } __typename } ... on StandaloneProduct { sku store { country __typename } __typename } ... on ChildProduct { sku store { country __typename } __typename } __typename } configuration { basePrice ruleset { meta { locale currency country vehicle version rulesetId effectiveDate __typename } groups rules specs options defaults { basePrice initialSelection __typename } __typename } options { optionId groupId price optionDetails { name attrs price visualExterior visualInterior __typename } __typename } __typename } __typename } __typename } } } ", + "query": "query user { user { email { email } phone { formatted } firstName lastName addresses { id type line1 line2 city state country postalCode } newsletterSubscription smsSubscription registrationChannels2FA userId vehicles {id highestPriorityRole __typename } invites (filterStates: [PENDING]) {id inviteState vehicleModel vehicleId creatorFirstName} orderSnapshots(filterTypes: [PRE_ORDER, VEHICLE, RETAIL]) { ...OrderSnapshotsFragment } }} fragment OrderSnapshotsFragment on OrderSnapshot { id total paidTotal subtotal state configurationStatus currency orderDate type fulfillmentSummaryStatus }", + "variables": {}, + } + response = self.raw_graphql_query(url=RIVIAN_ORDERS_PATH, query=query, headers=headers) + return response.json() + + def get_charging_schedule(self, vehicle_id): + headers = self.gateway_headers() + query = { + "operationName": "GetChargingSchedule", + "query": "query GetChargingSchedule($vehicleId: String!) { getVehicle(id: $vehicleId) { chargingSchedules { startTime duration location { latitude longitude } amperage enabled weekDays } } }", + "variables": { + "vehicleId": vehicle_id + }, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() + + + + def get_completed_session_summaries(self): + headers = self.gateway_headers() + query = { + "operationName": "getCompletedSessionSummaries", + "query": "query getCompletedSessionSummaries { getCompletedSessionSummaries { chargerType currencyCode paidTotal startInstant endInstant totalEnergyKwh rangeAddedKm city transactionId vehicleId vehicleName vendor isRoamingNetwork isPublic isHomeCharger meta { transactionIdGroupingKey dataSources } }}", + "variables": {}, + } + response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) + return response.json() + + + def get_charging_session_status(self, job_id, user_id): + headers = self.gateway_headers() + query = { + "operationName": "GetChargingSessionStatus", + "query": "query GetChargingSessionStatus($jobId: ID!, $userId: ID!) { getSessionStatus(jobId: $jobId, userId: $userId) { status errorMessage errorId sessionId } }", + "variables": { + "jobId": "123", + "userId": "123" + }, + } + response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) + return response.json() + + + def get_non_rivian_user_session(self): + headers = self.gateway_headers() + query = { + "operationName": "getNonRivianUserSession", + "query": "query getNonRivianUserSession { getNonRivianUserSession { chargerId transactionId isRivianCharger vehicleChargerState { value updatedAt } } }", + "variables": {}, + } + response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) + return response.json() + + def get_live_session_data(self, vehicle_id): + headers = self.gateway_headers() + query = { + "operationName": "getLiveSessionData", + "query": "query getLiveSessionData($vehicleId: ID) " + "{ getLiveSessionData(vehicleId: $vehicleId) " + "{ isRivianCharger isFreeSession vehicleChargerState { value updatedAt } " + "chargerId startTime timeElapsed timeRemaining { value updatedAt } kilometersChargedPerHour " + "{ value updatedAt } power { value updatedAt } rangeAddedThisSession { value updatedAt } " + "totalChargedEnergy { value updatedAt } timeRemaining { value updatedAt } vehicleChargerState " + "{ value updatedAt } kilometersChargedPerHour { value updatedAt } " + "currentPrice soc { value } currentMiles { value } current { value } } }", + "variables": { + "vehicleId": vehicle_id + }, + } + response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) + return response.json() + + + def get_live_session_history(self, vehicle_id): + headers = self.gateway_headers() + query = { + "operationName": "getLiveSessionHistory", + "query": "query getLiveSessionHistory($vehicleId: ID) { getLiveSessionHistory(vehicleId: $vehicleId) { chartData { kw time } } }", + "variables": { + "vehicleId": vehicle_id + }, + } + response = self.raw_graphql_query(url=RIVIAN_CHARGING_PATH, query=query, headers=headers) + return response.json() + + + # Vehicle commands require an HMAC signature to be sent with the request. + # The HMAC is generated using the command name and the current timestamp, + # using a shared key generated from the phone’s private key and the vehicle’s + # public key. The vehicle’s public key is available in the vehiclePublicKey + # field of the getUserInfo endpoint. + def send_vehicle_command(self, vehicle_id, command, vasPhoneId, deviceId, vehiclePublicKey): + headers = self.gateway_headers() + + query = { + "operationName": "sendVehicleCommand", + "query": "mutation sendVehicleCommand($attrs: VehicleCommandAttributes!) { sendVehicleCommand(attrs: $attrs) { __typename id command state } }", + "variables": { + "attrs": { + "command": command, + "hmac": 0, #your-hmac + "timestamp": time.time(), + "vasPhoneId": vasPhoneId, + "deviceId": deviceId, + "vehicleId": vehicle_id, + } + }, + } + response = self.raw_graphql_query(url=RIVIAN_GATEWAY_PATH, query=query, headers=headers) + return response.json() \ No newline at end of file