zod-ir 1.6.0 → 1.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Reza Kheradmandi
3
+ Copyright (c) 2026 Reza Kheradmandi
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,15 +1,16 @@
1
1
  <div align="center">
2
- <img src="zod-ir-logo.png" width="250" alt="zod-ir logo" style="border-radius: 20px !important" />
3
- <p>
4
- <strong>The Ultimate Zod Utility for Iranian Data Structures</strong>
5
- </p>
2
+ <img src="./assets/images/zod-ir-logo.png" width="250" alt="zod-ir logo" />
3
+
4
+ <h1>The Ultimate Zod Utility for Iranian Data Structures</h1>
6
5
  <p>
7
- Validation for National Code, Bank Cards, Sheba, Bills, License Plates, Crypto, and more.
6
+ Validation for national code, bank cards, Sheba, bills, license plates, crypto, etc.
8
7
  <br />
9
- Lightweight. Zero Dependencies. Type-Safe.
8
+ Lightweight Zero Dependencies Type-safe.
10
9
  </p>
11
-
12
- <p>
10
+
11
+ 📖 [Read the Full Documentation on daxra.ir](https://daxra.ir/docs/zod-ir)
12
+
13
+ <div>
13
14
  <a href="https://www.npmjs.com/package/zod-ir">
14
15
  <img src="https://img.shields.io/npm/v/zod-ir?style=flat-square&color=3b82f6" alt="npm version" />
15
16
  </a>
@@ -28,30 +29,30 @@
28
29
  <a href="https://zod.dev/?id=ecosystem">
29
30
  <img src="https://img.shields.io/badge/featured%20in-zod%20docs-3068b7?style=flat-square&logo=zod&logoColor=white" alt="Zod Ecosystem" />
30
31
  </a>
31
- </p>
32
+ </div>
32
33
  </div>
33
34
 
34
- <hr />
35
+ <br />
35
36
 
36
37
  ## Why zod-ir? 🚀
37
38
 
38
- Building forms in Iran requires specific validations (National Code algorithm, Bank Card Luhn, etc.). `zod-ir` brings these natively into **Zod**, but goes beyond simple validation. It focuses on **Data Extraction** and **Developer Experience**.
39
+ Building forms for Iranian applications often involves validating specific local data structures like national codes, bank cards, and Sheba numbers. `zod-ir` seamlessly integrates these validations into **Zod**, while also offering powerful **Data Extraction** tools and a superior **Developer Experience**.
39
40
 
40
41
  ### Key Features ✨
41
42
 
42
- - 🧠 **Smart Extraction:** Don't just validate; extract metadata! (e.g., Get Bank Name from Card, City from Landline/Postal Code).
43
- - 🛠 **Standalone & Reusable:** Use validators inside Zod schemas OR as standalone utility functions in your utils/backend.
44
- - ⚡ **Zero Dependencies:** No heavy dependencies. Lightweight and Tree-shakeable.
45
- - 🔗 **Peer Dependency Architecture:** Fully compatible with your existing Zod version (v3+).
46
- - 🧪 **Battle-Tested:** 100% Test Coverage for critical algorithms (National Code, IBAN, etc.).
43
+ - 🧠 **Smart Extraction:** go beyound validation and extract metadata. (get bank name from card number and city from landline/postal code).
44
+ - 🛠 **Standalone & Reusable:** Use validators either inside Zod schemas or as standalone utility functions.
45
+ - ⚡ **Zero Dependencies:** No heavy dependencies lightweight and tree-shakeable.
46
+ - 🔗 **Compatibility:** Fully compatible with your existing Zod version (v3 and v4).
47
+ - 🧪 **Battle-Tested:** 100% test coverage for critical algorithms (national code, IBAN, etc.).
47
48
 
48
- ### Feature Highlights
49
+ ### Feature Highlights 🌟
49
50
 
50
- - **Smart Financial:** Auto-detects **Card Number** vs **Sheba (IBAN)** and returns Bank Info & Logo.
51
- - **Jalali Date:** Validates Persian dates with precise **Leap Year (Kabise)** calculation.
52
- - **Crypto Support:** Native validation for **TRC20**, **ERC20**, and **Bitcoin** (No extra libs).
53
- - **Vehicle:** Validates License Plates and detects **Province/City**.
54
- - **Contact:** Mobile (MCI, Irancell...), **Landline (New ✨)**, Postal Code (with **Smart City Detection**).
51
+ - **Smart Financial:** auto-detects **card number** vs. **Sheba (IBAN)** and returns the corresponding bank info and logo.
52
+ - **Jalali Date:** validates Persian dates with precise **Leap Year (Kabisa)** calculation.
53
+ - **Crypto Support:** native validation for **TRC20**, **ERC20**, and **Bitcoin**.
54
+ - **Vehicle:** validates license plates and detects **province/city**.
55
+ - **Contact:** smartly detect the phone number operator (MCI, Irancell), **landline**, and postal code (smart city detection).
55
56
 
56
57
  ---
57
58
 
@@ -65,156 +66,145 @@ pnpm add zod zod-ir
65
66
  yarn add zod zod-ir
66
67
  ```
67
68
 
68
- ## Usage: Standalone Mode (Utilities) 🛠️
69
+ ## Usage: Standalone Mode (Utilities) ⚒️
69
70
 
70
- You don't need to use Zod! zod-ir exports all validation logic as pure functions. Perfect for backend utilities or non-form logic.
71
+ You don't need to use Zod! zod-ir exports all validation logic as pure functions—perfect for backend utilities or non-form logic.
71
72
 
72
73
  ```typescript
73
- import { isMelliCode, getBankInfo, getLandlineInfo } from "zod-ir";
74
+ import { isMelliCode, getBankInfo, getLandlineInfo } from 'zod-ir';
74
75
 
75
- // 1. Validate National Code anywhere
76
- if (isMelliCode("0023456789")) {
77
- console.log("Valid user!");
76
+ // Validate national code anywhere
77
+ if (isMelliCode('0023456789')) {
78
+ console.log('Valid user.');
78
79
  }
79
80
 
80
- // 2. Get Bank Details directly
81
- const bank = getBankInfo("6219861012345678");
81
+ // Extract details from bank card number
82
+ const bank = getBankInfo('6219861012345678');
82
83
  console.log(bank.name); // "Saman"
83
84
  console.log(bank.color); // "#46a0e6"
84
85
 
85
- // 3. Extract Location from Phone
86
- const location = getLandlineInfo("02122334455");
86
+ // Extract location from landline phone number
87
+ const location = getLandlineInfo('02122334455');
87
88
  console.log(location.province_fa); // "تهران"
88
89
  ```
89
90
 
90
91
  ## Usage: Zod Schema Mode 💡
91
92
 
92
- 1. Smart Contact & Address (New 🌟)
93
-
94
- Validate Landlines and Postal Codes, and automatically extract Province/City in both Persian and English.
93
+ 1. Smart Contact and Address <br />
94
+ Validate landlines and postal codes, and automatically extract province/city in both Persian and English.
95
95
 
96
96
  ```typescript
97
- import { z } from "zod";
98
- import {
99
- zLandline,
100
- zPostalCode,
101
- getLandlineInfo,
102
- getPostalCodeInfo,
103
- } from "zod-ir";
104
-
105
- // 1. Validation Schema
106
- const schema = z.object({
107
- phone: zLandline({ message: "Invalid landline number" }),
97
+ import * as z from 'zod';
98
+ import { zLandline, zPostalCode, getLandlineInfo, getPostalCodeInfo } from 'zod-ir';
99
+
100
+ const ValidationSchema = z.object({
101
+ phone: zLandline({ message: 'Invalid landline number.' }),
108
102
  zip: zPostalCode(),
109
103
  });
110
104
 
111
- // 2. Extract Metadata from Landline
112
- const phoneInfo = getLandlineInfo("02122334455");
113
- /* Output:
114
- {
115
- province: "Tehran",
116
- city: "Tehran",
117
- province_fa: "تهران",
118
- city_fa: "تهران"
119
- }
105
+ const phoneInfo = getLandlineInfo('02122334455');
106
+ console.log(phoneInfo);
107
+ /*
108
+ {
109
+ province: "Tehran",
110
+ city: "Tehran",
111
+ province_fa: "تهران",
112
+ city_fa: "تهران"
113
+ }
120
114
  */
121
115
 
122
- // 3. Extract Metadata from Postal Code (Smart Range Matching)
123
- const zipInfo = getPostalCodeInfo("8391853612");
124
- /* Output:
125
- {
126
- province: { name: "اصفهان", slug: "Isfahan" },
127
- city: { name_fa: "نائین", name_en: "Naein" }
128
- }
116
+ // Extract metadata from postal code (smart range matching)
117
+ const zipInfo = getPostalCodeInfo('8391853612');
118
+ /*
119
+ {
120
+ province: { name: "اصفهان", slug: "Isfahan" },
121
+ city: { name_fa: "نائین", name_en: "Naein" }
122
+ }
129
123
  */
130
124
  ```
131
125
 
132
- 2. Smart Financial Validation (New 🌟)
133
-
134
- Don't ask users for "Card" or "Sheba" separately. Use zFinancial to accept both!
126
+ 2. Smart Financial Validation <br />
127
+ Don't ask users for either card number or Sheba—use `zFinancial` to accept both!
135
128
 
136
129
  ```typescript
137
- import { z } from "zod";
138
- import { zFinancial, getFinancialInfo } from "zod-ir";
130
+ import * as z from 'zod';
131
+ import { zFinancial, getFinancialInfo } from 'zod-ir';
139
132
 
140
- // 1. Validation Schema
141
- const schema = z.object({
142
- destination: zFinancial({ message: "Invalid Card or Sheba" }),
133
+ const ValidationSchema = z.object({
134
+ destination: zFinancial({ message: 'Invalid card number or Sheba.' }),
143
135
  });
144
136
 
145
- // 2. Extract Metadata (Bank Name, Logo, Type)
146
- const info = getFinancialInfo("6037991155667788");
137
+ // Extract metadata (bank name, Logo, type)
138
+ const info = getFinancialInfo('6037991155667788');
147
139
  // OR
148
- const infoSheba = getFinancialInfo("IR120170000000123456789012");
140
+ const infoSheba = getFinancialInfo('IR120170000000123456789012');
149
141
 
150
142
  console.log(info);
151
- /* Output:
152
- {
153
- type: "card", // or "sheba"
154
- isValid: true,
155
- bank: {
156
- name: "Melli",
157
- label: "ملی",
158
- color: "#EF3F3E",
159
- logo: "https://.../melli.svg",
160
- formatted: "6037-9911-..."
143
+ /*
144
+ {
145
+ type: "card", // or "sheba"
146
+ isValid: true,
147
+ bank: {
148
+ name: "Melli",
149
+ label: "ملی",
150
+ color: "#EF3F3E",
151
+ logo: "https://.../melli.svg",
152
+ formatted: "6037-9911-..."
153
+ }
161
154
  }
162
- }
163
155
  */
164
156
  ```
165
157
 
166
- 3. Crypto Wallet Validation
167
-
168
- Perfect for Fintech and Exchange apps. Supports TRC20 (USDT), ERC20, and BTC.
158
+ 3. Crypto Wallet Validation <br />
159
+ Perfect for Fintech and exchange apps. Supports TRC20 (USDT), ERC20, and BTC.
169
160
 
170
161
  ```typescript
171
- import { zCrypto, getCryptoInfo } from "zod-ir";
162
+ import { zCrypto, getCryptoInfo } from 'zod-ir';
172
163
 
173
- const schema = z.object({
164
+ const ValidationSchema = z.object({
174
165
  // Accept any valid wallet (TRX, ETH, BTC)
175
166
  anyWallet: zCrypto(),
176
167
 
177
- // Strict: Accept ONLY Tether (TRC20)
168
+ // Strict: only accept Tether (TRC20)
178
169
  usdtWallet: zCrypto({
179
- ticker: "TRX",
180
- message: "Only TRC20 addresses allowed",
170
+ ticker: 'TRX',
171
+ message: 'Only TRC20 addresses are allowed.',
181
172
  }),
182
173
  });
183
174
 
184
- const details = getCryptoInfo("TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t");
185
- /* Output:
186
- {
187
- ticker: "TRX",
188
- network: "TRC20",
189
- isValid: true
190
- }
175
+ const details = getCryptoInfo('TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t');
176
+ console.log(details);
177
+ /*
178
+ {
179
+ ticker: "TRX",
180
+ network: "TRC20",
181
+ isValid: true
182
+ }
191
183
  */
192
184
  ```
193
185
 
194
- 4. Jalali Date Validation
195
-
196
- Validates Persian dates mathematically (checking days in month & leap years).
186
+ 4. Jalali Date Validation <br />
187
+ Validates Persian dates mathematically, checking days in each month and leap years.
197
188
 
198
189
  ```typescript
199
- import { zJalaliDate } from "zod-ir";
190
+ import { zJalaliDate } from 'zod-ir';
200
191
 
201
- const schema = z.object({
202
- birthDate: zJalaliDate({ message: "Invalid date" }),
192
+ const ValidationSchema = z.object({
193
+ birthDate: zJalaliDate({ message: 'Invalid date.' }),
203
194
  });
204
195
 
205
- // ✅ Valid (Leap year)
206
- schema.parse({ birthDate: "1403/12/30" });
196
+ // ✅ Valid (Leap Year)
197
+ ValidationSchema.parse({ birthDate: '1403/12/30' });
207
198
 
208
- // ❌ Invalid (1402 is not a leap year)
209
- schema.parse({ birthDate: "1402/12/30" });
199
+ // ❌ Invalid (1402 is not a Leap Year)
200
+ ValidationSchema.parse({ birthDate: '1402/12/30' });
210
201
  ```
211
202
 
212
- 5. Comprehensive Form Example
213
-
203
+ 5. Comprehensive Form Example <br />
214
204
  A full registration form handling Auto-fix (Persian digits), Mobile, and National Code.
215
205
 
216
206
  ```typescript
217
- import { z } from "zod";
207
+ import * as z from 'zod';
218
208
  import {
219
209
  zMelliCode,
220
210
  zIranianMobile,
@@ -222,8 +212,8 @@ import {
222
212
  zBillId,
223
213
  zPaymentId,
224
214
  zPlateNumber,
225
- preprocessNumber, // Converts ۱۲۳ -> 123
226
- } from "zod-ir";
215
+ preprocessNumber, // Converts "۱۲۳" to 123
216
+ } from 'zod-ir';
227
217
 
228
218
  const UserSchema = z.object({
229
219
  // Auto-convert Persian digits before validation
@@ -231,7 +221,7 @@ const UserSchema = z.object({
231
221
 
232
222
  mobile: zIranianMobile({ strictZero: true }),
233
223
  card: zCardNumber(),
234
- plate: zPlateNumber(), // e.g. 12م345-11
224
+ plate: zPlateNumber(), // e.g., "12م345-11"
235
225
 
236
226
  // Utility Bill
237
227
  billId: zBillId(),
@@ -239,93 +229,90 @@ const UserSchema = z.object({
239
229
  });
240
230
  ```
241
231
 
242
- 6. Smart Currency 💰 [New]
243
-
244
- Automatically validates, parses, and formats currency input. It handles Persian text, numbers, and formatted strings (mixed).
232
+ 6. Smart Currency <br />
233
+ Automatically validates, parses, and formats currency input. It handles Persian text, numbers, and formatted strings (mixed).
245
234
 
246
235
  ```typescript
247
- import { zToman, transformToCurrency, numberToText } from "zod-ir";
236
+ import { zToman, transformToCurrency, numberToText } from 'zod-ir';
248
237
 
249
- const schema = z.object({
250
- // Accepts inputs like: "2.5 میلیون", "2,500,000", "دو میلیون و پانصد"
238
+ const ValidationSchema = z.object({
239
+ // Accepts inputs such as "2.5 میلیون" ,"2,500,000" ,"دو میلیون و پانصد"
251
240
  price: zToman({
252
241
  min: 1000,
253
242
  max: 50_000_000,
254
- message: "Amount must be between 1,000 and 50 Million Toman",
243
+ message: 'Amount must be between 1,000 and 50 Million Tomans.',
255
244
  }),
256
245
  });
257
246
 
258
247
  // --- Utility Functions for UI ---
259
248
 
260
- // Convert Text/Mixed to Number (for DB storage)
261
- console.log(transformToCurrency("2 میلیون و پانصد")); // 2500000
262
- console.log(transformToCurrency("سی صد")); // 300 (Auto-fixes typos)
249
+ // Convert text/mixed to number (useful for database storage)
250
+ console.log(transformToCurrency('2 میلیون و پانصد')); // 2500000
251
+ console.log(transformToCurrency('سی صد')); // 300 (Auto-fixes typos)
263
252
 
264
- // Convert Number to Persian Text (for UI display)
253
+ // Convert number to Persian text (useful for UI display)
265
254
  console.log(numberToText(2500000)); // "دو میلیون و پانصد هزار"
266
255
  ```
267
256
 
268
257
  ## Metadata Helpers 🛠️
269
258
 
270
- zod-ir isn't just for validation. It provides rich metadata for your UI.
259
+ zod-ir isn't just for validation—it also provides rich metadata for your UI.
271
260
  | Function | Return Type | Description |
272
- | :--------------------------- | :------------------------------------------- | ------------------------------------------------------------------------------ |
273
- | `getFinancialInfo(val)` | `{ type, bank, isValid }` | Smart! Detects Card or Sheba, returns Bank Logo/Color. |
274
- | `getBankInfo(card)` | `{ name, label, logo... }` | Details for Card Numbers. |
275
- | `getCryptoInfo(addr)` | `{ ticker, network }` | Detects TRC20, ERC20, BTC networks. |
276
- | `getMobileOperator(num)` | `{ name, label, logo }` | Returns Operator (MCI, Irancell...) & Logo. |
277
- | `getBillInfo(id, payId)` | `{ type, amount... }` | Bill Type (Water/Gas), Amount calculation, Validity. |
278
- | `getPlateInfo(plate)` | `{ province, city }` | Province and City of the license plate. |
279
- | `getJalaliDateInfo(date)` | `{ year, month, isLeap }` | Deconstructs Jalali date & checks leap year. |
280
- | `getLandlineInfo(num)` | `{ province, city... }` | Returns Province/City (FA & EN) for landlines. |
281
- | `getPostalCodeInfo(code)` | `{ province, city }` | Returns Province/City based on postal code. |
261
+ | :------------------------ | :--------------------------- | ------------------------------------------------------ |
262
+ | `getFinancialInfo(val)` | `{ type, bank, isValid }` | Smart! Detects card or Sheba, returns bank logo/color. |
263
+ | `getBankInfo(card)` | `{ name, label, logo, ... }` | Details for card numbers. |
264
+ | `getCryptoInfo(addr)` | `{ ticker, network }` | Detects TRC20, ERC20, and BTC networks. |
265
+ | `getMobileOperator(num)` | `{ name, label, logo }` | Returns the operator (MCI, Irancell) and the Logo. |
266
+ | `getBillInfo(id, payId)` | `{ type, amount, ... }` | Bill type (water, gas), amount calculation, validity. |
267
+ | `getPlateInfo(plate)` | `{ province, city }` | Province and city of the license plate. |
268
+ | `getJalaliDateInfo(date)` | `{ year, month, isLeap }` | Deconstructs Jalali date and checks for Leap Years. |
269
+ | `getLandlineInfo(num)` | `{ province, city, ... }` | Returns province/city (FA & EN) for landlines. |
270
+ | `getPostalCodeInfo(code)` | `{ province, city }` | Returns province/city based on the postal code. |
282
271
 
283
272
  ## API Reference 📚
284
273
 
285
274
  Identity & Contact
286
275
  | Validator | Description |
287
- | :----------------- | :----------------------------------------------------------------- |
288
- | `zMelliCode` | National Code (Code Melli) |
289
- | `zShenaseMelli` | Legal Person ID (Company) |
290
- | `zPassport` | Iranian Passport |
291
- | `zIranianMobile` | Mobile (09xx, +989xx) |
292
- | `zPostalCode` | 10-digit Postal Code |
293
- | `zLandline` | Landline Phone (021xx...) |
276
+ | :--------------- | :------------------------------- |
277
+ | `zMelliCode` | National code (Melli code) |
278
+ | `zShenaseMelli` | Legal person ID (company) |
279
+ | `zPassport` | Iranian passport |
280
+ | `zIranianMobile` | Mobile number (09xx, +989xx) |
281
+ | `zPostalCode` | 10-digit postal code |
282
+ | `zLandline` | Landline phone number (021xx...) |
294
283
 
295
284
  Financial & Assets
296
285
  | Validator | Description |
297
- | :----------------- | :----------------------------------------------------------------- |
298
- | `zFinancial` | Smart Input (Card OR Sheba) |
299
- | `zCardNumber` | Bank Card Number (16 digits) |
286
+ | :------------- | :----------------------------------------- |
287
+ | `zFinancial` | Smart input (card number or Sheba) |
288
+ | `zCardNumber` | Bank card number (16 digits) |
300
289
  | `zSheba` | IBAN (Sheba) |
301
- | `zCrypto` | Crypto Wallet (TRX, ETH, BTC) |
302
- | `zBillId` | Utility Bill ID |
303
- | `zPaymentId` | Utility Payment ID |
304
- | `zPlateNumber` | Vehicle License Plate |
305
- | `zJalaliDate` | Persian Date (YYYY/MM/DD) |
306
- | `zToman` | Automatically validates currency input |
290
+ | `zCrypto` | Crypto wallet (TRX, ETH, BTC) |
291
+ | `zBillId` | Utility bill ID |
292
+ | `zPaymentId` | Utility payment ID |
293
+ | `zPlateNumber` | Vehicle license plate |
294
+ | `zJalaliDate` | Persian date (YYYY/MM/DD) |
295
+ | `zToman` | Automatically validates the currency input |
307
296
 
308
- ## Contributing
297
+ ## Versining Policy 🏷️
309
298
 
310
- Contributions are welcome! This project uses PNPM.
299
+ This project adheres to [The Semantic Versioning Standard](https://semver.org).
311
300
 
312
- ```bash
313
- git clone [https://github.com/Reza-kh80/zod-ir.git](https://github.com/Reza-kh80/zod-ir.git)
314
- pnpm install
315
- pnpm test
316
- ```
301
+ ## Contributing 🤝🏻
302
+
303
+ Any form of contribution is always appreciated! Please refer to the [CONTRIBUTING.md](CONTRIBUTING.md) file.
317
304
 
318
- ## Credits 🙏
305
+ ## Credits 🙏🏻
319
306
 
320
- - Bank and Operator logos are courtesy of [Zegond's Logos Project](https://github.com/zegond).
307
+ Bank and operator logos are courtesy of [Zegond's Logos Project](https://github.com/zegond).
321
308
 
322
- ## Support
309
+ ## Funding 🌱
323
310
 
324
- `zod-ir` is an open-source project and free to use. If it saved you some time and you'd like to say thanks, you can support its development via crypto. It's completely optional but highly appreciated!
311
+ `zod-ir` is an open-source project and free to use. If it saved you some time and you'd like to say thanks, you can support its development via crypto currency transactions. It's completely optional and highly appreciated!
325
312
 
326
313
  - **USDT (TRC20) / TRX:** `TWtnFa4xpvH9BvciSzw4hqXUDCibWhcYxX`
327
314
  - **Bitcoin:** `bc1qf2ry7mpnvncwapgu0al3wkxm4jxecac3s3pmf0`
328
315
 
329
- ## License
316
+ ## License 📃
330
317
 
331
- MIT
318
+ [MIT](LICENSE) License © 2026-PRESENT — [Reza Kheradmandi](https://github.com/Reza-kh80)