Pengambilan Token Akses Printer Universal Print (UP)
Penting
Pencetak harus sudah terdaftar dengan Universal Print untuk mengambil token aksesnya.
Untuk mendapatkan token akses yang mewakili printer, printer harus menghasilkan JSON Web Token (JWT) dan menandatanganinya dengan kunci privat sertifikatnya.
Prosedurnya adalah sebagai berikut:
- Minta Nonce dari titik akhir token perangkat.
- Buat JWT perangkat dengan informasi yang tepat dan tanda tangani dengan kunci privat.
- Kirim permintaan ke titik akhir token perangkat dengan JWT di isi.
1 Meminta Nonce
Untuk meminta nonce, kirim permintaan POST ke titik akhir token perangkat dengan isi yang berisi tantangan server.
1.1 Permintaan HTTP
POST {device_token_url}
{device_token_url}
adalah URL yang diterima dari respons pendaftaran yang berhasil.
1.2 Meminta Tipe Konten
application/x-www-form-urlencoded
1.3 Payload Permintaan
grant_type=srv_challenge&windows_api_version=2.0
1.4 Respons berhasil
Mengembalikan 200 OK dan Nonce dalam payload respons dalam format JSON dengan nilai berikut (peka huruf besar/kecil):
Nama nilai | Jenis nilai | Deskripsi | Wajib diisi |
---|---|---|---|
Nonce | string | String nonce yang akan digunakan dengan permintaan token. | Ya |
1.5 Contoh
1.5.1 Permintaan
POST https://login.microsoftonline.com/425a8e89-feb9-40d2-9fe5-07fb45419e4b/oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Length: 48
grant_type=srv_challenge&windows_api_version=2.0
1.5.2 Respons
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Content-Length: 132
{
"Nonce": "AQABAAAAAADX8GCi6Js6SK82TsD2Pb7rO4c24C6C31bER-HgavkQr-xx11qx0DFkaB6rfm-ikMj\_eUCSQ12bS4Id06ae1CUQjd8jN7xc4uGK-PA6Bj83HyAA"
}
2 Menghasilkan perangkat JWT
JWT perangkat yang dihasilkan akan berisi informasi yang diperlukan bagi penyedia token untuk mengeluarkan token akses perangkat ke printer. Bagian berikutnya akan merinci informasi yang diperlukan di header, isi, dan tanda tangan JWT.
2.1 Header JWT
Parameter header JWT berikut diperlukan:
Nama nilai | Jenis nilai | Deskripsi | Wajib diisi |
---|---|---|---|
alg | string | Algoritma kunci publik yang digunakan untuk menghasilkan kunci publik. Harus sesuai dengan informasi permintaan pendaftaran yang seharusnya "RS256". | Ya |
typ | string | Parameter header jenis. Harus "JWT". | Ya |
x5c | string | Isi lengkap sertifikat perangkat (hanya berisi kunci publik). Ini adalah sertifikat yang dikembalikan oleh respons pendaftaran yang berhasil. | Ya |
2.2 Isi JWT
Parameter isi JWT berikut diperlukan:
Nama nilai | Jenis nilai | Deskripsi | Wajib diisi |
---|---|---|---|
request_nonce | string | Nilai nonce yang diperoleh di bagian 1. | Ya |
grant_type | string | Untai (karakter) literal tetap "device_token" yang menunjukkan kepada server, hanya token perangkat yang diperlukan. | Ya |
sumber daya | string | Audiens target token akses. Ini adalah nilai 'mcp_svc_resource_id' yang dikembalikan oleh respons pendaftaran Selesai yang berhasil. Misalnya: https://print.print.microsoft.com | Ya |
client_id | string | ID Aplikasi (Klien) dari Aplikasi Azure terdaftar dengan izin API ke Universal Print. Untuk membuat Aplikasi Azure dengan izin API yang tepat, lihat pendaftaran ID klien OEM. | Ya |
redirect_uri | string | URI Pengalihan yang dikonfigurasi untuk Aplikasi Azure terdaftar yang digunakan untuk 'client_id' di bagian ini. Untuk mengonfigurasi URI Pengalihan untuk Aplikasi Azure terdaftar, ikuti pendaftaran ID klien OEM. | Ya |
iss | string | ID Perangkat Cloud yang diterima printer dari respons pendaftaran yang berhasil. | Ya |
2.3 Tanda tangan JWT
JWT yang ditandatangani oleh kunci privat perangkat, yang digunakan untuk membuktikan bahwa permintaan dikeluarkan dari perangkat, dan tidak diputar ulang dari yang berbeda.
2.4 Contoh JWT yang Dihasilkan
{
"alg": "RS256",
"typ": "JWT",
"x5c": "MIID8jCCAtqgAwIBAgIQtJE/zIv3C5JOPoIeezhfLzANBgkqhkiG9w0BAQsFADB4MXYwEQYKCZImiZPyLGQBGRYDbmV0MBUGCgmSJomT8ixkARkWB3dpbmRvd3MwHQYDVQQDExZNUy1Pcmdhbml6YXRpb24tQWNjZXNzMCsGA1UECxMkODJkYmFjYTQtM2U4MS00NmNhLTljNzMtMDk1MGMxZWFjYTk3MB4XDTE4MDUxMDAzMjUzMVoXDTI4MDUxMDAzNTUzMVowLzEtMCsGA1UEAxMkZTlhNjc1YTItYTdjNS00ZmU3LThlODMtZmUxZWZhZjgyZWM2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjGw0ePNEZTNgDbTMMb+m8feCQY70yotozZnMFh5HehO2AvlaR1mZnAI+7rWd5pUdmPo83wGSchqj4cOsOQF699UEmZllDDpCMd9e/kkyFFQYVFBjLV67jUNyM5yDwCqSsNyTImuBQjpgOCoYt7nrsJ5nlaEiWB7HNMbPEJI8Szp9eMci/5j5ktRqU9SeWBUF7SIruaFKt5i7phTwx9ELJo554/yaQtJx5gZs1hpO/z9iLORu+13cj5aruvNZFnlyNyD7LNZ43J5biIIuqbFaUhCLBX70vuE/yhxkKjvyZwovP1PP5Bqc7ZLD6vIdh80bgJLd+xFKbL4OcD2DgxWI4QIDAQABo4HAMIG9MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwIgYLKoZIhvcUAQWCHAIEEwSBEKJ1punFp+dPjoP+Hvr4LsYwIgYLKoZIhvcUAQWCHAMEEwSBEHlLkyG0XmRHoNfDVt0FSVQwIgYLKoZIhvcUAQWCHAUEEwSBEImOWkK5/tJAn+UH+0VBnkswFAYLKoZIhvcUAQWCHAgEBQSBAk5BMBMGCyqGSIb3FAEFghwHBAQEgQEwMA0GCSqGSIb3DQEBCwUAA4IBAQB3q4Ey9AijQmHy0S3+fy1PV7pXq6aMhAgF7HvzmEwdmnjSCfvUd+fPkZA3tGQ6gkGlJ3mI4wq0xBZfk6YEQLLSuvukCphzZitz2NnpeCYMYpT2L7G1+EsIMu5+Wz84S4IO57IMBSLMDmsLLP2bHq+w1VOYgS9cO7Vha/nR3Z542LnaRKINUpFedHAtffv2tOQLRCPWk20KP5LEpKuEcM/r5EHFH6beKFuYePpJ7/dhKH69cZFWRtqgaV7BHxeDVr/n3kyHbDv1rwTXIYHaM3qEXDcSmyqEZqu0WEoz0FpVYt2pRw9pSb29+Y6n4vWTyWxVI8zMqDieYmaw7uXctqrr"
}.
{
"request_nonce": "AQABAAAAAADX8GCi6Js6SK82TsD2Pb7rO4c24C6C31bER-HgavkQr-xx11qx0DFkaB6rfm-ikMj\_eUCSQ12bS4Id06ae1CUQjd8jN7xc4uGK-PA6Bj83HyAA",
"grant_type": "device_token",
"resource": "https://microsoft.com/mcp",
"client_id": "1ef464e5-0b61-4c6f-b822-5dc015b9463e",
"redirect_uri": "https://print.print.microsoft.com/",
"iss": "e9a675a2-a7c5-4fe7-8e83-fe1efaf82ec6"
}.
[Signature]
3 Meminta Token Akses Perangkat
Untuk meminta token perangkat, kirim permintaan POST ke titik akhir token perangkat dengan isi yang berisi JWT yang dihasilkan di bagian 2.
3.1 Permintaan HTTP
POST {device_token_url}
{device_token_url}
adalah URL yang diterima dari respons pendaftaran yang berhasil.
3.2 Meminta Tipe Konten
application/x-www-form-urlencoded
3.3 Payload Permintaan
Format yang dikodekan URL Formulir dengan pasangan nama/nilai berikut:
Nama nilai | Deskripsi/Nilai | Wajib |
---|---|---|
grant_type | Harus diatur ke urn:ietf:params:oauth:grant-type:jwt-bearer . Ini menunjukkan bahwa permintaan token dijelaskan dalam JWT. |
Ya |
permintaan | JWT yang dikodekan Base-64 yang dihasilkan di bagian 2. | Ya |
Penting
Pastikan bahwa 'cookie' tidak disertakan saat mengirim permintaan token perangkat. Mengirim cookie dapat mengakibatkan perilaku tak terduga.
3.4 Respons berhasil
Mengembalikan 200 OK dan Token Akses dalam payload respons dalam format JSON dengan nilai utama berikut (peka huruf besar/kecil):
Nama nilai | Jenis nilai | Deskripsi | Wajib diisi |
---|---|---|---|
access_token | string | Token akses yang diminta sebagai JSON Web Token (JWT) yang ditandatangani. Printer dapat menggunakan token ini untuk mengautentikasi ke sumber daya aman, seperti API web. | Ya |
token_type | string | Menunjukkan nilai jenis token. Satu-satunya jenis yang harus dikembalikan adalah Pembawa saat ini. | Ya |
device_info | string | JWT yang mewakili perangkat. | Ya |
Berakhir dalam | string | Berapa lama token akses berlaku/valid (dalam detik). | Ya |
expires_on | string | Rentang waktu kapan token akses kedaluwarsa. Tanggal tersebut dinyatakan sebagai jumlah detik dari 1970-01-01T0:0:0Z UTC hingga waktu kedaluwarsa. Nilai ini digunakan untuk menentukan masa pakai token cache. | Ya |
not_before | string | Waktu sebelum JWT TIDAK BOLEH diterima untuk diproses. | Ya |
sumber daya | string | URI ID Aplikasi dari API web (sumber daya aman). | Ya |
Respons Kesalahan 3.5
Respons kesalahan terperinci dijelaskan di sini: Gunakan kode otorisasi untuk meminta token akses
Payload respons dalam format JSON dengan nilai utama berikut (peka huruf besar/kecil):
Nama nilai | Jenis nilai | Deskripsi | Wajib diisi |
---|---|---|---|
kesalahan | string | String kode kesalahan yang dapat digunakan untuk mengklasifikasikan jenis kesalahan yang terjadi, dan dapat digunakan untuk bereaksi terhadap kesalahan. | Ya |
error_description | string | Pesan kesalahan tertentu yang dapat membantu Anda mengidentifikasi akar penyebab kesalahan autentikasi. | Tidak |
error_codes | Larik bilangan bulat | Daftar kode kesalahan khusus STS yang dapat membantu dalam diagnostik. | Tidak |
rentang waktu | string | Waktu saat peristiwa itu terjadi. | Tidak |
trace_id | string | Pengidentifikasi unik untuk permintaan yang dapat membantu dalam diagnostik. | Tidak |
correlation_id | string | Pengidentifikasi unik untuk permintaan yang dapat membantu dalam diagnostik lintas komponen. | Tidak |
3.5.1 Kesalahan Kritis
Jika printer telah didaftarkan dari portal UP atau sertifikat kedaluwarsa, maka printer akan gagal mendapatkan token akses perangkat. Dalam hal ini, titik akhir token perangkat akan kembali "error": "invalid_grant"
dan "suberror": "device_authentication_failed"
. Pada titik ini, printer harus mengatur ulang statusnya menjadi Tidak Terdaftar karena perangkat perlu didaftarkan ulang.
Contohnya:
{
"error": "invalid_grant",
"error_description": "AADSTS70002: Error validating credentials. AADSTS50155: Device is not authenticated.\\r\\nTrace ID: b099e7ad-ccf8-4eb7-b105-cced2f724d00\\r\\nCorrelation ID: 0d72010c-5a1f-4c19-99a7-48df28c5db66\\r\\nTimestamp: 2018-05-14 01:06:51Z",
"error_codes": [70002, 50155],
"trace_id": "b099e7ad-ccf8-4eb7-b105-cced2f724d00",
"correlation_id": "0d72010c-5a1f-4c19-99a7-48df28c5db66",
"suberror": "device_authentication_failed"
}
3.6 Contoh
3.6.1 Permintaan
POST https://login.microsoftonline.com/425a8e89-feb9-40d2-9fe5-07fb45419e4b/oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Accept-Charset: utf-8
Host: login.microsoftonline.com
Content-Length: 2737
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&request=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsIng1YyI6Ik1JSUQ4akNDQXRxZ0F3SUJBZ0lRdEpFL3pJdjNDNUpPUG9JZWV6aGZMekFOQmdrcWhraUc5dzBCQVFzRkFEQjRNWFl3RVFZS0NaSW1pWlB5TEdRQkdSWURibVYwTUJVR0NnbVNKb21UOGl4a0FSa1dCM2RwYm1SdmQzTXdIUVlEVlFRREV4Wk5VeTFQY21kaGJtbDZZWFJwYjI0dFFXTmpaWE56TUNzR0ExVUVDeE1rT0RKa1ltRmpZVFF0TTJVNE1TMDBObU5oTFRsak56TXRNRGsxTUdNeFpXRmpZVGszTUI0WERURTRNRFV4TURBek1qVXpNVm9YRFRJNE1EVXhNREF6TlRVek1Wb3dMekV0TUNzR0ExVUVBeE1rWlRsaE5qYzFZVEl0WVRkak5TMDBabVUzTFRobE9ETXRabVV4WldaaFpqZ3laV00yTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFqR3cwZVBORVpUTmdEYlRNTWIrbThmZUNRWTcweW90b3pabk1GaDVIZWhPMkF2bGFSMW1abkFJKzdyV2Q1cFVkbVBvODN3R1NjaHFqNGNPc09RRjY5OVVFbVpsbEREcENNZDllL2treUZGUVlWRkJqTFY2N2pVTnlNNXlEd0NxU3NOeVRJbXVCUWpwZ09Db1l0N25yc0o1bmxhRWlXQjdITk1iUEVKSThTenA5ZU1jaS81ajVrdFJxVTlTZVdCVUY3U0lydWFGS3Q1aTdwaFR3eDlFTEpvNTU0L3lhUXRKeDVnWnMxaHBPL3o5aUxPUnUrMTNjajVhcnV2TlpGbmx5TnlEN0xOWjQzSjViaUlJdXFiRmFVaENMQlg3MHZ1RS95aHhrS2p2eVp3b3ZQMVBQNUJxYzdaTEQ2dklkaDgwYmdKTGQreEZLYkw0T2NEMkRneFdJNFFJREFRQUJvNEhBTUlHOU1Bd0dBMVVkRXdFQi93UUNNQUF3RmdZRFZSMGxBUUgvQkF3d0NnWUlLd1lCQlFVSEF3SXdJZ1lMS29aSWh2Y1VBUVdDSEFJRUV3U0JFS0oxcHVuRnArZFBqb1ArSHZyNExzWXdJZ1lMS29aSWh2Y1VBUVdDSEFNRUV3U0JFSGxMa3lHMFhtUkhvTmZEVnQwRlNWUXdJZ1lMS29aSWh2Y1VBUVdDSEFVRUV3U0JFSW1PV2tLNS90SkFuK1VIKzBWQm5rc3dGQVlMS29aSWh2Y1VBUVdDSEFnRUJRU0JBazVCTUJNR0N5cUdTSWIzRkFFRmdod0hCQVFFZ1FFd01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQjNxNEV5OUFpalFtSHkwUzMrZnkxUFY3cFhxNmFNaEFnRjdIdnptRXdkbW5qU0NmdlVkK2ZQa1pBM3RHUTZna0dsSjNtSTR3cTB4QlpmazZZRVFMTFN1dnVrQ3BoelppdHoyTm5wZUNZTVlwVDJMN0cxK0VzSU11NStXejg0UzRJTzU3SU1CU0xNRG1zTExQMmJIcSt3MVZPWWdTOWNPN1ZoYS9uUjNaNTQyTG5hUktJTlVwRmVkSEF0ZmZ2MnRPUUxSQ1BXazIwS1A1TEVwS3VFY00vcjVFSEZINmJlS0Z1WWVQcEo3L2RoS0g2OWNaRldSdHFnYVY3Qkh4ZURWci9uM2t5SGJEdjFyd1RYSVlIYU0zcUVYRGNTbXlxRVpxdTBXRW96MEZwVll0MnBSdzlwU2IyOStZNm40dldUeVd4Vkk4ek1xRGllWW1hdzd1WGN0cXJyIn0.eyJyZXF1ZXN0X25vbmNlIjoiQVFBQkFBQUFBQURYOEdDaTZKczZTSzgyVHNEMlBiN3JPNGMyNEM2QzMxYkVSLUhnYXZrUXIteHgxMXF4MERGa2FCNnJmbS1pa01qX2VVQ1NRMTJiUzRJZDA2YWUxQ1VRamQ4ak43eGM0dUdLLVBBNkJqODNIeUFBIiwiZ3JhbnRfdHlwZSI6ImRldmljZV90b2tlbiIsInJlc291cmNlIjoiaHR0cHM6Ly9taWNyb3NvZnQuY29tL21jcC1wcGUiLCJjbGllbnRfaWQiOiIxZWY0NjRlNS0wYjYxLTRjNmYtYjgyMi01ZGMwMTViOTQ2M2UiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL21jcC1wcGUuYXp1cmV3ZWJzaXRlcy5uZXQvIiwiaXNzIjoiZTlhNjc1YTItYTdjNS00ZmU3LThlODMtZmUxZWZhZjgyZWM2In0.bmvBY7cdD\_dGtbB9dXbjbj5qc5k9ssqOMe1KQnnUnChLz1nkgBMLU\_jBMwsAoHCvI\_udQAdDgyNmWFcnWxTY0sLARZ6FQmjbGclqrqhj\_kkJXdkNBdGcwIXafjQiFkpDlpTMbVjBWoQq49aW-e\_OcmfsVIg8DCdS-s87x0fJ3fuHzZJzVGEHC4D-43EPxWTXfVbsvOV7RNK15lq5GXm10W4DkRngK6EpMq69g75KCUqT\_MEEh5dGezl5Kic8RLZQ72n5aEpc5Y6XK85b1TdOtBnxogVjJFSsxpz1sOIpODszVu9CSUg4CHEjadpKQ9DiYCg6zB9D5fYbMf3NrGWC9Q
3.6.2 Respons
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Content-Length: 2473
{
"token_type":"Bearer",
"expires_in":"3599",
"ext_expires_in":"0",
"expires_on":"1525928144","not_before":"1525924244","resource":"<https://microsoft.com/mcp>",
"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImlCakwxUmNxemhpeTRmcHhJeGRacW9oTTJZayIsImtpZCI6ImlCakwxUmNxemhpeTRmcHhJeGRacW9oTTJZayJ9.eyJhdWQiOiJodHRwczovL21pY3Jvc29mdC5jb20vbWNwLXBwZSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzQyNWE4ZTg5LWZlYjktNDBkMi05ZmU1LTA3ZmI0NTQxOWU0Yi8iLCJpYXQiOjE1MjU5MjQyNDQsIm5iZiI6MTUyNTkyNDI0NCwiZXhwIjoxNTI1OTI4MTQ0LCJhbXIiOlsicnNhIl0sImRldmljZWlkIjoiZTlhNjc1YTItYTdjNS00ZmU3LThlODMtZmUxZWZhZjgyZWM2IiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvNDI1YThlODktZmViOS00MGQyLTlmZTUtMDdmYjQ1NDE5ZTRiLyIsImlkdHlwIjoiZGV2aWNlIiwiaXBhZGRyIjoiMTY3LjIyMC4wLjc0Iiwib2lkIjoiZjM5NjNiMDItY2NjNS00NTg5LTkwYjQtMDJkNTA0OWE5ZGY3Iiwic3ViIjoiZTlhNjc1YTItYTdjNS00ZmU3LThlODMtZmUxZWZhZjgyZWM2IiwidGlkIjoiNDI1YThlODktZmViOS00MGQyLTlmZTUtMDdmYjQ1NDE5ZTRiIiwidXRpIjoiV005dVBHbXltRWV3RmdpMl9PcEdBQSIsInZlciI6IjEuMCJ9.gjCICKD2NT69bro4wK8r6SJhP6CBflnBqmlpF3pITl\_1Klv1DNYTue7a-Tup0vkFu0inN8njTG7rxlK\_j4m2mn1iUuh6CO-o98hN6VzjrarvZceBzGtsiOU2jtdacWP4JmePtTaXRmGDlK-PbTLy\_v4VmbL\_cQN2RIEiwf81suwnBacko0xbQhO3cPmGwKZcB5kFV4tnHp0uBnxyfcpRfV-ZR9Age41LWDW1ulOsTVuv1Q4XmmOmStkh2-TH1jOq1did6jyK1LKncdsSvEhKeo49-yBNshGntPs24qWL2WShz5cMQ3w5OBbAUOwl1DL-\_NtcUjCwbaLRwS6Dyliejw\",\"device\_info\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImlCakwxUmNxemhpeTRmcHhJeGRacW9oTTJZayIsImtpZCI6ImlCakwxUmNxemhpeTRmcHhJeGRacW9oTTJZayJ9.eyJhdWQiOiJiYWZjYjg2Zi1kYWFhLTQxYjEtYjQ5NC04NjA0MzZhNGMzMGQiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC80MjVhOGU4OS1mZWI5LTQwZDItOWZlNS0wN2ZiNDU0MTllNGIvIiwiaWF0IjoxNTI1OTI0MjQ0LCJuYmYiOjE1MjU5MjQyNDQsImV4cCI6MTUyNTkyODE0NCwiZGV2aWNlaWQiOiJlOWE2NzVhMi1hN2M1LTRmZTctOGU4My1mZTFlZmFmODJlYzYiLCJpZHAiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC80MjVhOGU4OS1mZWI5LTQwZDItOWZlNS0wN2ZiNDU0MTllNGIvIiwiaWR0eXAiOiJkZXZpY2UiLCJvaWQiOiJmMzk2M2IwMi1jY2M1LTQ1ODktOTBiNC0wMmQ1MDQ5YTlkZjciLCJzdWIiOiJlOWE2NzVhMi1hN2M1LTRmZTctOGU4My1mZTFlZmFmODJlYzYiLCJ0aWQiOiI0MjVhOGU4OS1mZWI5LTQwZDItOWZlNS0wN2ZiNDU0MTllNGIiLCJ1dGkiOiJXTTl1UEdteW1FZXdGZ2kyX09wR0FBIiwidmVyIjoiMS4wIn0.CPNbz9Cr20Ig\_i7Fc8GUx1NVpGXqQs9HsNH3F-QxUeJsep7m1rwiTE8WXsfXxiNGco0j1HFykiHdAsE\_-ymeVXaUtA5InC3uEeiHuIihQGbo9GC5gibzjsS\_psfqE74v\_9o7WuJTjFhpGdl1h57sOX49la312uR\_Khr6I6tIGiFon-gn4rGq5U0O4NV\_5LeitiHUXxuVxD2O9J5vERpwmnQ0UtyxX9skyFGEtcEruNch6noy\_5710xbcYv-8uO4VM8tM6CoqigWg\_7o18OciJ0VRBmsFLZtJUOxVSlPKeFneFDyKujpttbMIP-0-FdS75qckkqGYzoVbSuzsIcJa5g"
}