opltypes/
states.rs

1//! Data types for the MeetState column.
2
3use serde::de::{self, Deserialize, Visitor};
4use serde::ser::Serialize;
5use strum::ParseError;
6
7use std::fmt;
8
9use crate::Country;
10
11/// The State column.
12#[derive(Copy, Clone, Debug, PartialEq)]
13pub enum State {
14    InArgentina(ArgentinaState),
15    InAustralia(AustraliaState),
16    InBrazil(BrazilState),
17    InCanada(CanadaState),
18    InChina(ChinaState),
19    InEngland(EnglandState),
20    InGermany(GermanyState),
21    InIndia(IndiaState),
22    InMexico(MexicoState),
23    InNetherlands(NetherlandsState),
24    InNewZealand(NewZealandState),
25    InRomania(RomaniaState),
26    InRussia(RussiaState),
27    InSouthAfrica(SouthAfricaState),
28    InUSA(USAState),
29}
30
31impl State {
32    /// Constructs a State for a specific Country.
33    ///
34    /// This is how the checker interprets the State column.
35    ///
36    /// # Examples
37    ///
38    /// ```
39    /// # use opltypes::Country;
40    /// # use opltypes::states::{State, USAState};
41    /// let state = State::from_str_and_country("NY", Country::USA).unwrap();
42    /// assert_eq!(state, State::InUSA(USAState::NY));
43    /// ```
44    pub fn from_str_and_country(s: &str, country: Country) -> Result<State, ParseError> {
45        match country {
46            Country::Argentina => Ok(State::InArgentina(s.parse::<ArgentinaState>()?)),
47            Country::Australia => Ok(State::InAustralia(s.parse::<AustraliaState>()?)),
48            Country::Brazil => Ok(State::InBrazil(s.parse::<BrazilState>()?)),
49            Country::Canada => Ok(State::InCanada(s.parse::<CanadaState>()?)),
50            Country::China => Ok(State::InChina(s.parse::<ChinaState>()?)),
51            Country::England => Ok(State::InEngland(s.parse::<EnglandState>()?)),
52            Country::Germany => Ok(State::InGermany(s.parse::<GermanyState>()?)),
53            Country::India => Ok(State::InIndia(s.parse::<IndiaState>()?)),
54            Country::Mexico => Ok(State::InMexico(s.parse::<MexicoState>()?)),
55            Country::Netherlands => Ok(State::InNetherlands(s.parse::<NetherlandsState>()?)),
56            Country::NewZealand => Ok(State::InNewZealand(s.parse::<NewZealandState>()?)),
57            Country::Romania => Ok(State::InRomania(s.parse::<RomaniaState>()?)),
58            Country::Russia => Ok(State::InRussia(s.parse::<RussiaState>()?)),
59            Country::SouthAfrica => Ok(State::InSouthAfrica(s.parse::<SouthAfricaState>()?)),
60            Country::USA => Ok(State::InUSA(s.parse::<USAState>()?)),
61            _ => Err(ParseError::VariantNotFound),
62        }
63    }
64
65    /// Constructs a State given a full, unambiguous code like "USA-NY".
66    ///
67    /// This is how the server interprets the State column.
68    /// Codes of this format are the result of serializing a State value.
69    ///
70    /// # Examples
71    ///
72    /// ```
73    /// # use opltypes::Country;
74    /// # use opltypes::states::{State, USAState};
75    /// let state = State::from_full_code("USA-NY").unwrap();
76    /// assert_eq!(state, State::InUSA(USAState::NY));
77    /// ```
78    pub fn from_full_code(s: &str) -> Result<State, ParseError> {
79        // The codes are of the form "{Country}-{State}".
80        let parts: Vec<&str> = s.split('-').collect();
81        if parts.len() != 2 {
82            return Err(ParseError::VariantNotFound);
83        }
84
85        let country: Country = parts[0].parse::<Country>()?;
86        Self::from_str_and_country(parts[1], country)
87    }
88
89    /// Returns the Country for the given State.
90    ///
91    /// # Examples
92    ///
93    /// ```
94    /// # use opltypes::Country;
95    /// # use opltypes::states::{State, USAState};
96    /// let state = State::from_full_code("USA-NY").unwrap();
97    /// assert_eq!(state.to_country(), Country::USA);
98    /// ```
99    pub fn to_country(self) -> Country {
100        match self {
101            State::InArgentina(_) => Country::Argentina,
102            State::InAustralia(_) => Country::Australia,
103            State::InBrazil(_) => Country::Brazil,
104            State::InCanada(_) => Country::Canada,
105            State::InChina(_) => Country::China,
106            State::InEngland(_) => Country::England,
107            State::InGermany(_) => Country::Germany,
108            State::InIndia(_) => Country::India,
109            State::InMexico(_) => Country::Mexico,
110            State::InNetherlands(_) => Country::Netherlands,
111            State::InNewZealand(_) => Country::NewZealand,
112            State::InRomania(_) => Country::Romania,
113            State::InRussia(_) => Country::Russia,
114            State::InSouthAfrica(_) => Country::SouthAfrica,
115            State::InUSA(_) => Country::USA,
116        }
117    }
118
119    /// Returns a String describing just the given State (no Country).
120    ///
121    /// # Examples
122    ///
123    /// ```
124    /// # use opltypes::Country;
125    /// # use opltypes::states::{State, USAState};
126    /// let state = State::from_full_code("USA-NY").unwrap();
127    /// assert_eq!(state.to_state_string(), "NY");
128    /// ```
129    pub fn to_state_string(self) -> String {
130        match self {
131            State::InArgentina(s) => s.to_string(),
132            State::InAustralia(s) => s.to_string(),
133            State::InBrazil(s) => s.to_string(),
134            State::InCanada(s) => s.to_string(),
135            State::InChina(s) => s.to_string(),
136            State::InEngland(s) => s.to_string(),
137            State::InGermany(s) => s.to_string(),
138            State::InIndia(s) => s.to_string(),
139            State::InMexico(s) => s.to_string(),
140            State::InNetherlands(s) => s.to_string(),
141            State::InNewZealand(s) => s.to_string(),
142            State::InRomania(s) => s.to_string(),
143            State::InRussia(s) => s.to_string(),
144            State::InSouthAfrica(s) => s.to_string(),
145            State::InUSA(s) => s.to_string(),
146        }
147    }
148}
149
150impl Serialize for State {
151    /// Serialization for the server. The checker uses from_str_and_country().
152    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
153        let country = self.to_country().to_string();
154        let state = self.to_state_string();
155        format!("{}-{}", country, state).serialize(serializer)
156    }
157}
158
159/// Helper struct for State deserialization.
160///
161/// This is only used by the server, not by the checker.
162/// The checker uses from_str_and_country().
163struct StateVisitor;
164
165impl<'de> Visitor<'de> for StateVisitor {
166    type Value = State;
167
168    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
169        formatter.write_str("A Country-State code like USA-NY")
170    }
171
172    fn visit_str<E: de::Error>(self, value: &str) -> Result<State, E> {
173        State::from_full_code(value).map_err(E::custom)
174    }
175}
176
177impl<'de> Deserialize<'de> for State {
178    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<State, D::Error> {
179        deserializer.deserialize_str(StateVisitor)
180    }
181}
182
183/// A state in Argentina.
184#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
185pub enum ArgentinaState {
186    /// Ciudad Autónoma de Buenos Aires.
187    CA,
188    /// Buenos Aires.
189    BA,
190    /// Catamarca.
191    CT,
192    /// Chaco.
193    CC,
194    /// Chubut.
195    CH,
196    /// Córdoba.
197    CB,
198    /// Corrientes.
199    CN,
200    /// Entre Ríos.
201    ER,
202    /// Formosa.
203    FM,
204    /// Jujuy.
205    JY,
206    /// La Pampa.
207    LP,
208    /// La Rioja.
209    LR,
210    /// Mendoza.
211    MZ,
212    /// Misiones.
213    MN,
214    /// Neuquén.
215    NQ,
216    /// Río Negro.
217    RN,
218    /// Salta.
219    SA,
220    /// San Juan.
221    SJ,
222    /// San Luis.
223    SL,
224    /// Santa Cruz.
225    SC,
226    /// Santa Fe.
227    SF,
228    /// Santiago del Estero.
229    SE,
230    /// Tierra del Fuego.
231    TF,
232    /// Tucumán.
233    TM,
234}
235
236/// A state in Australia.
237#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
238pub enum AustraliaState {
239    /// Australian Capital Territory.
240    ACT,
241    /// Jervis Bay Territory.
242    JBT,
243    /// New South Wales.
244    NSW,
245    /// Northern Territory.
246    NT,
247    /// Queensland.
248    QLD,
249    /// South Australia.
250    SA,
251    /// Tasmania.
252    TAS,
253    /// Victoria.
254    VIC,
255    /// Western Australia.
256    WA,
257}
258
259/// A state in Brazil.
260#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
261pub enum BrazilState {
262    /// Acre.
263    AC,
264    /// Alagoas.
265    AL,
266    /// Amapá.
267    AP,
268    /// Amazonas.
269    AM,
270    /// Bahia.
271    BA,
272    /// Ceará.
273    CE,
274    /// Distrito Federal.
275    DF,
276    /// Espírito Santo.
277    ES,
278    /// Goiás.
279    GO,
280    /// Maranhão.
281    MA,
282    /// Mato Grosso.
283    MT,
284    /// Mato Grosso do Sul.
285    MS,
286    /// Minas Gerais.
287    MG,
288    /// Pará.
289    PA,
290    /// Paraíba.
291    PB,
292    /// Paraná.
293    PR,
294    /// Pernambuco.
295    PE,
296    /// Piauí.
297    PI,
298    /// Rio de Janeiro.
299    RJ,
300    /// Rio Grande do Norte.
301    RN,
302    /// Rio Grande do Sul.
303    RS,
304    /// Rondônia.
305    RO,
306    /// Roraima.
307    RR,
308    /// Santa Catarina.
309    SC,
310    /// São Paulo.
311    SP,
312    /// Sergipe.
313    SE,
314    /// Tocantins.
315    TO,
316}
317
318/// A state in Canada.
319#[rustfmt::skip]
320#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
321pub enum CanadaState {
322    AB, BC, MB, NB, NL, NT, NS, NU, ON, PE, QC, SK, YT
323}
324
325/// A province in China.
326#[rustfmt::skip]
327#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
328pub enum ChinaState {
329    /// Anhui Province (安徽省, Ānhuī Shěng).
330    AH,
331    /// Beijing Municipality (北京市, Běijīng Shì).
332    BJ,
333    /// Chongqing Municipality (重庆市, Chóngqìng Shì).
334    CQ,
335    /// Fujian Province (福建省, Fújiàn Shěng).
336    FJ,
337    /// Guangdong Province (广东省, Guǎngdōng Shěng).
338    GD,
339    /// Gansu Province (甘肃省, Gānsù Shěng).
340    GS,
341    /// Guangxi Zhuang Autonomous Region (广西壮族自治区, Guǎngxī Zhuàngzú Zìzhìqū).
342    GX,
343    /// Guizhou Province (贵州省, Guìzhōu Shěng).
344    GZ,
345    /// Henan Province (河南省, Hénán Shěng).
346    HEN,
347    /// Hubei Province (湖北省, Húběi Shěng).
348    HUB,
349    /// Hebei Province (河北省, Héběi Shěng).
350    HEB,
351    /// Hainan Province (海南省, Hǎinán Shěng).
352    HI,
353    /// Hong Kong Special Administrative Region (香港特别行政区, Xiānggǎng Tèbié Xíngzhèngqū).
354    ///
355    /// We usually treat Hong Kong as a separate country. This is here for completeness.
356    HK,
357    /// Heilongjiang Province (黑龙江省, Hēilóngjiāng Shěng).
358    HL,
359    /// Hunan Province (湖南省, Húnán Shěng).
360    HUN,
361    /// Jilin Province (吉林省, Jílín Shěng).
362    JL,
363    /// Jiangsu Province (江苏省, Jiāngsū Shěng).
364    JS,
365    /// Jiangxi Province (江西省, Jiāngxī Shěng).
366    JX,
367    /// Liaoning Province (辽宁省, Liáoníng Shěng).
368    LN,
369    /// Macau Special Administrative Region (澳门特别行政区, Àomén Tèbié Xíngzhèngqū).
370    MO,
371    /// Inner Mongolia Autonomous Region (內蒙古自治区, Nèi Měnggǔ Zìzhìqū).
372    NM,
373    /// Ningxia Hui Autonomous Region (宁夏回族自治区, Níngxià Huízú Zìzhìqū).
374    NX,
375    /// Qinghai Province (青海省, Qīnghǎi Shěng).
376    QH,
377    /// Sichuan Province (四川省, Sìchuān Shěng).
378    SC,
379    /// Shandong Province (山东省, Shāndōng Shěng).
380    SD,
381    /// Shanghai Municipality (上海市, Shànghǎi Shì).
382    SH,
383    /// Shaanxi Province (陕西省, Shǎnxī Shěng).
384    SAA,
385    /// Shanxi Province (山西省, Shānxī Shěng).
386    SAX,
387    /// Tianjin Municipality (天津市, Tiānjīn Shì).
388    TJ,
389    /// Xinjiang Uyghur Autonomous Region (新疆维吾尔自治区, Xīnjiāng Wéiwú'ěr Zìzhìqū).
390    XJ,
391    /// Tibet Autonomous Region (西藏自治区, Xīzàng Zìzhìqū).
392    XZ,
393    /// Yunnan Province (云南省, Yúnnán Shěng).
394    YN,
395    /// Zhejiang Province (浙江省, Zhèjiāng Shěng).
396    ZJ,
397}
398
399/// A region in England, ill-defined and used only by BP.
400///
401/// This omits other divisions not in England: Scotland, N.Ireland, and Wales.
402#[rustfmt::skip]
403#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
404pub enum EnglandState {
405    /// East Midlands.
406    EM,
407    /// Greater London.
408    GL,
409    /// North Midlands.
410    NM,
411    /// North West.
412    NW,
413    /// South East.
414    SE,
415    /// South Midlands.
416    SM,
417    /// South West.
418    SW,
419    /// West Midlands.
420    WM,
421    /// Yorkshire North East.
422    YNE,
423}
424
425/// A state in Germany.
426#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
427pub enum GermanyState {
428    /// Baden-Württemberg.
429    BW,
430    /// Bavaria.
431    BY,
432    /// Berlin.
433    BE,
434    /// Brandenburg.
435    BB,
436    /// Bremen.
437    HB,
438    /// Hesse.
439    HE,
440    /// Hamburg.
441    HH,
442    /// Mecklenburg-Vorpommern.
443    MV,
444    /// Lower Saxony.
445    NI,
446    /// North Rhine-Westphalia.
447    NRW,
448    /// Rhineland-Palatinate.
449    RP,
450    /// Schleswig-Holstein.
451    SH,
452    /// Saarland.
453    SL,
454    /// Saxony.
455    SN,
456    /// Saxony-Anhalt.
457    ST,
458    /// Thuringia.
459    TH,
460}
461
462/// A state in India.
463#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
464pub enum IndiaState {
465    /// Andaman and Nicobar Islands.
466    AN,
467    /// Andhra Pradesh.
468    AP,
469    /// Arunachal Pradesh.
470    AR,
471    /// Assam.
472    AS,
473    /// Bihar.
474    BR,
475    /// Chhattisgarh.
476    CG,
477    /// Chandigarh.
478    CH,
479    /// Daman and Diu.
480    DD,
481    /// Dadra and Nagar Haveli.
482    DH,
483    /// Delhi.
484    DL,
485    /// Goa.
486    GA,
487    /// Gujarat.
488    GJ,
489    /// Haryana.
490    HR,
491    /// Himachal Pradesh.
492    HP,
493    /// Jammu and Kashmir.
494    JK,
495    /// Jharkhand.
496    JH,
497    /// Karnataka.
498    KA,
499    /// Kerala.
500    KL,
501    /// Lakshadweep.
502    LD,
503    /// Madhya Pradesh.
504    MP,
505    /// Maharashtra.
506    MH,
507    /// Manipur.
508    MN,
509    /// Meghalaya.
510    ML,
511    /// Mizoram.
512    MZ,
513    /// Nagaland.
514    NL,
515    /// Orissa.
516    OR,
517    /// Punjab.
518    PB,
519    /// Pondicherry / Puducherry.
520    PY,
521    /// Rajasthan.
522    RJ,
523    /// Sikkim.
524    SK,
525    /// Tamil Nadu.
526    TN,
527    /// Tripura.
528    TR,
529    /// Uttarakhand.
530    UK,
531    /// Uttar Pradesh.
532    UP,
533    /// West Bengal.
534    WB,
535}
536
537/// A state in Mexico.
538#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
539pub enum MexicoState {
540    /// Aguascalientes.
541    AG,
542    /// Baja California.
543    BC,
544    /// Baja California Sur.
545    BS,
546    /// Campeche.
547    CM,
548    /// Chiapas.
549    CS,
550    /// Chihuahua.
551    CH,
552    /// Coahuila.
553    CO,
554    /// Colima.
555    CL,
556    /// Mexico City.
557    DF,
558    /// Durango.
559    DG,
560    /// Guanajuato.
561    GT,
562    /// Guerrero.
563    GR,
564    /// Hidalgo.
565    HG,
566    /// Jalisco.
567    JA,
568    /// México.
569    EM,
570    /// Michoacán.
571    MI,
572    /// Morelos.
573    MO,
574    /// Nayarit.
575    NA,
576    /// Nuevo León.
577    NL,
578    /// Oaxaca.
579    OA,
580    /// Puebla.
581    PU,
582    /// Querétaro.
583    QT,
584    /// Quintana Roo.
585    QR,
586    /// San Luis Potosí.
587    SL,
588    /// Sinaloa.
589    SI,
590    /// Sonora.
591    SO,
592    /// Tabasco.
593    TB,
594    /// Tamaulipas.
595    TM,
596    /// Tlaxcala.
597    TL,
598    /// Veracruz.
599    VE,
600    /// Yucatán.
601    YU,
602    /// Zacatecas.
603    ZA,
604}
605
606/// A state in the Netherlands.
607#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
608pub enum NetherlandsState {
609    /// Drenthe.
610    DR,
611    /// Flevoland.
612    FL,
613    /// Friesland / Fryslân.
614    FR,
615    /// Gelderland.
616    GE,
617    /// Groningen.
618    GR,
619    /// Limburg.
620    LI,
621    /// North Brabant / Noord-Brabant.
622    NB,
623    /// North Holland / Noord-Holland.
624    NH,
625    /// Overijssel / Overissel.
626    OV,
627    /// Utrecht.
628    UT,
629    /// Zeeland.
630    ZE,
631    /// South Holland / Zuid-Holland.
632    ZH,
633}
634
635/// A region in New Zealand.
636#[rustfmt::skip]
637#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
638pub enum NewZealandState {
639    /// Northland.
640    NTL,
641    /// Auckland.
642    AKL,
643    /// Waikato.
644    WKO,
645    /// Bay of Plenty.
646    BOP,
647    /// Gisborne (East Coast).
648    GIS,
649    /// Hawke's Bay.
650    HKB,
651    /// Taranaki.
652    TKI,
653    /// Manawatu-Whanganui.
654    MWT,
655    /// Wellington.
656    WGN,
657    /// Tasman.
658    TAS,
659    /// Nelson.
660    NSN,
661    /// Marlborough.
662    MBH,
663    /// West Coast.
664    WTC,
665    /// Canterbury.
666    CAN,
667    /// Otago.
668    OTA,
669    /// Southland.
670    STL,
671}
672
673/// A county in Romania.
674#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
675pub enum RomaniaState {
676    /// Alba.
677    AB,
678    /// Argeș.
679    AG,
680    /// Arad.
681    AR,
682    /// Bucharest.
683    B,
684    /// Bacău.
685    BC,
686    /// Bihor.
687    BH,
688    /// Bistrița-Năsăud.
689    BN,
690    /// Brăila.
691    BR,
692    /// Botoșani.
693    BT,
694    /// Brașov.
695    BV,
696    /// Buzău.
697    BZ,
698    /// Cluj.
699    CJ,
700    /// Călărași.
701    CL,
702    /// Caraș-Severin.
703    CS,
704    /// Constanța.
705    CT,
706    /// Covasna.
707    CV,
708    /// Dâmbovița.
709    DB,
710    /// Dolj.
711    DJ,
712    /// Gorj.
713    GJ,
714    /// Galați.
715    GL,
716    /// Giurgiu.
717    GR,
718    /// Hunedoara.
719    HD,
720    /// Harghita.
721    HR,
722    /// Ilfov.
723    IF,
724    /// Ialomița.
725    IL,
726    /// Iași.
727    IS,
728    /// Mehedinți.
729    MH,
730    /// Maramureș.
731    MM,
732    /// Mureș.
733    MS,
734    /// Neamț.
735    NT,
736    /// Olt.
737    OT,
738    /// Prahova.
739    PH,
740    /// Sibiu.
741    SB,
742    /// Sălaj.
743    SJ,
744    /// Satu Mare.
745    SM,
746    /// Suceava.
747    SV,
748    /// Tulcea.
749    TL,
750    /// Timiș.
751    TM,
752    /// Teleorman.
753    TR,
754    /// Vâlcea.
755    VL,
756    /// Vrancea.
757    VN,
758    /// Vaslui.
759    VS,
760}
761
762/// An oblast in Russia.
763#[rustfmt::skip]
764#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
765pub enum RussiaState {
766    AD, AL, BA, BU, CE, CU, DA, IN, KB, KL, KC, KR, KK, KO, ME, MO, SA,
767    SE, TA, TY, UD, ALT, KAM, KHA, KDA, KYA, PER, PRI, STA, ZAB, AMU, ARK,
768    AST, BEL, BRY, CHE, IRK, IVA, KGD, KLU, KEM, KIR, KOS, KGN, KRS, LEN,
769    LIP, MAG, MOS, MUR, NIZ, NGR, NVS, OMS, ORE, ORL, PNZ, PSK, ROS, RYA, 
770    SAK, SAM, SAR, SMO, SVE, TAM, TOM, TUL, TVE, TYE, TYU, ULY, VLA, VGG,
771    VLG, VOR, YAR, MOW, SPE, YEV, CHU, KHM, NEN, YAN
772}
773
774/// A province in South Africa, using conventional acronyms (non-ISO).
775#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
776pub enum SouthAfricaState {
777    /// Eastern Cape.
778    EC,
779    /// Free State.
780    FS,
781    /// Gauteng.
782    GT,
783    /// KwaZulu-Natal (ISO: NL).
784    KZN,
785    /// Limpopo.
786    LP,
787    /// Mpumalanga.
788    MP,
789    /// Northern Cape.
790    NC,
791    /// North-West.
792    NW,
793    /// Western Cape.
794    WC,
795}
796
797/// A state in the USA.
798#[rustfmt::skip]
799#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
800pub enum USAState {
801    AL, AK, AZ, AR, CA, CO, CT, DE, DC, FL, GA, HI, ID, IL, IN, IA, KS,
802    KY, LA, ME, MD, MA, MI, MN, MS, MO, MT, NE, NV, NH, NJ, NM, NY, NC,
803    ND, OH, OK, OR, PA, RI, SC, SD, TN, TX, UT, VT, VA, WA, WV, WI, WY,
804
805    /// Guam is an unincorporated territory of the USA.
806    Guam,
807}