# Membangun Aplikasi Perbankan Bagian 2: Membuat Formulir Login dan Registrasi
```mermaid
journey
title Your Form Development Journey
section HTML Foundation
Understand form elements: 3: Student
Learn input types: 4: Student
Master accessibility: 4: Student
section JavaScript Integration
Handle form submission: 4: Student
Implement AJAX communication: 5: Student
Process server responses: 5: Student
section Validation Systems
Create multi-layer validation: 5: Student
Enhance user experience: 5: Student
Ensure data integrity: 5: Student
```
## Kuis Pra-Pelajaran
[Kuis pra-pelajaran](https://ff-quizzes.netlify.app/web/quiz/43)
Pernah mengisi formulir online dan email Anda ditolak karena formatnya salah? Atau kehilangan semua informasi saat Anda mengklik tombol kirim? Kita semua pernah mengalami pengalaman yang menjengkelkan ini.
Formulir adalah jembatan antara pengguna dan fungsi aplikasi Anda. Seperti protokol hati-hati yang digunakan pengendali lalu lintas udara untuk memandu pesawat dengan aman ke tujuannya, formulir yang dirancang dengan baik memberikan umpan balik yang jelas dan mencegah kesalahan yang mahal. Formulir yang buruk, di sisi lain, dapat membuat pengguna pergi lebih cepat daripada kesalahan komunikasi di bandara yang sibuk.
Dalam pelajaran ini, kita akan mengubah aplikasi perbankan statis Anda menjadi aplikasi interaktif. Anda akan belajar membuat formulir yang memvalidasi input pengguna, berkomunikasi dengan server, dan memberikan umpan balik yang bermanfaat. Anggap saja ini sebagai membangun antarmuka kontrol yang memungkinkan pengguna menavigasi fitur aplikasi Anda.
Pada akhirnya, Anda akan memiliki sistem login dan registrasi lengkap dengan validasi yang memandu pengguna menuju kesuksesan daripada frustrasi.
```mermaid
mindmap
root((Form Development))
HTML Foundation
Semantic Elements
Input Types
Accessibility
Label Association
User Experience
Validation Feedback
Error Prevention
Loading States
Success Messaging
JavaScript Integration
Event Handling
AJAX Communication
Data Processing
Error Management
Validation Layers
HTML5 Validation
Client-side Logic
Server-side Security
Progressive Enhancement
Modern Patterns
Fetch API
Async/Await
Form Data API
Promise Handling
```
## Prasyarat
Sebelum kita mulai membuat formulir, mari kita pastikan semuanya sudah diatur dengan benar. Pelajaran ini melanjutkan dari pelajaran sebelumnya, jadi jika Anda melewatkannya, Anda mungkin ingin kembali dan menyelesaikan dasar-dasarnya terlebih dahulu.
### Pengaturan yang Diperlukan
| Komponen | Status | Deskripsi |
|-----------|--------|-------------|
| [Template HTML](../1-template-route/README.md) | โ Diperlukan | Struktur dasar aplikasi perbankan Anda |
| [Node.js](https://nodejs.org) | โ Diperlukan | Runtime JavaScript untuk server |
| [Server API Bank](../api/README.md) | โ Diperlukan | Layanan backend untuk penyimpanan data |
> ๐ก **Tips Pengembangan**: Anda akan menjalankan dua server terpisah secara bersamaan โ satu untuk aplikasi perbankan front-end Anda dan satu lagi untuk API backend. Pengaturan ini mencerminkan pengembangan dunia nyata di mana layanan front-end dan back-end beroperasi secara independen.
### Konfigurasi Server
**Lingkungan pengembangan Anda akan mencakup:**
- **Server front-end**: Menyediakan aplikasi perbankan Anda (biasanya port `3000`)
- **Server API backend**: Menangani penyimpanan dan pengambilan data (port `5000`)
- **Kedua server** dapat berjalan secara bersamaan tanpa konflik
**Menguji koneksi API Anda:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**Jika Anda melihat respons versi API, Anda siap melanjutkan!**
---
## Memahami Formulir HTML dan Kontrol
Formulir HTML adalah cara pengguna berkomunikasi dengan aplikasi web Anda. Anggap mereka sebagai sistem telegraf yang menghubungkan tempat-tempat jauh di abad ke-19 โ mereka adalah protokol komunikasi antara niat pengguna dan respons aplikasi. Ketika dirancang dengan hati-hati, mereka menangkap kesalahan, memandu format input, dan memberikan saran yang bermanfaat.
Formulir modern jauh lebih canggih daripada input teks dasar. HTML5 memperkenalkan jenis input khusus yang secara otomatis menangani validasi email, format angka, dan pemilihan tanggal. Peningkatan ini menguntungkan baik aksesibilitas maupun pengalaman pengguna seluler.
### Elemen Formulir Esensial
**Blok bangunan yang dibutuhkan setiap formulir:**
```html
```
**Apa yang dilakukan kode ini:**
- **Membuat** wadah formulir dengan pengidentifikasi unik
- **Menentukan** metode HTTP untuk pengiriman data
- **Mengasosiasikan** label dengan input untuk aksesibilitas
- **Mendefinisikan** tombol kirim untuk memproses formulir
### Jenis Input Modern dan Atribut
| Jenis Input | Tujuan | Contoh Penggunaan |
|------------|---------|---------------|
| `text` | Input teks umum | `` |
| `email` | Validasi email | `` |
| `password` | Entri teks tersembunyi | `` |
| `number` | Input angka | `` |
| `tel` | Nomor telepon | `` |
> ๐ก **Keuntungan HTML5 Modern**: Menggunakan jenis input tertentu memberikan validasi otomatis, keyboard seluler yang sesuai, dan dukungan aksesibilitas yang lebih baik tanpa JavaScript tambahan!
### Jenis Tombol dan Perilaku
```html
```
**Apa yang dilakukan setiap jenis tombol:**
- **Tombol kirim**: Memicu pengiriman formulir dan mengirim data ke endpoint yang ditentukan
- **Tombol reset**: Mengembalikan semua bidang formulir ke keadaan awalnya
- **Tombol biasa**: Tidak memberikan perilaku default, membutuhkan JavaScript khusus untuk fungsionalitas
> โ ๏ธ **Catatan Penting**: Elemen `` bersifat self-closing dan tidak memerlukan tag penutup. Praktik terbaik modern adalah menulis `` tanpa garis miring.
### Membangun Formulir Login Anda
Sekarang mari kita buat formulir login praktis yang menunjukkan praktik formulir HTML modern. Kita akan mulai dengan struktur dasar dan secara bertahap meningkatkannya dengan fitur aksesibilitas dan validasi.
```html
Bank App
Login
```
**Penjelasan apa yang terjadi di sini:**
- **Menyusun** formulir dengan elemen HTML5 semantik
- **Mengelompokkan** elemen terkait menggunakan wadah `div` dengan kelas yang bermakna
- **Mengasosiasikan** label dengan input menggunakan atribut `for` dan `id`
- **Menyertakan** atribut modern seperti `autocomplete` dan `placeholder` untuk UX yang lebih baik
- **Menambahkan** `novalidate` untuk menangani validasi dengan JavaScript daripada default browser
### Kekuatan Label yang Tepat
**Mengapa label penting untuk pengembangan web modern:**
```mermaid
graph TD
A[Label Element] --> B[Screen Reader Support]
A --> C[Click Target Expansion]
A --> D[Form Validation]
A --> E[SEO Benefits]
B --> F[Accessible to all users]
C --> G[Better mobile experience]
D --> H[Clear error messaging]
E --> I[Better search ranking]
```
**Apa yang dicapai oleh label yang tepat:**
- **Memungkinkan** pembaca layar mengumumkan bidang formulir dengan jelas
- **Memperluas** area yang dapat diklik (mengklik label memfokuskan input)
- **Meningkatkan** kegunaan seluler dengan target sentuh yang lebih besar
- **Mendukung** validasi formulir dengan pesan kesalahan yang bermakna
- **Meningkatkan** SEO dengan memberikan makna semantik pada elemen formulir
> ๐ฏ **Tujuan Aksesibilitas**: Setiap input formulir harus memiliki label yang terkait. Praktik sederhana ini membuat formulir Anda dapat digunakan oleh semua orang, termasuk pengguna dengan disabilitas, dan meningkatkan pengalaman untuk semua pengguna.
### Membuat Formulir Registrasi
Formulir registrasi membutuhkan informasi yang lebih rinci untuk membuat akun pengguna yang lengkap. Mari kita bangun dengan fitur HTML5 modern dan aksesibilitas yang ditingkatkan.
```html
Register
```
**Dalam kode di atas, kita telah:**
- **Mengorganisasi** setiap bidang dalam wadah div untuk gaya dan tata letak yang lebih baik
- **Menambahkan** atribut `autocomplete` yang sesuai untuk dukungan pengisian otomatis browser
- **Menyertakan** teks placeholder yang bermanfaat untuk memandu input pengguna
- **Mengatur** default yang masuk akal menggunakan atribut `value`
- **Menerapkan** atribut validasi seperti `required`, `maxlength`, dan `min`
- **Menggunakan** `type="number"` untuk bidang saldo dengan dukungan desimal
### Menjelajahi Jenis Input dan Perilaku
**Jenis input modern memberikan fungsionalitas yang ditingkatkan:**
| Fitur | Manfaat | Contoh |
|---------|---------|----------|
| `type="number"` | Keyboard angka di seluler | Entri saldo lebih mudah |
| `step="0.01"` | Kontrol presisi desimal | Memungkinkan sen dalam mata uang |
| `autocomplete` | Pengisian otomatis browser | Penyelesaian formulir lebih cepat |
| `placeholder` | Petunjuk kontekstual | Membimbing ekspektasi pengguna |
> ๐ฏ **Tantangan Aksesibilitas**: Cobalah menavigasi formulir hanya menggunakan keyboard Anda! Gunakan `Tab` untuk berpindah antar bidang, `Space` untuk mencentang kotak, dan `Enter` untuk mengirimkan. Pengalaman ini membantu Anda memahami bagaimana pengguna pembaca layar berinteraksi dengan formulir Anda.
### ๐ **Pemeriksaan Pedagogis**
**Pemahaman Dasar Formulir**: Sebelum menerapkan JavaScript, pastikan Anda memahami:
- โ Bagaimana HTML semantik menciptakan struktur formulir yang dapat diakses
- โ Mengapa jenis input penting untuk keyboard seluler dan validasi
- โ Hubungan antara label dan kontrol formulir
- โ Bagaimana atribut formulir memengaruhi perilaku default browser
**Tes Diri Cepat**: Apa yang terjadi jika Anda mengirimkan formulir tanpa JavaScript?
*Jawaban: Browser melakukan pengiriman default, biasanya mengarahkan ke URL aksi*
**Keuntungan Formulir HTML5**: Formulir modern menyediakan:
- **Validasi Bawaan**: Pemeriksaan format email dan angka otomatis
- **Optimasi Seluler**: Keyboard yang sesuai untuk berbagai jenis input
- **Aksesibilitas**: Dukungan pembaca layar dan navigasi keyboard
- **Peningkatan Progresif**: Berfungsi bahkan saat JavaScript dinonaktifkan
## Memahami Metode Pengiriman Formulir
Ketika seseorang mengisi formulir Anda dan menekan kirim, data tersebut perlu dikirim ke suatu tempat โ biasanya ke server yang dapat menyimpannya. Ada beberapa cara berbeda untuk melakukannya, dan mengetahui mana yang harus digunakan dapat menghemat waktu Anda dari beberapa masalah di kemudian hari.
Mari kita lihat apa yang sebenarnya terjadi ketika seseorang mengklik tombol kirim itu.
### Perilaku Formulir Default
Pertama, mari kita amati apa yang terjadi dengan pengiriman formulir dasar:
**Uji formulir Anda saat ini:**
1. Klik tombol *Register* di formulir Anda
2. Amati perubahan di bilah alamat browser Anda
3. Perhatikan bagaimana halaman memuat ulang dan data muncul di URL

### Perbandingan Metode HTTP
```mermaid
graph TD
A[Form Submission] --> B{HTTP Method}
B -->|GET| C[Data in URL]
B -->|POST| D[Data in Request Body]
C --> E[Visible in address bar]
C --> F[Limited data size]
C --> G[Bookmarkable]
D --> H[Hidden from URL]
D --> I[Large data capacity]
D --> J[More secure]
```
**Memahami perbedaannya:**
| Metode | Kasus Penggunaan | Lokasi Data | Tingkat Keamanan | Batas Ukuran |
|--------|----------|---------------|----------------|-------------|
| `GET` | Query pencarian, filter | Parameter URL | Rendah (terlihat) | ~2000 karakter |
| `POST` | Akun pengguna, data sensitif | Body permintaan | Lebih tinggi (tersembunyi) | Tidak ada batas praktis |
**Memahami perbedaan mendasar:**
- **GET**: Menambahkan data formulir ke URL sebagai parameter query (cocok untuk operasi pencarian)
- **POST**: Menyertakan data dalam body permintaan (penting untuk informasi sensitif)
- **Batasan GET**: Batas ukuran, data terlihat, riwayat browser yang persisten
- **Keuntungan POST**: Kapasitas data besar, perlindungan privasi, dukungan unggahan file
> ๐ก **Praktik Terbaik**: Gunakan `GET` untuk formulir pencarian dan filter (pengambilan data), gunakan `POST` untuk registrasi pengguna, login, dan pembuatan data.
### Mengonfigurasi Pengiriman Formulir
Mari kita konfigurasi formulir registrasi Anda untuk berkomunikasi dengan benar dengan API backend menggunakan metode POST:
```html
```
**Memahami validasi yang ditingkatkan:**
- **Menggabungkan** indikator bidang wajib dengan deskripsi yang membantu
- **Menyertakan** atribut `pattern` untuk validasi format
- **Memberikan** atribut `title` untuk aksesibilitas dan tooltip
- **Menambahkan** teks pembantu untuk membimbing input pengguna
- **Menggunakan** struktur HTML semantik untuk aksesibilitas yang lebih baik
### Aturan Validasi Lanjutan
**Apa yang dicapai oleh setiap aturan validasi:**
| Bidang | Aturan Validasi | Manfaat Pengguna |
|-------|------------------|------------------|
| Nama Pengguna | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Memastikan pengidentifikasi yang valid dan unik |
| Mata Uang | `required`, `maxlength="3"`, `pattern="[A-Z$โฌยฃยฅโน]+"` | Menerima simbol mata uang umum |
| Saldo | `min="0"`, `step="0.01"`, `type="number"` | Mencegah saldo negatif |
| Deskripsi | `maxlength="100"` | Batas panjang yang wajar |
### Menguji Perilaku Validasi
**Coba skenario validasi ini:**
1. **Kirim** formulir dengan bidang wajib kosong
2. **Masukkan** nama pengguna yang lebih pendek dari 3 karakter
3. **Coba** karakter khusus di bidang nama pengguna
4. **Masukkan** jumlah saldo negatif

**Apa yang akan Anda amati:**
- **Browser menampilkan** pesan validasi bawaan
- **Perubahan gaya** berdasarkan status `:valid` dan `:invalid`
- **Pengiriman formulir** dicegah hingga semua validasi lolos
- **Fokus otomatis** berpindah ke bidang pertama yang tidak valid
### Validasi Sisi Klien vs Sisi Server
```mermaid
graph LR
A[Client-Side Validation] --> B[Instant Feedback]
A --> C[Better UX]
A --> D[Reduced Server Load]
E[Server-Side Validation] --> F[Security]
E --> G[Data Integrity]
E --> H[Business Rules]
A -.-> I[Both Required]
E -.-> I
```
**Mengapa Anda membutuhkan kedua lapisan:**
- **Validasi sisi klien**: Memberikan umpan balik langsung dan meningkatkan pengalaman pengguna
- **Validasi sisi server**: Memastikan keamanan dan menangani aturan bisnis yang kompleks
- **Pendekatan gabungan**: Menciptakan aplikasi yang tangguh, ramah pengguna, dan aman
- **Peningkatan progresif**: Berfungsi bahkan saat JavaScript dinonaktifkan
> ๐ก๏ธ **Pengingat Keamanan**: Jangan pernah hanya mengandalkan validasi sisi klien! Pengguna jahat dapat melewati pemeriksaan sisi klien, jadi validasi sisi server sangat penting untuk keamanan dan integritas data.
### โก **Apa yang Bisa Anda Lakukan dalam 5 Menit Berikutnya**
- [ ] Uji formulir Anda dengan data tidak valid untuk melihat pesan validasi
- [ ] Coba kirimkan formulir dengan JavaScript dinonaktifkan untuk melihat validasi HTML5
- [ ] Buka DevTools browser dan inspeksi data formulir yang dikirim ke server
- [ ] Eksperimen dengan berbagai tipe input untuk melihat perubahan keyboard di perangkat seluler
### ๐ฏ **Apa yang Bisa Anda Capai dalam Satu Jam**
- [ ] Selesaikan kuis pasca-pelajaran dan pahami konsep penanganan formulir
- [ ] Implementasikan tantangan validasi komprehensif dengan umpan balik waktu nyata
- [ ] Tambahkan gaya CSS untuk membuat formulir terlihat profesional
- [ ] Buat penanganan kesalahan untuk nama pengguna duplikat dan kesalahan server
- [ ] Tambahkan bidang konfirmasi kata sandi dengan validasi pencocokan
### ๐ **Perjalanan Penguasaan Formulir Anda Selama Seminggu**
- [ ] Selesaikan aplikasi perbankan lengkap dengan fitur formulir lanjutan
- [ ] Implementasikan kemampuan unggah file untuk foto profil atau dokumen
- [ ] Tambahkan formulir multi-langkah dengan indikator kemajuan dan manajemen status
- [ ] Buat formulir dinamis yang beradaptasi berdasarkan pilihan pengguna
- [ ] Implementasikan penyimpanan otomatis formulir dan pemulihan untuk pengalaman pengguna yang lebih baik
- [ ] Tambahkan validasi lanjutan seperti verifikasi email dan format nomor telepon
### ๐ **Penguasaan Pengembangan Frontend Anda Selama Sebulan**
- [ ] Bangun aplikasi formulir kompleks dengan logika kondisional dan alur kerja
- [ ] Pelajari pustaka dan kerangka kerja formulir untuk pengembangan cepat
- [ ] Kuasai pedoman aksesibilitas dan prinsip desain inklusif
- [ ] Implementasikan internasionalisasi dan lokalisasi untuk formulir global
- [ ] Buat pustaka komponen formulir yang dapat digunakan kembali dan sistem desain
- [ ] Berkontribusi pada proyek formulir open source dan bagikan praktik terbaik
## ๐ฏ Garis Waktu Penguasaan Pengembangan Formulir Anda
```mermaid
timeline
title Form Development & User Experience Learning Progression
section HTML Foundation (15 minutes)
Semantic Forms: Form elements
: Input types
: Labels and accessibility
: Progressive enhancement
section JavaScript Integration (25 minutes)
Event Handling: Form submission
: Data collection
: AJAX communication
: Async/await patterns
section Validation Systems (35 minutes)
Multi-layer Security: HTML5 validation
: Client-side logic
: Server-side verification
: Error handling
section User Experience (45 minutes)
Interface Polish: Loading states
: Success messaging
: Error recovery
: Accessibility features
section Advanced Patterns (1 week)
Professional Forms: Dynamic validation
: Multi-step workflows
: File uploads
: Real-time feedback
section Enterprise Skills (1 month)
Production Applications: Form libraries
: Testing strategies
: Performance optimization
: Security best practices
```
### ๐ ๏ธ Ringkasan Toolkit Pengembangan Formulir Anda
Setelah menyelesaikan pelajaran ini, Anda sekarang telah menguasai:
- **Formulir HTML5**: Struktur semantik, tipe input, dan fitur aksesibilitas
- **Penanganan Formulir JavaScript**: Manajemen peristiwa, pengumpulan data, dan komunikasi AJAX
- **Arsitektur Validasi**: Validasi multi-lapisan untuk keamanan dan pengalaman pengguna
- **Pemrograman Asinkron**: Fetch API modern dan pola async/await
- **Manajemen Kesalahan**: Penanganan kesalahan yang komprehensif dan sistem umpan balik pengguna
- **Desain Pengalaman Pengguna**: Status pemuatan, pesan sukses, dan pemulihan kesalahan
- **Peningkatan Progresif**: Formulir yang berfungsi di semua browser dan kemampuan
**Aplikasi Dunia Nyata**: Keterampilan pengembangan formulir Anda langsung berlaku untuk:
- **Aplikasi E-commerce**: Proses checkout, registrasi akun, dan formulir pembayaran
- **Perangkat Lunak Perusahaan**: Sistem entri data, antarmuka pelaporan, dan aplikasi alur kerja
- **Manajemen Konten**: Platform penerbitan, konten yang dibuat pengguna, dan antarmuka administratif
- **Aplikasi Keuangan**: Antarmuka perbankan, platform investasi, dan sistem transaksi
- **Sistem Kesehatan**: Portal pasien, penjadwalan janji temu, dan formulir catatan medis
- **Platform Pendidikan**: Registrasi kursus, alat penilaian, dan manajemen pembelajaran
**Keterampilan Profesional yang Diperoleh**: Anda sekarang dapat:
- **Merancang** formulir yang dapat diakses yang berfungsi untuk semua pengguna termasuk penyandang disabilitas
- **Mengimplementasikan** validasi formulir yang aman yang mencegah korupsi data dan kerentanan keamanan
- **Membuat** antarmuka pengguna yang responsif yang memberikan umpan balik dan panduan yang jelas
- **Mendebug** interaksi formulir yang kompleks menggunakan alat pengembang browser dan analisis jaringan
- **Mengoptimalkan** kinerja formulir melalui penanganan data dan strategi validasi yang efisien
**Konsep Pengembangan Frontend yang Dikuasai**:
- **Arsitektur Berbasis Peristiwa**: Penanganan interaksi pengguna dan sistem respons
- **Pemrograman Asinkron**: Komunikasi server non-blok dan penanganan kesalahan
- **Validasi Data**: Pemeriksaan keamanan dan integritas sisi klien dan server
- **Desain Pengalaman Pengguna**: Antarmuka intuitif yang membimbing pengguna menuju keberhasilan
- **Rekayasa Aksesibilitas**: Desain inklusif yang berfungsi untuk kebutuhan pengguna yang beragam
**Tingkat Berikutnya**: Anda siap untuk menjelajahi pustaka formulir lanjutan, mengimplementasikan aturan validasi yang kompleks, atau membangun sistem pengumpulan data tingkat perusahaan!
๐ **Pencapaian Terkunci**: Anda telah membangun sistem penanganan formulir lengkap dengan validasi profesional, penanganan kesalahan, dan pola pengalaman pengguna!
---
---
## Tantangan Agen GitHub Copilot ๐
Gunakan mode Agen untuk menyelesaikan tantangan berikut:
**Deskripsi:** Tingkatkan formulir registrasi dengan validasi sisi klien yang komprehensif dan umpan balik pengguna. Tantangan ini akan membantu Anda berlatih validasi formulir, penanganan kesalahan, dan meningkatkan pengalaman pengguna dengan umpan balik interaktif.
**Prompt:** Buat sistem validasi formulir lengkap untuk formulir pendaftaran yang mencakup: 1) Umpan balik validasi secara real-time untuk setiap kolom saat pengguna mengetik, 2) Pesan validasi khusus yang muncul di bawah setiap kolom input, 3) Kolom konfirmasi kata sandi dengan validasi kecocokan, 4) Indikator visual (seperti tanda centang hijau untuk kolom yang valid dan peringatan merah untuk kolom yang tidak valid), 5) Tombol kirim yang hanya aktif ketika semua validasi berhasil. Gunakan atribut validasi HTML5, CSS untuk menata status validasi, dan JavaScript untuk perilaku interaktif.
Pelajari lebih lanjut tentang [agent mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) di sini.
## ๐ Tantangan
Tampilkan pesan kesalahan di HTML jika pengguna sudah ada.
Berikut adalah contoh tampilan halaman login setelah ditambahkan beberapa gaya CSS:

## Kuis Pasca-Pelajaran
[Kuis pasca-pelajaran](https://ff-quizzes.netlify.app/web/quiz/44)
## Tinjauan & Belajar Mandiri
Para pengembang telah menjadi sangat kreatif dalam upaya mereka membangun formulir, terutama terkait strategi validasi. Pelajari berbagai alur formulir dengan melihat melalui [CodePen](https://codepen.com); bisakah Anda menemukan beberapa formulir yang menarik dan menginspirasi?
## Tugas
[Tambahkan gaya pada aplikasi bank Anda](assignment.md)
---
**Penafian**:
Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang timbul dari penggunaan terjemahan ini.