date.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. /**
  2. * DevExtreme (localization/globalize/date.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. require("./core");
  11. require("./number");
  12. require("globalize/date");
  13. var timeData = {
  14. supplemental: {
  15. version: {
  16. _cldrVersion: "28",
  17. _unicodeVersion: "8.0.0",
  18. _number: "$Revision: 11969 $"
  19. },
  20. timeData: {
  21. "001": {
  22. _allowed: "H h",
  23. _preferred: "H"
  24. },
  25. DE: {
  26. _allowed: "H",
  27. _preferred: "H"
  28. },
  29. JP: {
  30. _allowed: "H K h",
  31. _preferred: "H"
  32. },
  33. RU: {
  34. _allowed: "H",
  35. _preferred: "H"
  36. },
  37. US: {
  38. _allowed: "H h",
  39. _preferred: "h"
  40. }
  41. }
  42. }
  43. };
  44. var enCaGregorian = {
  45. main: {
  46. en: {
  47. identity: {
  48. version: {
  49. _cldrVersion: "28",
  50. _number: "$Revision: 11972 $"
  51. },
  52. language: "en"
  53. },
  54. dates: {
  55. calendars: {
  56. gregorian: {
  57. months: {
  58. format: {
  59. abbreviated: {
  60. 1: "Jan",
  61. 2: "Feb",
  62. 3: "Mar",
  63. 4: "Apr",
  64. 5: "May",
  65. 6: "Jun",
  66. 7: "Jul",
  67. 8: "Aug",
  68. 9: "Sep",
  69. 10: "Oct",
  70. 11: "Nov",
  71. 12: "Dec"
  72. },
  73. narrow: {
  74. 1: "J",
  75. 2: "F",
  76. 3: "M",
  77. 4: "A",
  78. 5: "M",
  79. 6: "J",
  80. 7: "J",
  81. 8: "A",
  82. 9: "S",
  83. 10: "O",
  84. 11: "N",
  85. 12: "D"
  86. },
  87. wide: {
  88. 1: "January",
  89. 2: "February",
  90. 3: "March",
  91. 4: "April",
  92. 5: "May",
  93. 6: "June",
  94. 7: "July",
  95. 8: "August",
  96. 9: "September",
  97. 10: "October",
  98. 11: "November",
  99. 12: "December"
  100. }
  101. },
  102. "stand-alone": {
  103. abbreviated: {
  104. 1: "Jan",
  105. 2: "Feb",
  106. 3: "Mar",
  107. 4: "Apr",
  108. 5: "May",
  109. 6: "Jun",
  110. 7: "Jul",
  111. 8: "Aug",
  112. 9: "Sep",
  113. 10: "Oct",
  114. 11: "Nov",
  115. 12: "Dec"
  116. },
  117. narrow: {
  118. 1: "J",
  119. 2: "F",
  120. 3: "M",
  121. 4: "A",
  122. 5: "M",
  123. 6: "J",
  124. 7: "J",
  125. 8: "A",
  126. 9: "S",
  127. 10: "O",
  128. 11: "N",
  129. 12: "D"
  130. },
  131. wide: {
  132. 1: "January",
  133. 2: "February",
  134. 3: "March",
  135. 4: "April",
  136. 5: "May",
  137. 6: "June",
  138. 7: "July",
  139. 8: "August",
  140. 9: "September",
  141. 10: "October",
  142. 11: "November",
  143. 12: "December"
  144. }
  145. }
  146. },
  147. days: {
  148. format: {
  149. abbreviated: {
  150. sun: "Sun",
  151. mon: "Mon",
  152. tue: "Tue",
  153. wed: "Wed",
  154. thu: "Thu",
  155. fri: "Fri",
  156. sat: "Sat"
  157. },
  158. narrow: {
  159. sun: "S",
  160. mon: "M",
  161. tue: "T",
  162. wed: "W",
  163. thu: "T",
  164. fri: "F",
  165. sat: "S"
  166. },
  167. "short": {
  168. sun: "Su",
  169. mon: "Mo",
  170. tue: "Tu",
  171. wed: "We",
  172. thu: "Th",
  173. fri: "Fr",
  174. sat: "Sa"
  175. },
  176. wide: {
  177. sun: "Sunday",
  178. mon: "Monday",
  179. tue: "Tuesday",
  180. wed: "Wednesday",
  181. thu: "Thursday",
  182. fri: "Friday",
  183. sat: "Saturday"
  184. }
  185. },
  186. "stand-alone": {
  187. abbreviated: {
  188. sun: "Sun",
  189. mon: "Mon",
  190. tue: "Tue",
  191. wed: "Wed",
  192. thu: "Thu",
  193. fri: "Fri",
  194. sat: "Sat"
  195. },
  196. narrow: {
  197. sun: "S",
  198. mon: "M",
  199. tue: "T",
  200. wed: "W",
  201. thu: "T",
  202. fri: "F",
  203. sat: "S"
  204. },
  205. "short": {
  206. sun: "Su",
  207. mon: "Mo",
  208. tue: "Tu",
  209. wed: "We",
  210. thu: "Th",
  211. fri: "Fr",
  212. sat: "Sa"
  213. },
  214. wide: {
  215. sun: "Sunday",
  216. mon: "Monday",
  217. tue: "Tuesday",
  218. wed: "Wednesday",
  219. thu: "Thursday",
  220. fri: "Friday",
  221. sat: "Saturday"
  222. }
  223. }
  224. },
  225. quarters: {
  226. format: {
  227. abbreviated: {
  228. 1: "Q1",
  229. 2: "Q2",
  230. 3: "Q3",
  231. 4: "Q4"
  232. },
  233. narrow: {
  234. 1: "1",
  235. 2: "2",
  236. 3: "3",
  237. 4: "4"
  238. },
  239. wide: {
  240. 1: "1st quarter",
  241. 2: "2nd quarter",
  242. 3: "3rd quarter",
  243. 4: "4th quarter"
  244. }
  245. },
  246. "stand-alone": {
  247. abbreviated: {
  248. 1: "Q1",
  249. 2: "Q2",
  250. 3: "Q3",
  251. 4: "Q4"
  252. },
  253. narrow: {
  254. 1: "1",
  255. 2: "2",
  256. 3: "3",
  257. 4: "4"
  258. },
  259. wide: {
  260. 1: "1st quarter",
  261. 2: "2nd quarter",
  262. 3: "3rd quarter",
  263. 4: "4th quarter"
  264. }
  265. }
  266. },
  267. dayPeriods: {
  268. format: {
  269. abbreviated: {
  270. midnight: "midnight",
  271. am: "AM",
  272. "am-alt-variant": "am",
  273. noon: "noon",
  274. pm: "PM",
  275. "pm-alt-variant": "pm",
  276. morning1: "in the morning",
  277. afternoon1: "in the afternoon",
  278. evening1: "in the evening",
  279. night1: "at night"
  280. },
  281. narrow: {
  282. midnight: "mi",
  283. am: "a",
  284. "am-alt-variant": "am",
  285. noon: "n",
  286. pm: "p",
  287. "pm-alt-variant": "pm",
  288. morning1: "in the morning",
  289. afternoon1: "in the afternoon",
  290. evening1: "in the evening",
  291. night1: "at night"
  292. },
  293. wide: {
  294. midnight: "midnight",
  295. am: "AM",
  296. "am-alt-variant": "am",
  297. noon: "noon",
  298. pm: "PM",
  299. "pm-alt-variant": "pm",
  300. morning1: "in the morning",
  301. afternoon1: "in the afternoon",
  302. evening1: "in the evening",
  303. night1: "at night"
  304. }
  305. },
  306. "stand-alone": {
  307. abbreviated: {
  308. midnight: "midnight",
  309. am: "AM",
  310. "am-alt-variant": "am",
  311. noon: "noon",
  312. pm: "PM",
  313. "pm-alt-variant": "pm",
  314. morning1: "in the morning",
  315. afternoon1: "in the afternoon",
  316. evening1: "in the evening",
  317. night1: "at night"
  318. },
  319. narrow: {
  320. midnight: "midnight",
  321. am: "AM",
  322. "am-alt-variant": "am",
  323. noon: "noon",
  324. pm: "PM",
  325. "pm-alt-variant": "pm",
  326. morning1: "in the morning",
  327. afternoon1: "in the afternoon",
  328. evening1: "in the evening",
  329. night1: "at night"
  330. },
  331. wide: {
  332. midnight: "midnight",
  333. am: "AM",
  334. "am-alt-variant": "am",
  335. noon: "noon",
  336. pm: "PM",
  337. "pm-alt-variant": "pm",
  338. morning1: "morning",
  339. afternoon1: "afternoon",
  340. evening1: "evening",
  341. night1: "night"
  342. }
  343. }
  344. },
  345. eras: {
  346. eraNames: {
  347. 0: "Before Christ",
  348. "0-alt-variant": "Before Common Era",
  349. 1: "Anno Domini",
  350. "1-alt-variant": "Common Era"
  351. },
  352. eraAbbr: {
  353. 0: "BC",
  354. "0-alt-variant": "BCE",
  355. 1: "AD",
  356. "1-alt-variant": "CE"
  357. },
  358. eraNarrow: {
  359. 0: "B",
  360. "0-alt-variant": "BCE",
  361. 1: "A",
  362. "1-alt-variant": "CE"
  363. }
  364. },
  365. dateFormats: {
  366. full: "EEEE, MMMM d, y",
  367. "long": "MMMM d, y",
  368. medium: "MMM d, y",
  369. "short": "M/d/yy"
  370. },
  371. timeFormats: {
  372. full: "h:mm:ss a zzzz",
  373. "long": "h:mm:ss a z",
  374. medium: "h:mm:ss a",
  375. "short": "h:mm a"
  376. },
  377. dateTimeFormats: {
  378. full: "{1} 'at' {0}",
  379. "long": "{1} 'at' {0}",
  380. medium: "{1}, {0}",
  381. "short": "{1}, {0}",
  382. availableFormats: {
  383. d: "d",
  384. E: "ccc",
  385. Ed: "d E",
  386. Ehm: "E h:mm a",
  387. EHm: "E HH:mm",
  388. Ehms: "E h:mm:ss a",
  389. EHms: "E HH:mm:ss",
  390. Gy: "y G",
  391. GyMMM: "MMM y G",
  392. GyMMMd: "MMM d, y G",
  393. GyMMMEd: "E, MMM d, y G",
  394. h: "h a",
  395. H: "HH",
  396. hm: "h:mm a",
  397. Hm: "HH:mm",
  398. hms: "h:mm:ss a",
  399. Hms: "HH:mm:ss",
  400. hmsv: "h:mm:ss a v",
  401. Hmsv: "HH:mm:ss v",
  402. hmv: "h:mm a v",
  403. Hmv: "HH:mm v",
  404. M: "L",
  405. Md: "M/d",
  406. MEd: "E, M/d",
  407. MMM: "LLL",
  408. MMMd: "MMM d",
  409. MMMEd: "E, MMM d",
  410. MMMMd: "MMMM d",
  411. ms: "mm:ss",
  412. y: "y",
  413. yM: "M/y",
  414. yMd: "M/d/y",
  415. yMEd: "E, M/d/y",
  416. yMMM: "MMM y",
  417. yMMMd: "MMM d, y",
  418. yMMMEd: "E, MMM d, y",
  419. yMMMM: "MMMM y",
  420. yQQQ: "QQQ y",
  421. yQQQQ: "QQQQ y"
  422. },
  423. appendItems: {
  424. Day: "{0} ({2}: {1})",
  425. "Day-Of-Week": "{0} {1}",
  426. Era: "{0} {1}",
  427. Hour: "{0} ({2}: {1})",
  428. Minute: "{0} ({2}: {1})",
  429. Month: "{0} ({2}: {1})",
  430. Quarter: "{0} ({2}: {1})",
  431. Second: "{0} ({2}: {1})",
  432. Timezone: "{0} {1}",
  433. Week: "{0} ({2}: {1})",
  434. Year: "{0} {1}"
  435. },
  436. intervalFormats: {
  437. intervalFormatFallback: "{0} \u2013 {1}",
  438. d: {
  439. d: "d \u2013 d"
  440. },
  441. h: {
  442. a: "h a \u2013 h a",
  443. h: "h \u2013 h a"
  444. },
  445. H: {
  446. H: "HH \u2013 HH"
  447. },
  448. hm: {
  449. a: "h:mm a \u2013 h:mm a",
  450. h: "h:mm \u2013 h:mm a",
  451. m: "h:mm \u2013 h:mm a"
  452. },
  453. Hm: {
  454. H: "HH:mm \u2013 HH:mm",
  455. m: "HH:mm \u2013 HH:mm"
  456. },
  457. hmv: {
  458. a: "h:mm a \u2013 h:mm a v",
  459. h: "h:mm \u2013 h:mm a v",
  460. m: "h:mm \u2013 h:mm a v"
  461. },
  462. Hmv: {
  463. H: "HH:mm \u2013 HH:mm v",
  464. m: "HH:mm \u2013 HH:mm v"
  465. },
  466. hv: {
  467. a: "h a \u2013 h a v",
  468. h: "h \u2013 h a v"
  469. },
  470. Hv: {
  471. H: "HH \u2013 HH v"
  472. },
  473. M: {
  474. M: "M \u2013 M"
  475. },
  476. Md: {
  477. d: "M/d \u2013 M/d",
  478. M: "M/d \u2013 M/d"
  479. },
  480. MEd: {
  481. d: "E, M/d \u2013 E, M/d",
  482. M: "E, M/d \u2013 E, M/d"
  483. },
  484. MMM: {
  485. M: "MMM \u2013 MMM"
  486. },
  487. MMMd: {
  488. d: "MMM d \u2013 d",
  489. M: "MMM d \u2013 MMM d"
  490. },
  491. MMMEd: {
  492. d: "E, MMM d \u2013 E, MMM d",
  493. M: "E, MMM d \u2013 E, MMM d"
  494. },
  495. y: {
  496. y: "y \u2013 y"
  497. },
  498. yM: {
  499. M: "M/y \u2013 M/y",
  500. y: "M/y \u2013 M/y"
  501. },
  502. yMd: {
  503. d: "M/d/y \u2013 M/d/y",
  504. M: "M/d/y \u2013 M/d/y",
  505. y: "M/d/y \u2013 M/d/y"
  506. },
  507. yMEd: {
  508. d: "E, M/d/y \u2013 E, M/d/y",
  509. M: "E, M/d/y \u2013 E, M/d/y",
  510. y: "E, M/d/y \u2013 E, M/d/y"
  511. },
  512. yMMM: {
  513. M: "MMM \u2013 MMM y",
  514. y: "MMM y \u2013 MMM y"
  515. },
  516. yMMMd: {
  517. d: "MMM d \u2013 d, y",
  518. M: "MMM d \u2013 MMM d, y",
  519. y: "MMM d, y \u2013 MMM d, y"
  520. },
  521. yMMMEd: {
  522. d: "E, MMM d \u2013 E, MMM d, y",
  523. M: "E, MMM d \u2013 E, MMM d, y",
  524. y: "E, MMM d, y \u2013 E, MMM d, y"
  525. },
  526. yMMMM: {
  527. M: "MMMM \u2013 MMMM y",
  528. y: "MMMM y \u2013 MMMM y"
  529. }
  530. }
  531. }
  532. }
  533. }
  534. }
  535. }
  536. }
  537. };
  538. var weekData = {
  539. supplemental: {
  540. version: {
  541. _cldrVersion: "28",
  542. _unicodeVersion: "8.0.0",
  543. _number: "$Revision: 11969 $"
  544. },
  545. weekData: {
  546. minDays: {
  547. "001": "1",
  548. US: "1",
  549. DE: "4"
  550. },
  551. firstDay: {
  552. "001": "mon",
  553. DE: "mon",
  554. RU: "mon",
  555. JP: "sun",
  556. US: "sun"
  557. },
  558. weekendStart: {
  559. "001": "sat"
  560. },
  561. weekendEnd: {
  562. "001": "sun"
  563. }
  564. }
  565. }
  566. };
  567. var ACCEPTABLE_JSON_FORMAT_PROPERTIES = ["skeleton", "date", "time", "datetime", "raw"];
  568. var Globalize = require("globalize");
  569. var dateLocalization = require("../date");
  570. var isObject = require("../../core/utils/type").isObject;
  571. var inArray = require("../../core/utils/array").inArray;
  572. var iteratorUtils = require("../../core/utils/iterator");
  573. if (Globalize && Globalize.formatDate) {
  574. if ("en" === Globalize.locale().locale) {
  575. Globalize.load(weekData, timeData, enCaGregorian);
  576. Globalize.locale("en")
  577. }
  578. var formattersCache = {};
  579. var FORMATS_TO_GLOBALIZE_MAP = {
  580. shortdate: {
  581. path: "dateTimeFormats/availableFormats/yMd"
  582. },
  583. shorttime: {
  584. path: "timeFormats/short"
  585. },
  586. longdate: {
  587. path: "dateFormats/full"
  588. },
  589. longtime: {
  590. path: "timeFormats/medium"
  591. },
  592. monthandday: {
  593. path: "dateTimeFormats/availableFormats/MMMMd"
  594. },
  595. monthandyear: {
  596. path: "dateTimeFormats/availableFormats/yMMMM"
  597. },
  598. quarterandyear: {
  599. path: "dateTimeFormats/availableFormats/yQQQ"
  600. },
  601. day: {
  602. path: "dateTimeFormats/availableFormats/d"
  603. },
  604. year: {
  605. path: "dateTimeFormats/availableFormats/y"
  606. },
  607. shortdateshorttime: {
  608. path: "dateTimeFormats/short",
  609. parts: ["shorttime", "shortdate"]
  610. },
  611. mediumdatemediumtime: {
  612. path: "dateTimeFormats/medium",
  613. parts: ["shorttime", "monthandday"]
  614. },
  615. longdatelongtime: {
  616. path: "dateTimeFormats/medium",
  617. parts: ["longtime", "longdate"]
  618. },
  619. month: {
  620. pattern: "LLLL"
  621. },
  622. shortyear: {
  623. pattern: "yy"
  624. },
  625. dayofweek: {
  626. pattern: "EEEE"
  627. },
  628. quarter: {
  629. pattern: "QQQ"
  630. },
  631. millisecond: {
  632. pattern: "SSS"
  633. },
  634. hour: {
  635. pattern: "HH"
  636. },
  637. minute: {
  638. pattern: "mm"
  639. },
  640. second: {
  641. pattern: "ss"
  642. }
  643. };
  644. var globalizeDateLocalization = {
  645. _getPatternByFormat: function(format) {
  646. var that = this;
  647. var lowerFormat = format.toLowerCase();
  648. var globalizeFormat = FORMATS_TO_GLOBALIZE_MAP[lowerFormat];
  649. if ("datetime-local" === lowerFormat) {
  650. return "yyyy-MM-ddTHH':'mm':'ss"
  651. }
  652. if (!globalizeFormat) {
  653. return
  654. }
  655. var result = globalizeFormat.path && that._getFormatStringByPath(globalizeFormat.path) || globalizeFormat.pattern;
  656. if (globalizeFormat.parts) {
  657. iteratorUtils.each(globalizeFormat.parts, function(index, part) {
  658. result = result.replace("{" + index + "}", that._getPatternByFormat(part))
  659. })
  660. }
  661. return result
  662. },
  663. _getFormatStringByPath: function(path) {
  664. return Globalize.locale().main("dates/calendars/gregorian/" + path)
  665. },
  666. getPeriodNames: function() {
  667. var json = Globalize.locale().main("dates/calendars/gregorian/dayPeriods/stand-alone/wide");
  668. return [json.am, json.pm]
  669. },
  670. getMonthNames: function(format, type) {
  671. var months = Globalize.locale().main("dates/calendars/gregorian/months/" + ("format" === type ? type : "stand-alone") + "/" + (format || "wide"));
  672. return iteratorUtils.map(months, function(month) {
  673. return month
  674. })
  675. },
  676. getDayNames: function(format) {
  677. var days = Globalize.locale().main("dates/calendars/gregorian/days/stand-alone/" + (format || "wide"));
  678. return iteratorUtils.map(days, function(day) {
  679. return day
  680. })
  681. },
  682. getTimeSeparator: function() {
  683. return Globalize.locale().main("numbers/symbols-numberSystem-latn/timeSeparator")
  684. },
  685. format: function(date, _format) {
  686. if (!date) {
  687. return
  688. }
  689. if (!_format) {
  690. return date
  691. }
  692. var formatter;
  693. var formatCacheKey;
  694. if ("function" === typeof _format) {
  695. return _format(date)
  696. }
  697. if (_format.formatter) {
  698. return _format.formatter(date)
  699. }
  700. _format = _format.type || _format;
  701. if ("string" === typeof _format) {
  702. formatCacheKey = Globalize.locale().locale + ":" + _format;
  703. formatter = formattersCache[formatCacheKey];
  704. if (!formatter) {
  705. _format = {
  706. raw: this._getPatternByFormat(_format) || _format
  707. };
  708. formatter = formattersCache[formatCacheKey] = Globalize.dateFormatter(_format)
  709. }
  710. } else {
  711. if (!this._isAcceptableFormat(_format)) {
  712. return
  713. }
  714. formatter = Globalize.dateFormatter(_format)
  715. }
  716. return formatter(date)
  717. },
  718. parse: function(text, format) {
  719. if (!text) {
  720. return
  721. }
  722. if (!format || "function" === typeof format || isObject(format) && !this._isAcceptableFormat(format)) {
  723. if (format) {
  724. var parsedValue = this.callBase(text, format);
  725. if (parsedValue) {
  726. return parsedValue
  727. }
  728. }
  729. return Globalize.parseDate(text)
  730. }
  731. if (format.parser) {
  732. return format.parser(text)
  733. }
  734. if ("string" === typeof format) {
  735. format = {
  736. raw: this._getPatternByFormat(format) || format
  737. }
  738. }
  739. return Globalize.parseDate(text, format)
  740. },
  741. _isAcceptableFormat: function(format) {
  742. if (format.parser) {
  743. return true
  744. }
  745. for (var i = 0; i < ACCEPTABLE_JSON_FORMAT_PROPERTIES.length; i++) {
  746. if (Object.prototype.hasOwnProperty.call(format, ACCEPTABLE_JSON_FORMAT_PROPERTIES[i])) {
  747. return true
  748. }
  749. }
  750. },
  751. firstDayOfWeekIndex: function() {
  752. var firstDay = Globalize.locale().supplemental.weekData.firstDay();
  753. return inArray(firstDay, this._getDayKeys())
  754. },
  755. _getDayKeys: function() {
  756. var days = Globalize.locale().main("dates/calendars/gregorian/days/format/short");
  757. return iteratorUtils.map(days, function(day, key) {
  758. return key
  759. })
  760. }
  761. };
  762. dateLocalization.inject(globalizeDateLocalization)
  763. }