Google సమీక్షల API ఇంటిగ్రేషన్లో OAuth 2.0 దారిమార్పు URI సమస్యలను అధిగమించడం
పైథాన్లో Google వ్యాపార సమీక్షలను ఏకీకృతం చేస్తున్నప్పుడు, చాలా మంది డెవలపర్లు సాధారణ లోపాన్ని ఎదుర్కొంటారు "Error 400: redirect_uri_mmatch." OAuth 2.0 సెట్టింగ్లలో దారిమార్పు URI మరియు Google క్లౌడ్ కన్సోల్లో పేర్కొన్న వాటి మధ్య తప్పుగా అమరిక కారణంగా ఈ సమస్య తలెత్తుతుంది. ఈ లోపం Google రివ్యూల APIకి యాక్సెస్ను నిరోధించవచ్చు, ఇది కస్టమర్ ఫీడ్బ్యాక్ను ప్రోగ్రామాటిక్గా తిరిగి పొందడంలో కీలకమైనది.
Google OAuth 2.0 విధానం కఠినమైనది, కాన్ఫిగర్ చేయబడిన దారిమార్పు URI మరియు ప్రామాణీకరణ సమయంలో ఉపయోగించిన దాని మధ్య ఖచ్చితమైన సరిపోలిక అవసరం. దీన్ని సరిగ్గా కాన్ఫిగర్ చేయడంలో వైఫల్యం నిరాశకు దారి తీస్తుంది, ప్రత్యేకించి చాలా మంది డెవలపర్లు నివేదించినట్లుగా దారిమార్పు పోర్ట్ నంబర్ తరచుగా మారినప్పుడు. మృదువైన API కనెక్షన్ని నిర్ధారించడానికి మరియు ఈ రోడ్బ్లాక్ను తాకకుండా ఉండటానికి ఈ సమస్యను అర్థం చేసుకోవడం చాలా అవసరం.
ఈ కథనంలో, Google వ్యాపార సమీక్షలను యాక్సెస్ చేస్తున్నప్పుడు దారిమార్పు_uri_mmatch లోపాన్ని పరిష్కరించడానికి మేము దశల ద్వారా నడుస్తాము. మీ OAuth ఆధారాలను జాగ్రత్తగా కాన్ఫిగర్ చేయడం ద్వారా, మేము ఈ సమస్యను తొలగిస్తాము మరియు మీరు సులభంగా సమీక్షలను పొందేలా చేస్తాము. మళ్లింపు URIని సరిగ్గా సెట్ చేయడం మరియు దానిని డెవలప్మెంట్ కోసం ఉపయోగించే లోకల్ హోస్ట్ ఎన్విరాన్మెంట్తో సమలేఖనం చేయడం పరిష్కారం.
మీరు వ్యాపార పనితీరును విశ్లేషించడానికి లేదా వాటిని మీ వెబ్సైట్లో ప్రదర్శించడానికి సమీక్షలను పొందుతున్నా, ఈ లోపాన్ని ఎలా పరిష్కరించాలో అర్థం చేసుకోవడం సమయాన్ని ఆదా చేస్తుంది మరియు విజయవంతమైన API పరస్పర చర్యను నిర్ధారిస్తుంది. అసమతుల్యతను పరిష్కరించడానికి మరియు అంతరాయాలు లేకుండా మీ Google వ్యాపారం సమీక్షలను యాక్సెస్ చేయడానికి ఈ దశలను అనుసరించండి.
| ఆదేశం | ఉపయోగం యొక్క ఉదాహరణ |
|---|---|
| flow.run_local_server(port=8080) | OAuth 2.0 అధికారాన్ని నిర్వహించడానికి పేర్కొన్న పోర్ట్లో స్థానిక వెబ్ సర్వర్ను ప్రారంభిస్తుంది. ఈ పద్ధతి ప్రత్యేకంగా Google APIల కోసం స్థానికంగా OAuth ఫ్లోను నిర్వహించడానికి ప్రత్యేకంగా ఉంటుంది. |
| response.raise_for_status() | API ప్రతిస్పందన చెడ్డ HTTP స్థితి కోడ్ని కలిగి ఉంటే HTTPErrorని పెంచుతుంది. ఇది సరికాని URLలు లేదా అనుమతి ఎర్రర్ల వంటి సమస్యలను గుర్తించడంలో సహాయపడుతుంది, ఇది API అభ్యర్థన లోపాలను నిర్వహించడానికి ఇది అవసరం. |
| session.headers.update() | అవసరమైన అధికార టోకెన్ మరియు కంటెంట్ రకంతో సెషన్ ఆబ్జెక్ట్ హెడర్లను అప్డేట్ చేస్తుంది. OAuth 2.0 ఆధారాలను ఉపయోగించి Google వ్యాపారం APIతో API అభ్యర్థనలను ప్రామాణీకరించడానికి ఇది చాలా కీలకం. |
| flow.fetch_token(authorization_response=request.url) | వినియోగదారుని అప్లికేషన్కు తిరిగి మళ్లించిన తర్వాత OAuth టోకెన్ని పొందుతుంది. ఈ పద్ధతి Flask లేదా స్థానిక పరిసరాలలో OAuth 2.0 ఫ్లోను పూర్తి చేయడానికి అవసరమైన అధికార ప్రతిస్పందనను ప్రాసెస్ చేస్తుంది. |
| redirect_uri=url_for("oauth2callback", _external=True) | కాల్బ్యాక్ URLని సూచిస్తూ OAuth ఫ్లో కోసం దారిమార్పు URIని డైనమిక్గా రూపొందిస్తుంది. ఫ్లాస్క్లోని ఈ పద్ధతి OAuth ప్రమాణీకరణ ప్రక్రియలో సరైన దారి మళ్లింపు ఉపయోగించబడుతుందని నిర్ధారిస్తుంది. |
| loguru.logger | నిజ-సమయ డీబగ్గింగ్ కోసం ఉపయోగించే తేలికపాటి లాగింగ్ లైబ్రరీ. ఇది సులభంగా చదవగలిగే లాగ్ అవుట్పుట్లను అందిస్తుంది, ఇది OAuth ప్రామాణీకరణ మరియు API అభ్యర్థనల పురోగతిని ట్రాక్ చేయడానికి ప్రత్యేకంగా సహాయపడుతుంది. |
| Flow.from_client_secrets_file() | JSON ఫైల్లో నిల్వ చేసిన ఆధారాలను ఉపయోగించి OAuth 2.0 ఫ్లోను ప్రారంభిస్తుంది. ఈ ఆదేశం Google APIలతో OAuth ప్రమాణీకరణను నిర్వహించడానికి ప్రత్యేకంగా ఉంటుంది మరియు పైథాన్ అప్లికేషన్లలో క్లయింట్ రహస్యాలను లోడ్ చేయడానికి ఉపయోగించబడుతుంది. |
| authorization_url, _ = flow.authorization_url() | OAuth ప్రమాణీకరణ కోసం వినియోగదారుని దారి మళ్లించడానికి అవసరమైన అధికార URLని రూపొందిస్తుంది. Google APIలలో OAuth 2.0 అధికార ప్రక్రియను ప్రారంభించడానికి ఈ ఆదేశం అవసరం. |
Google సమీక్షల APIని యాక్సెస్ చేయడం కోసం OAuth 2.0 ప్రక్రియను అర్థం చేసుకోవడం
పైన అందించిన పైథాన్ స్క్రిప్ట్లు Google My Business APIని ఉపయోగించి Google వ్యాపార సమీక్షలను పొందేందుకు రూపొందించబడ్డాయి. Google APIలతో సురక్షితంగా పరస్పర చర్య చేయడానికి అవసరమైన OAuth 2.0 అధికారాన్ని సెటప్ చేయడం మొదటి దశలో ఉంటుంది. మీ Google క్లౌడ్ ప్రాజెక్ట్ కోసం ఆధారాలను కలిగి ఉన్న JSON ఫైల్లో మీ OAuth క్లయింట్ రహస్యాలను పేర్కొనడం ద్వారా ఈ ప్రక్రియ ప్రారంభమవుతుంది. ఈ ఆధారాలు సురక్షిత యాక్సెస్ని స్థాపించడానికి కీలకం, మరియు URIని దారి మళ్లించండి తప్పనిసరిగా Google క్లౌడ్ కన్సోల్లో కాన్ఫిగర్ చేయబడిన దానితో సరిపోలాలి. అసమతుల్యత వలన "Error 400: redirect_uri_mmatch" వంటి ఎర్రర్ ఏర్పడవచ్చు.
ఆధారాలు లోడ్ అయిన తర్వాత, స్క్రిప్ట్ InstalledAppFlowని ఉపయోగించి OAuth ఫ్లోను ప్రారంభిస్తుంది. ఈ ప్రవాహం వినియోగదారు అధికారాన్ని నిర్వహించడానికి స్థానిక సర్వర్ను (ఈ సందర్భంలో, పోర్ట్ 8080లో) ప్రారంభిస్తుంది. వినియోగదారు అనుమతిని మంజూరు చేసినప్పుడు, స్క్రిప్ట్ యాక్సెస్ టోకెన్ను అందుకుంటుంది, ఇది Google సమీక్షల APIకి అధీకృత అభ్యర్థనలు చేయడానికి అవసరం. ఈ ప్రక్రియ స్వయంచాలకంగా మరియు ఫ్లో.రన్_లోకల్_సర్వర్ పద్ధతి ద్వారా నిర్వహించబడుతుంది, ఆధారాలు సురక్షితంగా నిల్వ చేయబడి, API అభ్యర్థనల కోసం ఉపయోగించబడుతున్నాయని నిర్ధారిస్తుంది. లాగింగ్ మెకానిజమ్స్ వంటివి లోగురు ప్రవాహాన్ని ట్రాక్ చేయడానికి మరియు ఏవైనా సమస్యలు ఎదురైతే డీబగ్గింగ్ కోసం స్పష్టంగా లాగ్ చేయబడిందని నిర్ధారించుకోవడానికి ఉపయోగించబడతాయి.
ఆధారాలను విజయవంతంగా పొందిన తర్వాత, స్క్రిప్ట్ అభ్యర్థనల లైబ్రరీని ఉపయోగించి సెషన్ను ఏర్పాటు చేస్తుంది. ఈ సెషన్ దాని హెడర్లలో యాక్సెస్ టోకెన్ను కలిగి ఉంటుంది, ఇది Googleకి API కాల్లు చేస్తున్నప్పుడు ప్రామాణీకరణ కోసం అవసరం. స్క్రిప్ట్ మీ వ్యాపార ఖాతా ID మరియు స్థాన IDని ఉపయోగించి సరైన API ముగింపు URLని నిర్మిస్తుంది. URLకి GET అభ్యర్థనను పంపడం ద్వారా, స్క్రిప్ట్ పేర్కొన్న వ్యాపార స్థానం కోసం సమీక్షలను పొందేందుకు ప్రయత్నిస్తుంది. అభ్యర్థన సమయంలో ఎదురయ్యే ఏవైనా సమస్యలు సమర్ధవంతంగా నిర్వహించబడుతున్నాయని నిర్ధారిస్తూ, తప్పు ఆధారాలు లేదా అనుమతులు వంటి HTTP ఎర్రర్లను క్యాచ్ చేయడానికి ఇది ఎర్రర్ హ్యాండ్లింగ్ను కూడా కలిగి ఉంటుంది.
Google సమీక్షల API నుండి ప్రతిస్పందన JSON ఆబ్జెక్ట్గా అన్వయించబడింది, ఇది వ్యాపార స్థానం కోసం సమీక్షలను కలిగి ఉంటుంది. అభ్యర్థన విజయవంతమైతే, సమీక్షలు కన్సోల్కు ముద్రించబడతాయి మరియు స్క్రిప్ట్ విజయవంతమైన సందేశాన్ని లాగ్ చేస్తుంది. ఈ మాడ్యులర్ విధానం ప్రక్రియ సులభంగా పునరావృతమయ్యేలా మరియు వివిధ స్థానాలు లేదా ఖాతాల కోసం అనుకూలీకరించబడుతుందని నిర్ధారిస్తుంది. ఇంకా, సెషన్ మేనేజ్మెంట్ మరియు ఎర్రర్ హ్యాండ్లింగ్తో స్పష్టమైన నిర్మాణాన్ని నిర్వహించడం ద్వారా, Google రివ్యూల APIతో పని చేస్తున్నప్పుడు స్క్రిప్ట్ భద్రత మరియు పనితీరును ఆప్టిమైజ్ చేస్తుంది. ఇది విశ్లేషణ లేదా ప్రదర్శన కోసం కస్టమర్ రివ్యూలను సమర్థవంతంగా యాక్సెస్ చేయడానికి మరియు నిర్వహించడానికి డెవలపర్లను అనుమతిస్తుంది.
Google సమీక్షల API కోసం పైథాన్లో Google OAuth 2.0 లోపం 400ని నిర్వహించడం
దారిమార్పు URI సెటప్పై దృష్టి సారించి పైథాన్ మరియు Google OAuth 2.0 APIని ఉపయోగించి పరిష్కారం
import requestsfrom google_auth_oauthlib.flow import InstalledAppFlowfrom loguru import logger as log# Replace with your actual Google Business account and location IDsmy_business_account_id = "YOUR_ACCOUNT_ID"location_id = "YOUR_LOCATION_ID"# Path to your OAuth 2.0 Client Secret JSON fileGCP_CREDENTIALS_PATH = "path/to/your/google_review_client.json"# Set a consistent redirect URIredirect_uri = "http://localhost:8080/"# Setup the OAuth 2.0 flow with required scopesflow = InstalledAppFlow.from_client_secrets_file(GCP_CREDENTIALS_PATH,scopes=["https://www.googleapis.com/auth/business.manage"],redirect_uri=redirect_uri)# Run OAuth flow to obtain credentialscredentials = flow.run_local_server(port=8080)log.debug(f"Credentials: {credentials}")# Setup the API request sessionsession = requests.Session()session.headers.update({"Authorization": f"Bearer {credentials.token}"})# Construct the API endpoint URLurl = f"https://mybusiness.googleapis.com/v4/accounts/{my_business_account_id}/locations/{location_id}/reviews"# Make API request and handle potential errorstry:response = session.get(url)response.raise_for_status()reviews = response.json()print("Reviews fetched successfully.")print(reviews)except requests.exceptions.HTTPError as http_err:log.error(f"HTTP error: {http_err}")except Exception as err:log.error(f"Unexpected error: {err}")
Google క్లౌడ్ కన్సోల్లో దారిమార్పు URIని అప్డేట్ చేయడం ద్వారా redirect_uri_mmatchని పరిష్కరిస్తోంది
సరైన దారి మళ్లింపు URIని కాన్ఫిగర్ చేయడానికి Google క్లౌడ్ కన్సోల్ని ఉపయోగించి పరిష్కారం
# Step 1: Open Google Cloud Console# Step 2: Navigate to your project and go to "APIs & Services" > "Credentials"# Step 3: Edit the OAuth 2.0 Client IDs settings# Step 4: In "Authorized redirect URIs", add "http://localhost:8080/"# Step 5: Save your changes# After setting the correct redirect URI, re-run your Python script# This ensures the OAuth 2.0 flow will use the correct URI during authentication
Google OAuth దారిమార్పులను నిర్వహించడానికి Flask-ఆధారిత స్థానిక వెబ్ సర్వర్ను సృష్టిస్తోంది
OAuth రీడైరెక్ట్ URI హ్యాండ్లింగ్పై మెరుగైన నియంత్రణ కోసం Flaskని ఉపయోగించే పరిష్కారం
from flask import Flask, redirect, request, session, url_forfrom google_auth_oauthlib.flow import Flow# Flask setupapp = Flask(__name__)app.secret_key = "your_secret_key"# Path to OAuth 2.0 Client Secret JSONGCP_CREDENTIALS_PATH = "google_review_client.json"@app.route("/authorize")def authorize():flow = Flow.from_client_secrets_file(GCP_CREDENTIALS_PATH,scopes=["https://www.googleapis.com/auth/business.manage"],redirect_uri=url_for("oauth2callback", _external=True))authorization_url, _ = flow.authorization_url()return redirect(authorization_url)@app.route("/oauth2callback")def oauth2callback():flow = Flow.from_client_secrets_file(GCP_CREDENTIALS_PATH,scopes=["https://www.googleapis.com/auth/business.manage"],redirect_uri=url_for("oauth2callback", _external=True))flow.fetch_token(authorization_response=request.url)session["credentials"] = flow.credentialsreturn redirect("/reviews")# Run the Flask serverif __name__ == "__main__":app.run("localhost", 8080)
పైథాన్ ఇంటిగ్రేషన్ కోసం Google APIలలో OAuth దారిమార్పు సమస్యలను పరిష్కరించడం
Google APIలను పైథాన్ అప్లికేషన్లలోకి చేర్చేటప్పుడు తరచుగా విస్మరించబడే ఒక క్లిష్టమైన అంశం ఖచ్చితమైన కాన్ఫిగరేషన్ URIని దారి మళ్లించండి. OAuth 2.0 ప్రమాణీకరణకు ఈ సెట్టింగ్ చాలా ముఖ్యమైనది మరియు ఈ URIలో సరిపోలకపోవడం తరచుగా "ఎర్రర్ 400: redirect_uri_mismatch" ఎర్రర్కు దారి తీస్తుంది. ఫ్లో సురక్షితంగా ఉందని మరియు ఉత్తమ పద్ధతులను అనుసరిస్తుందని నిర్ధారించడానికి Google యొక్క ప్రామాణీకరణ ప్రక్రియ కఠినంగా ఉంటుంది. అందువల్ల, డెవలపర్లు Google క్లౌడ్ కన్సోల్లో కాన్ఫిగర్ చేయబడిన దారిమార్పు URI వారి అప్లికేషన్ కోడ్లో ఉపయోగించిన దానితో సరిగ్గా సరిపోలుతుందని నిర్ధారించుకోవాలి.
OAuth ప్రవాహంలో పోర్ట్లు ఎలా పని చేస్తాయో అర్థం చేసుకోవడం మరో ముఖ్యమైన అంశం, ప్రత్యేకించి స్థానిక వాతావరణంలో పని చేస్తున్నప్పుడు. వంటి సాధనాలను ఉపయోగిస్తున్నప్పుడు డెవలపర్లు తరచుగా మారుతున్న పోర్ట్ నంబర్లను ఎదుర్కొంటారు (ముందు పేర్కొన్న "52271" లోపం వంటివి) flow.run_local_server(). పోర్ట్ నంబర్ను సరిచేయడం మంచిది (ఉదా., 8080) అసమతుల్యతలను నివారించడానికి మరియు కోడ్లోని పోర్ట్ నంబర్ను స్పష్టంగా పాస్ చేయడం ద్వారా దీన్ని చేయవచ్చు. ఇది స్థిరత్వాన్ని నిర్ధారించడమే కాకుండా డైనమిక్ పోర్ట్ అసైన్మెంట్ కారణంగా తలెత్తే లోపాలను కూడా నివారిస్తుంది.
అదనంగా, మీ నిర్వహణ OAuth 2.0 credentials సురక్షితంగా అవసరం. క్లయింట్ రహస్యాలను కలిగి ఉన్న JSON ఫైల్ తప్పనిసరిగా సురక్షిత ప్రదేశంలో నిల్వ చేయబడాలి మరియు యాక్సెస్ టోకెన్లు కాలానుగుణంగా రిఫ్రెష్ చేయబడాలి. ఈ టోకెన్లను అప్డేట్ చేయడం వలన API కాల్లు చెల్లుబాటు అయ్యేలా నిర్ధారిస్తుంది, ఎందుకంటే గడువు ముగిసిన టోకెన్లు కూడా ప్రామాణీకరణ సమస్యలను కలిగిస్తాయి. మొత్తంమీద, మీ ప్రామాణీకరణ ప్రవాహాన్ని జాగ్రత్తగా నిర్వహించడం సులభతరమైన ఏకీకరణను నిర్ధారిస్తుంది మరియు దారిమార్పు URI అసమతుల్యత లోపం వంటి సాధారణ ఆపదలను తొలగిస్తుంది.
Google సమీక్షల API ఇంటిగ్రేషన్ కోసం సాధారణ ప్రశ్నలు మరియు పరిష్కారాలు
- Google APIలలో "ఎర్రర్ 400: redirect_uri_mmatch"కి కారణం ఏమిటి?
- మీ కోడ్లోని దారిమార్పు URI మరియు Google క్లౌడ్ కన్సోల్లో నమోదు చేయబడిన వాటి మధ్య సరిపోలకపోవడం వల్ల ఈ ఎర్రర్ ఏర్పడింది. అవి సరిగ్గా సరిపోతాయని నిర్ధారించుకోండి.
- ఉపయోగిస్తున్నప్పుడు నేను పోర్ట్ నంబర్ను ఎలా పరిష్కరించగలను flow.run_local_server()?
- పోర్ట్ సంఖ్యను పరిష్కరించడానికి, పాస్ చేయడం ద్వారా 8080 వంటి స్టాటిక్ పోర్ట్ను పేర్కొనండి port=8080 లో flow.run_local_server() పద్ధతి.
- నాది అయితే నేను ఏమి చేయాలి access token గడువు ముగుస్తుందా?
- ప్రస్తుత టోకెన్ గడువు ముగిసేలోపు కొత్త టోకెన్ను అభ్యర్థించడానికి మీరు Google OAuth లైబ్రరీని ఉపయోగించి టోకెన్ రిఫ్రెష్ లాజిక్ను అమలు చేయాలి.
- నేను సేవా ఖాతాను నమోదు చేయకుండా APIని ఉపయోగించవచ్చా?
- లేదు, మీరు Google రివ్యూల APIని యాక్సెస్ చేయడానికి మీ అప్లికేషన్ను ప్రామాణీకరించడానికి తప్పనిసరిగా సేవా ఖాతాను సృష్టించి, JSON కీ ఫైల్ని డౌన్లోడ్ చేసుకోవాలి.
- ఎందుకు చేస్తుంది redirect URI పరీక్ష సమయంలో మారుతున్నారా?
- డైనమిక్ పోర్ట్ అసైన్మెంట్లను ఉపయోగిస్తున్నప్పుడు ఇది సాధారణంగా జరుగుతుంది. దీన్ని పరిష్కరించడానికి, మీ స్థానిక OAuth సర్వర్ సెటప్లో స్టాటిక్ పోర్ట్ (ఉదా. 8080) సెట్ చేయండి.
Google API దారిమార్పు సమస్యలను పరిష్కరించడంపై తుది ఆలోచనలు
"Error 400: redirect_uri_mmatch" లోపాన్ని పరిష్కరించడానికి, మీ OAuth 2.0 ఆధారాలను సరిగ్గా కాన్ఫిగర్ చేయడం మరియు కోడ్లోని దారిమార్పు URI Google క్లౌడ్లో నమోదు చేయబడిన దానితో సరిపోలుతుందని నిర్ధారించుకోవడం చాలా అవసరం. విజయవంతమైన API ఇంటిగ్రేషన్ కోసం ఈ దశ కీలకం.
అదనంగా, సెషన్ హెడర్లను నిర్వహించడం మరియు సంభావ్య HTTP ఎర్రర్లను సరిగ్గా నిర్వహించడం Google సమీక్షల APIకి సాఫీగా యాక్సెస్ని నిర్ధారిస్తుంది. పోర్ట్ను పరిష్కరించడం మరియు మీ కోడ్ని ఆప్టిమైజ్ చేయడం ద్వారా, డెవలపర్లు రివ్యూలను సమర్ధవంతంగా తిరిగి పొందగలరు, కస్టమర్ ఫీడ్బ్యాక్ను సులభంగా పర్యవేక్షించేందుకు వ్యాపారాలను అనుమతిస్తుంది.
Google సమీక్షల API ఇంటిగ్రేషన్ మరియు ఎర్రర్ హ్యాండ్లింగ్ కోసం సూచనలు
- OAuth 2.0 కాన్ఫిగరేషన్తో సహా Google వ్యాపార సమీక్షల APIని ప్రారంభించడం మరియు సెటప్ చేయడం కోసం వివరణాత్మక దశలు అధికారిక నుండి సూచించబడ్డాయి Google డెవలపర్ల డాక్యుమెంటేషన్ .
- "Error 400: redirect_uri_mmatch" సమస్య పరిష్కారానికి సంబంధించిన సమాచారం చర్చల నుండి తీసుకోబడింది స్టాక్ ఓవర్ఫ్లో కమ్యూనిటీ , వివిధ డెవలపర్లు తమ అనుభవాలు మరియు పరిష్కారాలను పంచుకున్నారు.
- జనరల్ OAuth 2.0 ఉత్తమ అభ్యాసాలు మరియు కాన్ఫిగరేషన్ చిట్కాలు, ముఖ్యంగా పైథాన్ కోసం, అధికారిక గైడ్లో కనుగొనబడ్డాయి Google Auth OAutlib పైథాన్ డాక్యుమెంటేషన్ .