新增型号vf107的门禁程序代码,当前已支持人脸与指纹的组合认证
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | [2026/4/11 13:35:44] --- Start runUsb --- |
| | | [2026/4/11 13:35:44] Platform: win32 |
| | | [2026/4/11 13:35:44] Kill command defined: wmic process where "name='node.exe' and commandline like '%device_manager.js%'" delete || powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-CimInstance Win32_Process | Where-Object { $_.Name -eq 'node.exe' -and $_.CommandLine -like '*device_manager.js*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }" |
| | | [2026/4/11 13:35:44] Node.js check passed |
| | | [2026/4/11 13:35:45] Process exited with code: 0, signal: null |
| | | [2026/4/11 13:35:45] Kill stdout: ɾ��ʵ�� \\ACER-LGQ\ROOT\CIMV2:Win32_Process.Handle="31720"
|
| | | ʵ��ɾ���ɹ��� |
| | | [2026/4/11 13:35:45] Manager script path: c:\Users\lgq10\.vscode\extensions\dxide.dxide-1.0.41\src\device\device_manager.js |
| | | [2026/4/11 13:35:45] Spawning child process... |
| | | [2026/4/11 13:35:45] Sending connect command: {"cmd":"connect","lang":"zh","model":"VF105_V12"} |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "app.dxproj": "0029df84b57cdffbbc22d546e0e41eed", |
| | | "dxmodules\\crypto-es\\aes.js": "f5051ae3e240e86f1462fa124c91e34d", |
| | | "dxmodules\\crypto-es\\blowfish.js": "a6a17efb551cdd4dea32a0248c7301eb", |
| | | "dxmodules\\crypto-es\\cipher-core.js": "e7c981251689145cfd8e1cd8fc706530", |
| | | "dxmodules\\crypto-es\\core.js": "aff6ed577b1afec6b04d68e7dce1d71a", |
| | | "dxmodules\\crypto-es\\enc-base64.js": "017d46c5dad13cade58c2cac1d6f5edf", |
| | | "dxmodules\\crypto-es\\enc-base64url.js": "02a7c1b1bfa56f15696ad4cade9efcac", |
| | | "dxmodules\\crypto-es\\enc-utf16.js": "6175f56d0133cb3c253fc33d37943496", |
| | | "dxmodules\\crypto-es\\evpkdf.js": "b3dd824edce293775623ec11d698934c", |
| | | "dxmodules\\crypto-es\\format-hex.js": "192580e6589e2f9e5e6d2421ef970228", |
| | | "dxmodules\\crypto-es\\hmac.js": "b3e954bba3c4d3758c556eabb9f07a4f", |
| | | "dxmodules\\crypto-es\\index.js": "1ab9991ea80626fc1f48b8d20d91146a", |
| | | "dxmodules\\crypto-es\\md5.js": "22b9bf748f4874efced6f24843d9717d", |
| | | "dxmodules\\crypto-es\\mode-cfb.js": "dc945b79189a16a04fb8809cb1ac63ae", |
| | | "dxmodules\\crypto-es\\mode-ctr-gladman.js": "985134d79f545e9090b832dd8790bdcb", |
| | | "dxmodules\\crypto-es\\mode-ctr.js": "8aaf3891ab740c008923c8f6a1a404cc", |
| | | "dxmodules\\crypto-es\\mode-ecb.js": "0c6483c6b907719823c2a20168555654", |
| | | "dxmodules\\crypto-es\\mode-ofb.js": "60db86b4aa9f698949093c6c234b9584", |
| | | "dxmodules\\crypto-es\\pad-ansix923.js": "eafdac5e3d4c90c273f1c34ee39f5f95", |
| | | "dxmodules\\crypto-es\\pad-iso10126.js": "80893798281a09346db1ffebd9550da0", |
| | | "dxmodules\\crypto-es\\pad-iso97971.js": "50bb9404565dcdd2e7007b8a226d2d05", |
| | | "dxmodules\\crypto-es\\pad-nopadding.js": "8a873480d9df86d8a04d382ddbe31b3a", |
| | | "dxmodules\\crypto-es\\pad-zeropadding.js": "2a2ad73f1e17617337c3e498c3b1b145", |
| | | "dxmodules\\crypto-es\\pbkdf2.js": "effcee485c8753470be8737e6e86e203", |
| | | "dxmodules\\crypto-es\\rabbit-legacy.js": "580adab56a5e75aa7fa71ce7a79baeca", |
| | | "dxmodules\\crypto-es\\rabbit.js": "79323a58e0aa1df18d3c6920ea2bff94", |
| | | "dxmodules\\crypto-es\\rc4.js": "c76f35711e13d143f36b3c3032926aba", |
| | | "dxmodules\\crypto-es\\README.md": "f7f10d1eb7ac11ab28105200455e9dc8", |
| | | "dxmodules\\crypto-es\\ripemd160.js": "8321142c9245a95ff86519b0564e04c9", |
| | | "dxmodules\\crypto-es\\sha1.js": "20f5f5895e00141cbba984369cc85677", |
| | | "dxmodules\\crypto-es\\sha224.js": "a022faef3a3261f2ef46aad689868663", |
| | | "dxmodules\\crypto-es\\sha256.js": "b56fc502be36fd7748191ef2ab848aa1", |
| | | "dxmodules\\crypto-es\\sha3.js": "1e8ad2a56cf2900bcb2f92ae118a8f10", |
| | | "dxmodules\\crypto-es\\sha384.js": "761d6fdde71581343ac4ea0b15ebc95d", |
| | | "dxmodules\\crypto-es\\sha512.js": "1b90fae85bb88280ddc0603be4c9ff9a", |
| | | "dxmodules\\crypto-es\\tripledes.js": "90b881b6a598aab6861b2537c147b3f7", |
| | | "dxmodules\\crypto-es\\x64-core.js": "9cb085fad93878dd85edaaa37aa1e4b5", |
| | | "dxmodules\\dxAudio.js": "13780dfd75bbf177bf1f242196f671df", |
| | | "dxmodules\\dxBase64.js": "7cb517ecd99830dde0ec13a501e831ea", |
| | | "dxmodules\\dxCamera.js": "2e74003e95eb396effb2426fc5db9e04", |
| | | "dxmodules\\dxCapcal.js": "c56a3ef1feda15e9da6e39d8f0fdb528", |
| | | "dxmodules\\dxChannel.js": "f6939b18d179587910904dc37a3b88e6", |
| | | "dxmodules\\dxCommon.js": "7face5a0721bd302d666b12c30a17166", |
| | | "dxmodules\\dxCommonUtils.js": "9d408cedb29cce9838c10ae5d1a8c2aa", |
| | | "dxmodules\\dxConfig.js": "24072559b3cb1ec5c206cb358eaaaaae", |
| | | "dxmodules\\dxDisplay.js": "5c80ee7de62e3f7b08eed6e3e0a8b3c1", |
| | | "dxmodules\\dxDriver.js": "1e27304f7ecc691ac66293cd065e6a14", |
| | | "dxmodules\\dxEventBus.js": "075ac9f2d465c92a9446ea07a6e2bfe6", |
| | | "dxmodules\\dxFacial.js": "08f40369fd06cb3f5f69cd035d4ecab2", |
| | | "dxmodules\\dxFacialBarcode.js": "67508897203cf7382f4bb20c4044dc17", |
| | | "dxmodules\\dxFingerMz.js": "4e2d6794d3a5c38dfcf80f24b4d9f8e6", |
| | | "dxmodules\\dxFingerZaz.js": "47463d6c6ee81f2373df95fe3638ab9c", |
| | | "dxmodules\\dxGpio.js": "30c34469e2dc8d80026fc5eac5bfd1f7", |
| | | "dxmodules\\dxGpioKey.js": "3877f16ccf0987cd491adbf2f8f97f2e", |
| | | "dxmodules\\dxHttp.js": "fa75a0a2951399fb5af7618d7ab4c6f1", |
| | | "dxmodules\\dxHttpClient.js": "0f81691b2405d87e8fa230e1223f7b78", |
| | | "dxmodules\\dxHttpServer.js": "bd66e578dcbe66934548c2a52aa56ab0", |
| | | "dxmodules\\dxLogger.js": "be5516b1419e1e6c98947196cd4c5df1", |
| | | "dxmodules\\dxMap.js": "61c9b76b7e05e4e8bebeccd1dfaaa963", |
| | | "dxmodules\\dxMqttClient.js": "d18248384c1ecee412c1f1ba86c233ac", |
| | | "dxmodules\\dxNetwork.js": "e377baf713245bf54012d56ea15b48d2", |
| | | "dxmodules\\dxNfc.js": "feb5bc21d4b13ab9736de1941290312d", |
| | | "dxmodules\\dxNfcCard.js": "689161d840c1ee82107e55b3e43da5c3", |
| | | "dxmodules\\dxNtp.js": "54a83064faa67f8f4991e1da56a3caf4", |
| | | "dxmodules\\dxOs.js": "8171120055734e75dd6c878862ae965a", |
| | | "dxmodules\\dxOta.js": "a4bf84aaead7298c5da10161644f2b1f", |
| | | "dxmodules\\dxPwm.js": "d8238b43ef7c0d77a33108290394e12c", |
| | | "dxmodules\\dxQrRule.js": "bfa9e2b4725c4fa358a2988f63c67210", |
| | | "dxmodules\\dxSqliteDB.js": "4762a29fb74d837d43d1d19415f77536", |
| | | "dxmodules\\dxStd.js": "322e8885cd0c7d2d9137b47fec8c8b00", |
| | | "dxmodules\\dxTimeZones.js": "c05c66e1fc1dfea0aca722f148190148", |
| | | "dxmodules\\dxUart.js": "0cb032a9f73a894b601ff7fef1c648e7", |
| | | "dxmodules\\dxVgBle.js": "348e4999a1c77d85bfc962c6fbdcc742", |
| | | "dxmodules\\dxWatchdog.js": "4833387ea9787b18a8c75a4ffc57b35e", |
| | | "dxmodules\\dxWorkerPool.js": "77ec46afea15eac3ff99c41fb23f43ff", |
| | | "dxmodules\\libasound.so.2": "c2cf01ef989d7e237b1d6fbc7e8dd864", |
| | | "dxmodules\\libatopology.so.2": "f8ea786abf596b37cf4546aa451a6c46", |
| | | "dxmodules\\libpaho-mqtt3cs.so.1": "87713197d248b22ee3dffe89f166d472", |
| | | "dxmodules\\libvbar-b-dxgpio.so": "ca009351ab7d9719a71cd6105e9acba6", |
| | | "dxmodules\\libvbar-b-dxpwm.so": "6d90f8d1171b16aa583a0c7fcc4f43a1", |
| | | "dxmodules\\libvbar-drv-audio_gain.so": "2eec6e720acaee6c4328cb75f5ae11d1", |
| | | "dxmodules\\libvbar-drv-capcal.so": "6236c6a52401d47047b4f34ad55f7e3d", |
| | | "dxmodules\\libvbar-drv-capturer.so": "92a4e62761f88eaaa185782f790d0e43", |
| | | "dxmodules\\libvbar-drv-display.so": "29349e3c7335720975018beb02401b79", |
| | | "dxmodules\\libvbar-drv-face.so": "ed17b2951e8a72aced9a144bd90e3e89", |
| | | "dxmodules\\libvbar-drv-gpio.so": "3f0abbaee2f972c4ed88fb0a6964e532", |
| | | "dxmodules\\libvbar-drv-memory.so": "0ed48486e154f24d6681a0195a7525ad", |
| | | "dxmodules\\libvbar-drv-pwm.so": "975d6cbb5529c3ddd2514653b4fbe4af", |
| | | "dxmodules\\libvbar-drv-soc.so": "73e4b6657af4bcff0affaacf55702096", |
| | | "dxmodules\\libvbar-drv-tts.so": "1b3893d2efb58a1ffbfb0fa42915e3c7", |
| | | "dxmodules\\libvbar-drv-watchdog.so": "6226d1373d012eadeab2d0b895dd4367", |
| | | "dxmodules\\libvbar-m-audio.so": "000a366ffd92abe7dfe0b8b656b7b8a9", |
| | | "dxmodules\\libvbar-m-capturer.so": "8f0b6383db39494904294c3f60c5f013", |
| | | "dxmodules\\libvbar-m-channel.so": "bcb6746b5325793eca68a29b63aa1217", |
| | | "dxmodules\\libvbar-m-common.so": "b3821e6a3cb54a3afb3029ab1a7e68d6", |
| | | "dxmodules\\libvbar-m-dxaudio.so": "3d4f148f8293a48e03d64320e511520b", |
| | | "dxmodules\\libvbar-m-dxchannel.so": "3ba10035946cff6fbdffac07ef9df9cc", |
| | | "dxmodules\\libvbar-m-dxcommon.so": "538dec5814f2e8f030813cd88bb0703f", |
| | | "dxmodules\\libvbar-m-dxcommonutils.so": "c72011e82a558a4e84819645700ec879", |
| | | "dxmodules\\libvbar-m-dxdisplay.so": "4de71b250645bcf8e63da84015976196", |
| | | "dxmodules\\libvbar-m-dxfacial.so": "a401e8e0460a881d748bba0cf235a5a9", |
| | | "dxmodules\\libvbar-m-dxhttpclient.so": "9d2ce48027e5afcb1e85b5703a5f1f53", |
| | | "dxmodules\\libvbar-m-dxhttpserver.so": "7238d45c439402b79b696067b3eb2ec8", |
| | | "dxmodules\\libvbar-m-dxkey.so": "e9efc4894bcd538c2a59d048ca57c70a", |
| | | "dxmodules\\libvbar-m-dxmap.so": "d692e8e4ed4b1198f0a7f2f3eefd7865", |
| | | "dxmodules\\libvbar-m-dxmqttclient.so": "9b7e75398a0f3d2bf138deead9221c46", |
| | | "dxmodules\\libvbar-m-dxnetwork.so": "e4d4f8b955b9f871cf913607f0dd406a", |
| | | "dxmodules\\libvbar-m-dxnfccard.so": "d7f14dddded1ffd89475f18a092c8530", |
| | | "dxmodules\\libvbar-m-dxos.so": "b46dd08ab1769f5c246c284f83311294", |
| | | "dxmodules\\libvbar-m-dxsqlitedb.so": "7581e5d8a56f6d9c23885e4ceb57e4a2", |
| | | "dxmodules\\libvbar-m-dxuart.so": "e59a58bddafa0d7fa8d13387feb59946", |
| | | "dxmodules\\libvbar-m-dxwatchdog.so": "9854b627923ad943b2b34250ba717505", |
| | | "dxmodules\\libvbar-m-eid.so": "a4d1b2fa880f6d67e805dfca07f26523", |
| | | "dxmodules\\libvbar-m-key.so": "a51d6ce68a66e21865a47cf5a350ce80", |
| | | "dxmodules\\libvbar-m-net.so": "e058b3e454d27044d6544dbfe13a3254", |
| | | "dxmodules\\libvbar-p-nfc.so": "1b3af2b46962720f8f13a7c275576049", |
| | | "dxmodules\\libzbar.so": "dc72c4323c8b5616037b8ebf32740665", |
| | | "dxmodules\\vbar_version": "ecaec8f34eac0b8b086a1638030427bc", |
| | | "dxmodules\\vgUartWorker.js": "fc3e9e0051836d5063c0eecf555d9521", |
| | | "dxmodules\\zoneinfo\\Africa\\Abidjan": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Accra": "6cb97bef390f7c65022c2e8c7eec45e0", |
| | | "dxmodules\\zoneinfo\\Africa\\Addis_Ababa": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Algiers": "3342407b34291d264175caaf37813938", |
| | | "dxmodules\\zoneinfo\\Africa\\Asmara": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Asmera": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Bamako": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Bangui": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Banjul": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Bissau": "af82ce73e5877a3dfd5c9dc93e869fa9", |
| | | "dxmodules\\zoneinfo\\Africa\\Blantyre": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Brazzaville": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Bujumbura": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Cairo": "b9bb9d8c3cddc72252f4aa2082af4213", |
| | | "dxmodules\\zoneinfo\\Africa\\Casablanca": "565d702c341dd4239a7e76208653c18c", |
| | | "dxmodules\\zoneinfo\\Africa\\Ceuta": "5c2bf01f3f9fadcfa9a188e594f232e9", |
| | | "dxmodules\\zoneinfo\\Africa\\Conakry": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Dakar": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Dar_es_Salaam": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Djibouti": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Douala": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\El_Aaiun": "b5acb6aaf433bd0dfe09d90fcc30c7e3", |
| | | "dxmodules\\zoneinfo\\Africa\\Freetown": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Gaborone": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Harare": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Johannesburg": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\Africa\\Juba": "659ed8d529baf6f5043db708c1d17bee", |
| | | "dxmodules\\zoneinfo\\Africa\\Kampala": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Khartoum": "021e36c906192435e0cb9c09440173a3", |
| | | "dxmodules\\zoneinfo\\Africa\\Kigali": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Kinshasa": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Lagos": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Libreville": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Lome": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Luanda": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Lubumbashi": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Lusaka": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Malabo": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Maputo": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Maseru": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\Africa\\Mbabane": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\Africa\\Mogadishu": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Monrovia": "896a875aafa39c10b614c9803d1f2673", |
| | | "dxmodules\\zoneinfo\\Africa\\Nairobi": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Ndjamena": "a0aad5ca661653e362b8afc808dc85c1", |
| | | "dxmodules\\zoneinfo\\Africa\\Niamey": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Nouakchott": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Ouagadougou": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Porto-Novo": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Sao_Tome": "06142521165cb91ddc40c1d9000c7038", |
| | | "dxmodules\\zoneinfo\\Africa\\Timbuktu": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Tripoli": "edec79f292e5b8c0d32b521af1f118bd", |
| | | "dxmodules\\zoneinfo\\Africa\\Tunis": "4f1b4fe95a2512916e20c6f6e26d8e3c", |
| | | "dxmodules\\zoneinfo\\Africa\\Windhoek": "6e9276508be4c6bfa224b9dddfefa61e", |
| | | "dxmodules\\zoneinfo\\America\\Adak": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\America\\Anchorage": "596428a3a840d568656088bd48e608f1", |
| | | "dxmodules\\zoneinfo\\America\\Anguilla": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Antigua": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Araguaina": "f41ab2d0a7a5b7fa0e3d3ac456b6bc97", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Catamarca": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\ComodRivadavia": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\La_Rioja": "00095a6391dda3fdca483ec5847abf2b", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Rio_Gallegos": "b97bc475f57e6b72c5ef969ed629e144", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Salta": "ed7e059362f3ae6381c2390798b0d524", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\San_Juan": "7c35305a9821e159720fae50b96790ca", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\San_Luis": "3e91f210d3eedf4543a4b716a5ba504c", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Tucuman": "b58092fe8d0461c10f5c3153ad9ed653", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Ushuaia": "b1d065d0cd8358933796fe3f034d799a", |
| | | "dxmodules\\zoneinfo\\America\\Aruba": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\America\\Asuncion": "09a3f0569913d138c4f5d8c0c97c055c", |
| | | "dxmodules\\zoneinfo\\America\\Atikokan": "6b028d3f8073ba06f9467133f6a1a0dd", |
| | | "dxmodules\\zoneinfo\\America\\Atka": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\America\\Bahia": "2f5dd75c9ee116e4ca290849dfff7a9f", |
| | | "dxmodules\\zoneinfo\\America\\Bahia_Banderas": "6d24d30bc671042918ba397a15e6114c", |
| | | "dxmodules\\zoneinfo\\America\\Barbados": "92550378b8952475d3bffe20b1168820", |
| | | "dxmodules\\zoneinfo\\America\\Belem": "432beed5d93041f2b551051332d7d72e", |
| | | "dxmodules\\zoneinfo\\America\\Belize": "da3145d79cba5f541dd261434e449173", |
| | | "dxmodules\\zoneinfo\\America\\Blanc-Sablon": "4169ae15c5a1477cfe281fa7702bcc14", |
| | | "dxmodules\\zoneinfo\\America\\Boa_Vista": "a98b8a6d614366047943d78bc1896acb", |
| | | "dxmodules\\zoneinfo\\America\\Bogota": "cb5574ae9b01614c9e8c082039fe8147", |
| | | "dxmodules\\zoneinfo\\America\\Boise": "45dce4d7ef2491d2450d16565f878b02", |
| | | "dxmodules\\zoneinfo\\America\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49", |
| | | "dxmodules\\zoneinfo\\America\\Cambridge_Bay": "048d33fc74c19008a5a440b8b226cb45", |
| | | "dxmodules\\zoneinfo\\America\\Campo_Grande": "6e2912b5b855c5e6d39eeb1bcf19aea5", |
| | | "dxmodules\\zoneinfo\\America\\Cancun": "a2fe4da50cfb1afe8a46d6f55b805afa", |
| | | "dxmodules\\zoneinfo\\America\\Caracas": "a5bf9cdb87d451a4aabad61d4ce91a2b", |
| | | "dxmodules\\zoneinfo\\America\\Catamarca": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\America\\Cayenne": "e9f3bdd863a3cf2127077a21e918b057", |
| | | "dxmodules\\zoneinfo\\America\\Cayman": "843b6eadcdd7838269e2195df886ebf1", |
| | | "dxmodules\\zoneinfo\\America\\Chicago": "d0f076c9f390e7d8a933cc7cc1ad2e90", |
| | | "dxmodules\\zoneinfo\\America\\Chihuahua": "75c741bb811f4ee563ce05eb976e53a1", |
| | | "dxmodules\\zoneinfo\\America\\Coral_Harbour": "6b028d3f8073ba06f9467133f6a1a0dd", |
| | | "dxmodules\\zoneinfo\\America\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\America\\Costa_Rica": "2dec281340a45276b0799a3bec48b76b", |
| | | "dxmodules\\zoneinfo\\America\\Creston": "dbf874c388dc236612025d145b46d868", |
| | | "dxmodules\\zoneinfo\\America\\Cuiaba": "71d500778aa9de635b9438695cf8b61e", |
| | | "dxmodules\\zoneinfo\\America\\Curacao": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\America\\Danmarkshavn": "20e68f0a941140b269efb3af346b1e34", |
| | | "dxmodules\\zoneinfo\\America\\Dawson": "9c8e92765ad27141e3a56f6a31599c99", |
| | | "dxmodules\\zoneinfo\\America\\Dawson_Creek": "f7955656cccdf253d996deb5bb4176ef", |
| | | "dxmodules\\zoneinfo\\America\\Denver": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\America\\Detroit": "ae3ba6ed8738ceda9eef109c6c586736", |
| | | "dxmodules\\zoneinfo\\America\\Dominica": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Edmonton": "1f23503189b8ce70677b2dcbb4a57e8c", |
| | | "dxmodules\\zoneinfo\\America\\Eirunepe": "236e0fa8dd250599b2146a7a203a6ae4", |
| | | "dxmodules\\zoneinfo\\America\\El_Salvador": "b77c5f52b45573ae0f5673ac0ca1b086", |
| | | "dxmodules\\zoneinfo\\America\\Ensenada": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\America\\Fortaleza": "2e202e859552b09ad60cdc408de47c94", |
| | | "dxmodules\\zoneinfo\\America\\Fort_Nelson": "8853bd10553d7ca5eb5f0b9c7af5a047", |
| | | "dxmodules\\zoneinfo\\America\\Fort_Wayne": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\America\\Glace_Bay": "6ba1b7da532cefb6e32d083377b71303", |
| | | "dxmodules\\zoneinfo\\America\\Godthab": "4a1f3fd710057cfeaf3e7ac964a18466", |
| | | "dxmodules\\zoneinfo\\America\\Goose_Bay": "18a9d1af32911f30273fabcc694d9654", |
| | | "dxmodules\\zoneinfo\\America\\Grand_Turk": "539dcee68a715238ef8aa5642a9b5214", |
| | | "dxmodules\\zoneinfo\\America\\Grenada": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Guadeloupe": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Guatemala": "097638f469fdba70e9637561cffefd91", |
| | | "dxmodules\\zoneinfo\\America\\Guayaquil": "bbe67886e74ffd7d1ed09a3481b5120c", |
| | | "dxmodules\\zoneinfo\\America\\Guyana": "7fb63c484765baf41049bd41cfca0184", |
| | | "dxmodules\\zoneinfo\\America\\Halifax": "820f35f23d49a527ffe813e2d96c5da7", |
| | | "dxmodules\\zoneinfo\\America\\Havana": "1877fc45317e144ea206ddc622cebba2", |
| | | "dxmodules\\zoneinfo\\America\\Hermosillo": "7bdce7a211e50eff3b5b8de21a46d581", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Knox": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Marengo": "541539f004b1b1722ac96e897d06ac45", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Petersburg": "82b5d3f05f88ac02cb5a4c3fb08fa191", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Tell_City": "dfe557585c608ee9e34e9b75fbe72617", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Vevay": "d0f3d93603268abdfeb402bbe0c3c0b3", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Vincennes": "d13258dc61c8a747a914396a56e4218c", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Winamac": "e6b915ae1c01b71fd7b42b00b4664029", |
| | | "dxmodules\\zoneinfo\\America\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\America\\Inuvik": "4ea2c19a83f810220c7302c9914e4ee4", |
| | | "dxmodules\\zoneinfo\\America\\Iqaluit": "4142e0b137ac6cf3fdad0fce11560ca1", |
| | | "dxmodules\\zoneinfo\\America\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af", |
| | | "dxmodules\\zoneinfo\\America\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11", |
| | | "dxmodules\\zoneinfo\\America\\Juneau": "6276c692ca4f68dcb846d7e918ee23dd", |
| | | "dxmodules\\zoneinfo\\America\\Kentucky\\Louisville": "99545115e4f688d7f573d38d667194d9", |
| | | "dxmodules\\zoneinfo\\America\\Kentucky\\Monticello": "4041c24d41fbbd407e4d398824225d50", |
| | | "dxmodules\\zoneinfo\\America\\Knox_IN": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\America\\Kralendijk": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\America\\La_Paz": "962d2f2486d3c16a6095390156e322b3", |
| | | "dxmodules\\zoneinfo\\America\\Lima": "cc24c83127c28793afc54e43fe5766e4", |
| | | "dxmodules\\zoneinfo\\America\\Los_Angeles": "9323ff44ce205ce1a1bad7e2dca39939", |
| | | "dxmodules\\zoneinfo\\America\\Louisville": "99545115e4f688d7f573d38d667194d9", |
| | | "dxmodules\\zoneinfo\\America\\Lower_Princes": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\America\\Maceio": "378a3e07cabc7773b6078025e9981793", |
| | | "dxmodules\\zoneinfo\\America\\Managua": "4667d4aa7d530f1f61f5b116258eb84d", |
| | | "dxmodules\\zoneinfo\\America\\Manaus": "585a0b598d406e6c0d710182bbdba35e", |
| | | "dxmodules\\zoneinfo\\America\\Marigot": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Martinique": "ecdf79bbd2c17670a4637d06b01d7819", |
| | | "dxmodules\\zoneinfo\\America\\Matamoros": "9ba17635ae8f44fa50c4565328433383", |
| | | "dxmodules\\zoneinfo\\America\\Mazatlan": "2a157b818df8ab296baf6de38cd7d32b", |
| | | "dxmodules\\zoneinfo\\America\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870", |
| | | "dxmodules\\zoneinfo\\America\\Menominee": "c720185d11deb83ad58b22b118830261", |
| | | "dxmodules\\zoneinfo\\America\\Merida": "91ebe16317802987c2cd9c567b6e4c2a", |
| | | "dxmodules\\zoneinfo\\America\\Metlakatla": "02b06c27e6b6de8398ac263055a2d280", |
| | | "dxmodules\\zoneinfo\\America\\Mexico_City": "cff58c6976849e1e8f94d4288b07b9d2", |
| | | "dxmodules\\zoneinfo\\America\\Miquelon": "ac08a2e10dea976318846a7f7b254f26", |
| | | "dxmodules\\zoneinfo\\America\\Moncton": "2fa9e016bc7e55f51d036a158a40e0e9", |
| | | "dxmodules\\zoneinfo\\America\\Monterrey": "f77b22ac5e4f995ef8d4839835a54faa", |
| | | "dxmodules\\zoneinfo\\America\\Montevideo": "51fb8d4c68e90f30d5eb1dd503bf202e", |
| | | "dxmodules\\zoneinfo\\America\\Montreal": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\America\\Montserrat": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Nassau": "1444a5132c9a26f350ebe705760215c7", |
| | | "dxmodules\\zoneinfo\\America\\New_York": "e4ca381035a34b7a852184cc0dd89baa", |
| | | "dxmodules\\zoneinfo\\America\\Nipigon": "365984faa12e0762dac780bf71204633", |
| | | "dxmodules\\zoneinfo\\America\\Nome": "f9cb8bbe99e6143a75b2797ddf94f234", |
| | | "dxmodules\\zoneinfo\\America\\Noronha": "a8562cc7d0e4555968ad7744dceb9d43", |
| | | "dxmodules\\zoneinfo\\America\\North_Dakota\\Beulah": "59406487459534f8844f828b8356d083", |
| | | "dxmodules\\zoneinfo\\America\\North_Dakota\\Center": "6964f42dc925648abaa448f18b330d46", |
| | | "dxmodules\\zoneinfo\\America\\North_Dakota\\New_Salem": "c14a42a9b8d8571354c8ced6fa931eac", |
| | | "dxmodules\\zoneinfo\\America\\Nuuk": "4a1f3fd710057cfeaf3e7ac964a18466", |
| | | "dxmodules\\zoneinfo\\America\\Ojinaga": "95e6bee1cb146689410010d58e6ee974", |
| | | "dxmodules\\zoneinfo\\America\\Panama": "843b6eadcdd7838269e2195df886ebf1", |
| | | "dxmodules\\zoneinfo\\America\\Pangnirtung": "b71f8c6f5a9b289c981af0cdbf80f7e1", |
| | | "dxmodules\\zoneinfo\\America\\Paramaribo": "2d11461cf62c48496eb9a866b3eb1712", |
| | | "dxmodules\\zoneinfo\\America\\Phoenix": "c697bb02e057325a74547912f631a3a7", |
| | | "dxmodules\\zoneinfo\\America\\Port-au-Prince": "27e4cb1b082cd694df8c1b2f27838f85", |
| | | "dxmodules\\zoneinfo\\America\\Porto_Acre": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\America\\Porto_Velho": "63160b0eb1d694ae0f97644160eea68a", |
| | | "dxmodules\\zoneinfo\\America\\Port_of_Spain": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Puerto_Rico": "b3feb20144b4070d5eff32dab8c8a160", |
| | | "dxmodules\\zoneinfo\\America\\Punta_Arenas": "9c43769cae1008f7fd054e807960a9cd", |
| | | "dxmodules\\zoneinfo\\America\\Rainy_River": "4bdb5a197d174ac4834b4e738340fdf6", |
| | | "dxmodules\\zoneinfo\\America\\Rankin_Inlet": "902bc59be5586a60cf0c67188027f7c4", |
| | | "dxmodules\\zoneinfo\\America\\Recife": "a9b9203d577c57c1cbf0873327336ac1", |
| | | "dxmodules\\zoneinfo\\America\\Regina": "cec6491b350dfbdb74732df745eb37d3", |
| | | "dxmodules\\zoneinfo\\America\\Resolute": "e272bb16aa765ea5439726dde6f283eb", |
| | | "dxmodules\\zoneinfo\\America\\Rio_Branco": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\America\\Rosario": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\America\\Santarem": "31689ae81ac7aea65cc5784da4560e73", |
| | | "dxmodules\\zoneinfo\\America\\Santa_Isabel": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\America\\Santiago": "b8db6707d0c4f0dfc7a12be81d35df8f", |
| | | "dxmodules\\zoneinfo\\America\\Santo_Domingo": "7edb49f18d76f116c5578c3dcd279ade", |
| | | "dxmodules\\zoneinfo\\America\\Sao_Paulo": "339ff8dbd88e39f59b2fd4ee57b1fdb1", |
| | | "dxmodules\\zoneinfo\\America\\Scoresbysund": "1a5f6775efbfe9befc36df0a3d19c594", |
| | | "dxmodules\\zoneinfo\\America\\Shiprock": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\America\\Sitka": "efa4e4969d3d0423dc3429a756921244", |
| | | "dxmodules\\zoneinfo\\America\\St_Barthelemy": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\St_Johns": "79d938b80bf215c8e13d2cb4727343d8", |
| | | "dxmodules\\zoneinfo\\America\\St_Kitts": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\St_Lucia": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\St_Thomas": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\St_Vincent": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Swift_Current": "c74726e554d359f38a26870282725f04", |
| | | "dxmodules\\zoneinfo\\America\\Tegucigalpa": "963e88d190d129470f37774310dd20e4", |
| | | "dxmodules\\zoneinfo\\America\\Thule": "32b5bb9f1f25d306246bd96a0ef317c4", |
| | | "dxmodules\\zoneinfo\\America\\Thunder_Bay": "aa82e0d2a447d3610f4c2eea10c2a7b8", |
| | | "dxmodules\\zoneinfo\\America\\Tijuana": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\America\\Toronto": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\America\\Tortola": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Vancouver": "9d48c60fed12ae8a6f5b139bf0b254b5", |
| | | "dxmodules\\zoneinfo\\America\\Virgin": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Whitehorse": "3b82b92569a6900dadc0aa62c7cb6f36", |
| | | "dxmodules\\zoneinfo\\America\\Winnipeg": "f0683580a6116b3c744cb6b3d63aa0b1", |
| | | "dxmodules\\zoneinfo\\America\\Yakutat": "ee0f462df87e663c328908c5e81260d0", |
| | | "dxmodules\\zoneinfo\\America\\Yellowknife": "b5087ae9a8ccc013470ebf44bc635281", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Casey": "f6d44d9ea6501a60287aeff26715bef0", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Davis": "80a08215623fd38f21aa72861fdf54cd", |
| | | "dxmodules\\zoneinfo\\Antarctica\\DumontDUrville": "e3f2c24ea8bfb0c5bea7a209cfd1baae", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Macquarie": "7c8809733d07903666654c0e67aeaec5", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Mawson": "d285e96947e86928c647ab2b2cf185b5", |
| | | "dxmodules\\zoneinfo\\Antarctica\\McMurdo": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Palmer": "3a6a847fb145840a4941337c2ae86d96", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Rothera": "70e1309683f8a4afa2f0d752bf97b46c", |
| | | "dxmodules\\zoneinfo\\Antarctica\\South_Pole": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Syowa": "553ede0b9071e1364892b1ed27a7f1a6", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Troll": "f13b257391af38577970477597e9d499", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Vostok": "4bb37b331311a0867117d218adf10610", |
| | | "dxmodules\\zoneinfo\\Arctic\\Longyearbyen": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\Asia\\Aden": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\Asia\\Almaty": "938c35fa2fdc23ae382ad9b2278c6f58", |
| | | "dxmodules\\zoneinfo\\Asia\\Amman": "63694da35da6a976fb37a62debd191a4", |
| | | "dxmodules\\zoneinfo\\Asia\\Anadyr": "5648ae758f6447668653221263b5ea9d", |
| | | "dxmodules\\zoneinfo\\Asia\\Aqtau": "d020e6bedcd22c98f021e7c1c3ed8ee4", |
| | | "dxmodules\\zoneinfo\\Asia\\Aqtobe": "486c6c79d56174ee29d05fc6efd9e18e", |
| | | "dxmodules\\zoneinfo\\Asia\\Ashgabat": "235b16a54519989a51679188703ca5ac", |
| | | "dxmodules\\zoneinfo\\Asia\\Ashkhabad": "235b16a54519989a51679188703ca5ac", |
| | | "dxmodules\\zoneinfo\\Asia\\Atyrau": "5fbe4e89da1f20229c0c3747017557c0", |
| | | "dxmodules\\zoneinfo\\Asia\\Baghdad": "af9423b28aad58ffc1790d29244309b8", |
| | | "dxmodules\\zoneinfo\\Asia\\Bahrain": "fc5a2c1c087d56e4b7323259ab62bef6", |
| | | "dxmodules\\zoneinfo\\Asia\\Baku": "27e366b2523ae3dfd1e648ecdf54bc15", |
| | | "dxmodules\\zoneinfo\\Asia\\Bangkok": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\Asia\\Barnaul": "cfefaae119b421f5b3c990ef4948ebf7", |
| | | "dxmodules\\zoneinfo\\Asia\\Beirut": "785117e925db8afec6b0c761163b002c", |
| | | "dxmodules\\zoneinfo\\Asia\\Bishkek": "5dec7f8d19f19560c2fd59b16f2a2214", |
| | | "dxmodules\\zoneinfo\\Asia\\Brunei": "3db4e51993e234a73f7054160abf663d", |
| | | "dxmodules\\zoneinfo\\Asia\\Calcutta": "569f373970581e6488a24b5c70326d49", |
| | | "dxmodules\\zoneinfo\\Asia\\Chita": "6b2c484a3c93d7523cd09ec0d13b53fe", |
| | | "dxmodules\\zoneinfo\\Asia\\Choibalsan": "8ca46182ff4884d5b45c3c41e777783a", |
| | | "dxmodules\\zoneinfo\\Asia\\Chongqing": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\Asia\\Chungking": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\Asia\\Colombo": "12c255c649eaa1ade0387c30596825d9", |
| | | "dxmodules\\zoneinfo\\Asia\\Dacca": "ea255e2dada4541d25ad34139c18419f", |
| | | "dxmodules\\zoneinfo\\Asia\\Damascus": "07b6153d721b5d7d93d78f2591201ffa", |
| | | "dxmodules\\zoneinfo\\Asia\\Dhaka": "ea255e2dada4541d25ad34139c18419f", |
| | | "dxmodules\\zoneinfo\\Asia\\Dili": "5c7fb0d932343cc330df273a5bb9308b", |
| | | "dxmodules\\zoneinfo\\Asia\\Dubai": "e17583385b056a775970e7bcd9a6b7dd", |
| | | "dxmodules\\zoneinfo\\Asia\\Dushanbe": "29a7b7661ea6575cd7f8ba1435b78f1d", |
| | | "dxmodules\\zoneinfo\\Asia\\Famagusta": "14a69e4234b2f2c02a3d3a46d0ecffbb", |
| | | "dxmodules\\zoneinfo\\Asia\\Gaza": "798a2fa999dfbd3d557b0afeedc99562", |
| | | "dxmodules\\zoneinfo\\Asia\\Harbin": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\Asia\\Hebron": "f600ca83e00a4c2d046dbd5ae0461018", |
| | | "dxmodules\\zoneinfo\\Asia\\Hong_Kong": "1f5267f14578c917d94c972e46fc8e0e", |
| | | "dxmodules\\zoneinfo\\Asia\\Hovd": "585f478cf864b0065bd07587e6b1e41f", |
| | | "dxmodules\\zoneinfo\\Asia\\Ho_Chi_Minh": "104047aa22a3824e08e4fffeccc80d19", |
| | | "dxmodules\\zoneinfo\\Asia\\Irkutsk": "8a84642c58ed64282884014698df2f7d", |
| | | "dxmodules\\zoneinfo\\Asia\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\Asia\\Jakarta": "c280819a288b0aea09db4fd1fd017546", |
| | | "dxmodules\\zoneinfo\\Asia\\Jayapura": "75c2120efce23b61989c6a15635d115f", |
| | | "dxmodules\\zoneinfo\\Asia\\Jerusalem": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\Asia\\Kabul": "47a295d1de026d2e443c132316ed4533", |
| | | "dxmodules\\zoneinfo\\Asia\\Kamchatka": "da5950adc8bcdb823cff01b81d2d1ec9", |
| | | "dxmodules\\zoneinfo\\Asia\\Karachi": "b1afc0a7ce4118813cdc8679e8b20d8a", |
| | | "dxmodules\\zoneinfo\\Asia\\Kashgar": "a43f32e98fa40e6601db5cca019a01a8", |
| | | "dxmodules\\zoneinfo\\Asia\\Kathmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1", |
| | | "dxmodules\\zoneinfo\\Asia\\Katmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1", |
| | | "dxmodules\\zoneinfo\\Asia\\Khandyga": "d8845dc2bfed88c1aef353c99c332d8e", |
| | | "dxmodules\\zoneinfo\\Asia\\Kolkata": "569f373970581e6488a24b5c70326d49", |
| | | "dxmodules\\zoneinfo\\Asia\\Krasnoyarsk": "6459a2dc5df86eecb3d8d881e285fbc5", |
| | | "dxmodules\\zoneinfo\\Asia\\Kuala_Lumpur": "8a0970a2f6db03aa6317757fe59d24e5", |
| | | "dxmodules\\zoneinfo\\Asia\\Kuching": "941bf864c5cd1bcbcba5bf386815338d", |
| | | "dxmodules\\zoneinfo\\Asia\\Kuwait": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\Asia\\Macao": "f61abab83b519b307988b2c9e1c13037", |
| | | "dxmodules\\zoneinfo\\Asia\\Macau": "f61abab83b519b307988b2c9e1c13037", |
| | | "dxmodules\\zoneinfo\\Asia\\Magadan": "7d44faf13ac5b3facbd83ff3857a0e1e", |
| | | "dxmodules\\zoneinfo\\Asia\\Makassar": "13cba3c3bb605214bf3464922974ca13", |
| | | "dxmodules\\zoneinfo\\Asia\\Manila": "7edfd09b1ebe5e5a152a03a7a705f5bc", |
| | | "dxmodules\\zoneinfo\\Asia\\Muscat": "e17583385b056a775970e7bcd9a6b7dd", |
| | | "dxmodules\\zoneinfo\\Asia\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a", |
| | | "dxmodules\\zoneinfo\\Asia\\Novokuznetsk": "d5f8acb7b4e7d664a04dd154980eda1f", |
| | | "dxmodules\\zoneinfo\\Asia\\Novosibirsk": "b6434f1e22bf4098c2a8c5371dc301fe", |
| | | "dxmodules\\zoneinfo\\Asia\\Omsk": "e789f5c5cce168d524f5a8c2486b62ba", |
| | | "dxmodules\\zoneinfo\\Asia\\Oral": "2586cc76cb792e5a3e56f5c130892c93", |
| | | "dxmodules\\zoneinfo\\Asia\\Phnom_Penh": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\Asia\\Pontianak": "75dbcd818e883badda4d6df52f07c9ae", |
| | | "dxmodules\\zoneinfo\\Asia\\Pyongyang": "55ccc2dfaf651c7452baf53f3c0bcaa1", |
| | | "dxmodules\\zoneinfo\\Asia\\Qatar": "fc5a2c1c087d56e4b7323259ab62bef6", |
| | | "dxmodules\\zoneinfo\\Asia\\Qostanay": "6f2759a853ade2f4c50fddc156e833c6", |
| | | "dxmodules\\zoneinfo\\Asia\\Qyzylorda": "2794eeaae5075fae6c902660beae2141", |
| | | "dxmodules\\zoneinfo\\Asia\\Rangoon": "facd5e2823e744613e5d83384b53b17f", |
| | | "dxmodules\\zoneinfo\\Asia\\Riyadh": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\Asia\\Saigon": "104047aa22a3824e08e4fffeccc80d19", |
| | | "dxmodules\\zoneinfo\\Asia\\Sakhalin": "d065dcba4d1f2f8df4862ea639caf3f3", |
| | | "dxmodules\\zoneinfo\\Asia\\Samarkand": "7c0752cecdf1b32c7618128577045bcc", |
| | | "dxmodules\\zoneinfo\\Asia\\Seoul": "f7a6e371bd709b3c2f64ce6f67f39f29", |
| | | "dxmodules\\zoneinfo\\Asia\\Shanghai": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\Asia\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3", |
| | | "dxmodules\\zoneinfo\\Asia\\Srednekolymsk": "9e7e46bbc5dad40e5f90e797d941d22e", |
| | | "dxmodules\\zoneinfo\\Asia\\Taipei": "2e67467e3c050e8b3a4022eb9e20300e", |
| | | "dxmodules\\zoneinfo\\Asia\\Tashkent": "3e47dbc84c7895e2cb890776d3ad119b", |
| | | "dxmodules\\zoneinfo\\Asia\\Tbilisi": "da70a44f47a6a309eff8c9302fecf559", |
| | | "dxmodules\\zoneinfo\\Asia\\Tehran": "d2cb514595346f1168c2f1167409ec7c", |
| | | "dxmodules\\zoneinfo\\Asia\\Tel_Aviv": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\Asia\\Thimbu": "97be2e1f7789978b407476a8094d5ee1", |
| | | "dxmodules\\zoneinfo\\Asia\\Thimphu": "97be2e1f7789978b407476a8094d5ee1", |
| | | "dxmodules\\zoneinfo\\Asia\\Tokyo": "478afb8b1f182b2ff53caa2e6cc8ffd9", |
| | | "dxmodules\\zoneinfo\\Asia\\Tomsk": "903e9bdc80298a4433a48219a071d4af", |
| | | "dxmodules\\zoneinfo\\Asia\\Ujung_Pandang": "13cba3c3bb605214bf3464922974ca13", |
| | | "dxmodules\\zoneinfo\\Asia\\Ulaanbaatar": "3f0446e3735c9dd93089eeae31a37c1b", |
| | | "dxmodules\\zoneinfo\\Asia\\Ulan_Bator": "3f0446e3735c9dd93089eeae31a37c1b", |
| | | "dxmodules\\zoneinfo\\Asia\\Urumqi": "a43f32e98fa40e6601db5cca019a01a8", |
| | | "dxmodules\\zoneinfo\\Asia\\Ust-Nera": "4d04e65ff5d8c7b407d6cb8dedbe33a4", |
| | | "dxmodules\\zoneinfo\\Asia\\Vientiane": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\Asia\\Vladivostok": "cecab70411f0df191ef4a2cb747bdb08", |
| | | "dxmodules\\zoneinfo\\Asia\\Yakutsk": "bfef1f6f86fa7080259fd26f7668bc84", |
| | | "dxmodules\\zoneinfo\\Asia\\Yangon": "facd5e2823e744613e5d83384b53b17f", |
| | | "dxmodules\\zoneinfo\\Asia\\Yekaterinburg": "807931acd2f4fa27806b8208de988391", |
| | | "dxmodules\\zoneinfo\\Asia\\Yerevan": "e196b792aab3b785a957682c74f574e7", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Azores": "5433c796c8a770b6b06fe812ae08527f", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Bermuda": "659000f311b0ab5c90442cb81278c62c", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Canary": "167a786aa74ba2a9dd68c470746aa0ac", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Cape_Verde": "b3795953b76fb3cc553fdbb4d825cb93", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Faeroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Faroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Jan_Mayen": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Madeira": "2e4a8509560836b8341ec2e612627005", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Reykjavik": "d5e2f791bed996743c667784bb8c52ea", |
| | | "dxmodules\\zoneinfo\\Atlantic\\South_Georgia": "f0b2aeeddf3200b6a5839d86f35879e6", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Stanley": "5a5247cc12a456fee6716540c14e55ad", |
| | | "dxmodules\\zoneinfo\\Atlantic\\St_Helena": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Australia\\ACT": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\Australia\\Adelaide": "a3ec822dc0c8fd04e431b3316d1166ca", |
| | | "dxmodules\\zoneinfo\\Australia\\Brisbane": "0c8a54dfc42c9a987fff25d5d72096fa", |
| | | "dxmodules\\zoneinfo\\Australia\\Broken_Hill": "c0a218c9fe25b535b4a1a6b70dad3af2", |
| | | "dxmodules\\zoneinfo\\Australia\\Canberra": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\Australia\\Currie": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\Australia\\Darwin": "cbb2b15b2c2034c2584f801cec184e2b", |
| | | "dxmodules\\zoneinfo\\Australia\\Eucla": "1459b57ff3474bbe12013908f4bed8aa", |
| | | "dxmodules\\zoneinfo\\Australia\\Hobart": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\Australia\\LHI": "b664b61c1949c1beea8838facf6c1d8b", |
| | | "dxmodules\\zoneinfo\\Australia\\Lindeman": "4d125f1a5ec84cf6f62607152dedf324", |
| | | "dxmodules\\zoneinfo\\Australia\\Lord_Howe": "b664b61c1949c1beea8838facf6c1d8b", |
| | | "dxmodules\\zoneinfo\\Australia\\Melbourne": "5f06e3a482d43ee4018736ac792b1129", |
| | | "dxmodules\\zoneinfo\\Australia\\North": "cbb2b15b2c2034c2584f801cec184e2b", |
| | | "dxmodules\\zoneinfo\\Australia\\NSW": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\Australia\\Perth": "a54a9120fddca3a9bb951ac9d8bce260", |
| | | "dxmodules\\zoneinfo\\Australia\\Queensland": "0c8a54dfc42c9a987fff25d5d72096fa", |
| | | "dxmodules\\zoneinfo\\Australia\\South": "a3ec822dc0c8fd04e431b3316d1166ca", |
| | | "dxmodules\\zoneinfo\\Australia\\Sydney": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\Australia\\Tasmania": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\Australia\\Victoria": "5f06e3a482d43ee4018736ac792b1129", |
| | | "dxmodules\\zoneinfo\\Australia\\West": "a54a9120fddca3a9bb951ac9d8bce260", |
| | | "dxmodules\\zoneinfo\\Australia\\Yancowinna": "c0a218c9fe25b535b4a1a6b70dad3af2", |
| | | "dxmodules\\zoneinfo\\Brazil\\Acre": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\Brazil\\DeNoronha": "a8562cc7d0e4555968ad7744dceb9d43", |
| | | "dxmodules\\zoneinfo\\Brazil\\East": "339ff8dbd88e39f59b2fd4ee57b1fdb1", |
| | | "dxmodules\\zoneinfo\\Brazil\\West": "585a0b598d406e6c0d710182bbdba35e", |
| | | "dxmodules\\zoneinfo\\Canada\\Atlantic": "820f35f23d49a527ffe813e2d96c5da7", |
| | | "dxmodules\\zoneinfo\\Canada\\Central": "f0683580a6116b3c744cb6b3d63aa0b1", |
| | | "dxmodules\\zoneinfo\\Canada\\Eastern": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\Canada\\Mountain": "1f23503189b8ce70677b2dcbb4a57e8c", |
| | | "dxmodules\\zoneinfo\\Canada\\Newfoundland": "79d938b80bf215c8e13d2cb4727343d8", |
| | | "dxmodules\\zoneinfo\\Canada\\Pacific": "9d48c60fed12ae8a6f5b139bf0b254b5", |
| | | "dxmodules\\zoneinfo\\Canada\\Saskatchewan": "cec6491b350dfbdb74732df745eb37d3", |
| | | "dxmodules\\zoneinfo\\Canada\\Yukon": "3b82b92569a6900dadc0aa62c7cb6f36", |
| | | "dxmodules\\zoneinfo\\CET": "3f166816639388adb3d3567e28ef2145", |
| | | "dxmodules\\zoneinfo\\Chile\\Continental": "b8db6707d0c4f0dfc7a12be81d35df8f", |
| | | "dxmodules\\zoneinfo\\Chile\\EasterIsland": "ea76f04afd1b377b869cd7532b35457c", |
| | | "dxmodules\\zoneinfo\\CST6CDT": "8396c3e49c717f9ba736b4d4d1b24b8b", |
| | | "dxmodules\\zoneinfo\\Cuba": "1877fc45317e144ea206ddc622cebba2", |
| | | "dxmodules\\zoneinfo\\EET": "16b84f2a83840fd4132c2e3fbff3b758", |
| | | "dxmodules\\zoneinfo\\Egypt": "b9bb9d8c3cddc72252f4aa2082af4213", |
| | | "dxmodules\\zoneinfo\\Eire": "0e226ce4b36682f2c9c2fa1146809778", |
| | | "dxmodules\\zoneinfo\\EST": "d0f150b6acc4dc78b8ada8abb1079af6", |
| | | "dxmodules\\zoneinfo\\EST5EDT": "e7a28a1315bcd4deedaaac6d1c3cd3e2", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+1": "169210c55520d3a8efc1362a5d89e402", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+10": "03d40b4007e96680e56f10372148cf51", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+11": "bb030b7fea0da0987217737e22a9cbe0", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+12": "66046646734491458066327a04705b0c", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+2": "0a97351084a016afb88b8b698ea922d8", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+3": "73897f3686a7bca3e2719cfa59f83b6b", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+4": "e943df1168ea3d597ec62c8933a11a9c", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+5": "a9d53018097b6bcca5e6a4e55211e80b", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+6": "0a8c24c796c1473250ff564fce59e937", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+7": "d87007923e671b8b78552d613299ac8a", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+8": "e99240e190c8a4ccf3cc0a26618fb09b", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+9": "e77b0b4911d483289610c4efcd599d7d", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-1": "a3c457b6cc2c3be7f34da00d84ec229e", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-10": "8ed77c9096196e97be5f0807bf939bac", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-11": "dcdc4caf8194fa9d29ceccdc225a5048", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-12": "fe87b6111ce93c3d10fe152ca715a715", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-13": "0fd6f7e68d38e1cef98efdc6ecedae80", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-14": "155f8eb5a5dd22c81eef6986c8c5317c", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-2": "a9eafb629b4070ca0ff8f99631390031", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-3": "b73ddab7b5ca9128a8b2925fad5b11f0", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-4": "0c08dc6b2974b3207bf6293544a236b0", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-5": "57ca1133eeeb09c7c30c04850d49d4e5", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-6": "642170284ddc2575f5e077d7ea33dcdc", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-7": "2f4d1ba17adf0c86acb4cc6258f8a0cb", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-8": "f4d3b2b664698da9268d3f244fec9232", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-9": "02963228a1537cc2c8bdf22e99178893", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Etc\\Greenwich": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Etc\\UCT": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\Etc\\Universal": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\Etc\\UTC": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\Etc\\Zulu": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\Europe\\Amsterdam": "e3b0d618da0bd60d894183dd0d53923e", |
| | | "dxmodules\\zoneinfo\\Europe\\Andorra": "8bfff3a580b4b0db3dff30d1d7385ac4", |
| | | "dxmodules\\zoneinfo\\Europe\\Astrakhan": "ba197918d51925f1e0b771923ce3a19f", |
| | | "dxmodules\\zoneinfo\\Europe\\Athens": "75d641576f8d4376045ba8f16db4063a", |
| | | "dxmodules\\zoneinfo\\Europe\\Belfast": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\Europe\\Belgrade": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\Berlin": "4790e83465681cefbf852aed265354bf", |
| | | "dxmodules\\zoneinfo\\Europe\\Bratislava": "eab2cea5cb5bf0374f6bf891b9102844", |
| | | "dxmodules\\zoneinfo\\Europe\\Brussels": "3d5d93412e485bac12e0587239835fd9", |
| | | "dxmodules\\zoneinfo\\Europe\\Bucharest": "751205baadb94c5f41dadbcc97ab23db", |
| | | "dxmodules\\zoneinfo\\Europe\\Budapest": "f76d3a5131d6910f5c2a34fbe35c265e", |
| | | "dxmodules\\zoneinfo\\Europe\\Busingen": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\Europe\\Chisinau": "717476d2fe0213c40e31f52573c05356", |
| | | "dxmodules\\zoneinfo\\Europe\\Copenhagen": "96039e70388d843950bcbef21328bba6", |
| | | "dxmodules\\zoneinfo\\Europe\\Dublin": "0e226ce4b36682f2c9c2fa1146809778", |
| | | "dxmodules\\zoneinfo\\Europe\\Gibraltar": "77fe14fec44142c1435dcc4eac003df4", |
| | | "dxmodules\\zoneinfo\\Europe\\Guernsey": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\Europe\\Helsinki": "3eaa8467ffb21b15bd75200ff2c0a3db", |
| | | "dxmodules\\zoneinfo\\Europe\\Isle_of_Man": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\Europe\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\Europe\\Jersey": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\Europe\\Kaliningrad": "7dc8e4aecf6dcf214b52938e289c9831", |
| | | "dxmodules\\zoneinfo\\Europe\\Kiev": "f957769855be8b9d5983e51c033975d8", |
| | | "dxmodules\\zoneinfo\\Europe\\Kirov": "6467d1d15049cb0015bbd56c92b18814", |
| | | "dxmodules\\zoneinfo\\Europe\\Lisbon": "b9ba38decf09fe0728f81ebeabf29cfe", |
| | | "dxmodules\\zoneinfo\\Europe\\Ljubljana": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\London": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\Europe\\Luxembourg": "3242615a805f051357309a89874633f3", |
| | | "dxmodules\\zoneinfo\\Europe\\Madrid": "3ecb0fe1a9207bc3f77e793315ce0e5d", |
| | | "dxmodules\\zoneinfo\\Europe\\Malta": "b6e707a0d755cfd038a7c4ecc44845e7", |
| | | "dxmodules\\zoneinfo\\Europe\\Mariehamn": "3eaa8467ffb21b15bd75200ff2c0a3db", |
| | | "dxmodules\\zoneinfo\\Europe\\Minsk": "07aeb33b58212d75e92b8eb157cc1624", |
| | | "dxmodules\\zoneinfo\\Europe\\Monaco": "89271b78b389e6180385b96e7af94e7a", |
| | | "dxmodules\\zoneinfo\\Europe\\Moscow": "223bbf37352a9d4807919132f360535e", |
| | | "dxmodules\\zoneinfo\\Europe\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a", |
| | | "dxmodules\\zoneinfo\\Europe\\Oslo": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\Europe\\Paris": "fe22373ca65df6ba6b254f5c4304fae8", |
| | | "dxmodules\\zoneinfo\\Europe\\Podgorica": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\Prague": "eab2cea5cb5bf0374f6bf891b9102844", |
| | | "dxmodules\\zoneinfo\\Europe\\Riga": "b4541699f68b4aba0daa45df63e596a4", |
| | | "dxmodules\\zoneinfo\\Europe\\Rome": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\Europe\\Samara": "d390934cf2dc01f033ffda93394c85d7", |
| | | "dxmodules\\zoneinfo\\Europe\\San_Marino": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\Europe\\Sarajevo": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\Saratov": "756b361dc39b978b78eaf6df78a7ad0e", |
| | | "dxmodules\\zoneinfo\\Europe\\Simferopol": "9b2ddc8ca9d5c792d09f37ca58104afa", |
| | | "dxmodules\\zoneinfo\\Europe\\Skopje": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\Sofia": "68e6be692f44b3ed696fd2e6ef806927", |
| | | "dxmodules\\zoneinfo\\Europe\\Stockholm": "1b9ed89af7331c6141249d181b42c621", |
| | | "dxmodules\\zoneinfo\\Europe\\Tallinn": "46abec9f16a148333139ff5b0b6d1115", |
| | | "dxmodules\\zoneinfo\\Europe\\Tirane": "d5977bad592e33b2e4058a242d735927", |
| | | "dxmodules\\zoneinfo\\Europe\\Tiraspol": "717476d2fe0213c40e31f52573c05356", |
| | | "dxmodules\\zoneinfo\\Europe\\Ulyanovsk": "ff8f50dd006548eb8751802c600f2299", |
| | | "dxmodules\\zoneinfo\\Europe\\Uzhgorod": "0b4761ce9ee17b7b8bfb0d12063803c6", |
| | | "dxmodules\\zoneinfo\\Europe\\Vaduz": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\Europe\\Vatican": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\Europe\\Vienna": "cb0f39744833718fbd602c54e0425157", |
| | | "dxmodules\\zoneinfo\\Europe\\Vilnius": "524d360c5369c1abcb59e8140b59acda", |
| | | "dxmodules\\zoneinfo\\Europe\\Volgograd": "442a047745c83ebebc180c67f6798fc2", |
| | | "dxmodules\\zoneinfo\\Europe\\Warsaw": "2ed881ef7e09c844c009673ded84c798", |
| | | "dxmodules\\zoneinfo\\Europe\\Zagreb": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\Zaporozhye": "69430a5e3e93bd0ed6e2e604ddf6e903", |
| | | "dxmodules\\zoneinfo\\Europe\\Zurich": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\GB": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\GB-Eire": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\GMT": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\GMT+0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\GMT-0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\GMT0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Greenwich": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Hongkong": "1f5267f14578c917d94c972e46fc8e0e", |
| | | "dxmodules\\zoneinfo\\HST": "fd4ae9e0296519fb47b4b036ea4af025", |
| | | "dxmodules\\zoneinfo\\Iceland": "d5e2f791bed996743c667784bb8c52ea", |
| | | "dxmodules\\zoneinfo\\Indian\\Antananarivo": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Indian\\Chagos": "dfb323eb6037596036669f4b4505544c", |
| | | "dxmodules\\zoneinfo\\Indian\\Christmas": "02b16169f8f47de904f3f05cb7f72583", |
| | | "dxmodules\\zoneinfo\\Indian\\Cocos": "d9ffcdd40666dcb76225bdfb4654c0cf", |
| | | "dxmodules\\zoneinfo\\Indian\\Comoro": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Indian\\Kerguelen": "749273edab499ed254e32606a9e5579e", |
| | | "dxmodules\\zoneinfo\\Indian\\Mahe": "0df488f823d924b336f01d53d270af73", |
| | | "dxmodules\\zoneinfo\\Indian\\Maldives": "89a066bf0512071db2a9eb425df46341", |
| | | "dxmodules\\zoneinfo\\Indian\\Mauritius": "8f06c0fc457b6a12c0bbc4946e2dfb05", |
| | | "dxmodules\\zoneinfo\\Indian\\Mayotte": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Indian\\Reunion": "817b0a2e45ae9c1e566499a4b068295e", |
| | | "dxmodules\\zoneinfo\\Iran": "d2cb514595346f1168c2f1167409ec7c", |
| | | "dxmodules\\zoneinfo\\iso3166.tab": "22b35b3817db585e12c4e2db934c9680", |
| | | "dxmodules\\zoneinfo\\Israel": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af", |
| | | "dxmodules\\zoneinfo\\Japan": "478afb8b1f182b2ff53caa2e6cc8ffd9", |
| | | "dxmodules\\zoneinfo\\Kwajalein": "6d9261ff9442c0cf69446e362202d691", |
| | | "dxmodules\\zoneinfo\\leapseconds": "cf361cfd45c2547a044f48855d7e5d5c", |
| | | "dxmodules\\zoneinfo\\Libya": "edec79f292e5b8c0d32b521af1f118bd", |
| | | "dxmodules\\zoneinfo\\MET": "3b07c8cc8c1fed960246da4e3791a73c", |
| | | "dxmodules\\zoneinfo\\Mexico\\BajaNorte": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\Mexico\\BajaSur": "2a157b818df8ab296baf6de38cd7d32b", |
| | | "dxmodules\\zoneinfo\\Mexico\\General": "cff58c6976849e1e8f94d4288b07b9d2", |
| | | "dxmodules\\zoneinfo\\MST": "04da8453f31d6971b7fa4f3f8fb26654", |
| | | "dxmodules\\zoneinfo\\MST7MDT": "76be6718eb3cf4ac468387b5d13ffafb", |
| | | "dxmodules\\zoneinfo\\Navajo": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\NZ": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\NZ-CHAT": "0e76ddb8bb10f4b8f2ee092f731b6452", |
| | | "dxmodules\\zoneinfo\\Pacific\\Apia": "6b2ba3b8fc50b635cdc0c1f117243439", |
| | | "dxmodules\\zoneinfo\\Pacific\\Auckland": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\Pacific\\Bougainville": "e2da4052206976c32cd533f22f0bcf15", |
| | | "dxmodules\\zoneinfo\\Pacific\\Chatham": "0e76ddb8bb10f4b8f2ee092f731b6452", |
| | | "dxmodules\\zoneinfo\\Pacific\\Chuuk": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\Pacific\\Easter": "ea76f04afd1b377b869cd7532b35457c", |
| | | "dxmodules\\zoneinfo\\Pacific\\Efate": "25c51b2838decef2f9d90c15e4ef7d3c", |
| | | "dxmodules\\zoneinfo\\Pacific\\Enderbury": "6356a41b8b79885979b2b6613abecb73", |
| | | "dxmodules\\zoneinfo\\Pacific\\Fakaofo": "de7a32503bd8fdc5baec11e6b9aad69b", |
| | | "dxmodules\\zoneinfo\\Pacific\\Fiji": "7133b1eaf825848a26c6fe35f2601908", |
| | | "dxmodules\\zoneinfo\\Pacific\\Funafuti": "eb33daa3195c75c1a5b54b14fe461b73", |
| | | "dxmodules\\zoneinfo\\Pacific\\Galapagos": "684faae885b8ab403c2a54b9f1eecea9", |
| | | "dxmodules\\zoneinfo\\Pacific\\Gambier": "921dd1aee0026d9b376f293ce4f246bc", |
| | | "dxmodules\\zoneinfo\\Pacific\\Guadalcanal": "1de7b39a3bcdce97e8c93d336157dd8b", |
| | | "dxmodules\\zoneinfo\\Pacific\\Guam": "af8e7d6ffe7865cc595b49479e53d408", |
| | | "dxmodules\\zoneinfo\\Pacific\\Honolulu": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\Pacific\\Johnston": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\Pacific\\Kiritimati": "f5876d683bfa2f0339c3c048224e430f", |
| | | "dxmodules\\zoneinfo\\Pacific\\Kosrae": "ef22d34dcb3734017a59ecc62ab84713", |
| | | "dxmodules\\zoneinfo\\Pacific\\Kwajalein": "6d9261ff9442c0cf69446e362202d691", |
| | | "dxmodules\\zoneinfo\\Pacific\\Majuro": "86a054fd15bfbd9fe15156ba7f4155fd", |
| | | "dxmodules\\zoneinfo\\Pacific\\Marquesas": "e05efeb2e72d3a51e6019499841b509c", |
| | | "dxmodules\\zoneinfo\\Pacific\\Midway": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\Pacific\\Nauru": "4f7dd62a8207d60009300c99c1773846", |
| | | "dxmodules\\zoneinfo\\Pacific\\Niue": "2d69ed1a3e4496ecd16c94846675a0f3", |
| | | "dxmodules\\zoneinfo\\Pacific\\Norfolk": "0ba7dc541ce5ad91b2d0aa81589ee205", |
| | | "dxmodules\\zoneinfo\\Pacific\\Noumea": "48f634aa56c4cfee3f6afd37b28b66b2", |
| | | "dxmodules\\zoneinfo\\Pacific\\Pago_Pago": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\Pacific\\Palau": "3ffa839dec8323e475526d5cd38fa82a", |
| | | "dxmodules\\zoneinfo\\Pacific\\Pitcairn": "42e5aa28598d96efb16eb6734f31fda6", |
| | | "dxmodules\\zoneinfo\\Pacific\\Pohnpei": "45f293ec35daa27a60c7e0c90b58012d", |
| | | "dxmodules\\zoneinfo\\Pacific\\Ponape": "45f293ec35daa27a60c7e0c90b58012d", |
| | | "dxmodules\\zoneinfo\\Pacific\\Port_Moresby": "c43a5f332114d2a9cd1d6c9f259c71f3", |
| | | "dxmodules\\zoneinfo\\Pacific\\Rarotonga": "770947b4fd41633dc1d9cecc1ee972d2", |
| | | "dxmodules\\zoneinfo\\Pacific\\Saipan": "af8e7d6ffe7865cc595b49479e53d408", |
| | | "dxmodules\\zoneinfo\\Pacific\\Samoa": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\Pacific\\Tahiti": "cdbc49403d1d7684e83fdfc258106885", |
| | | "dxmodules\\zoneinfo\\Pacific\\Tarawa": "b2564fba66250ab89502eec6d72c0c5e", |
| | | "dxmodules\\zoneinfo\\Pacific\\Tongatapu": "db7a5ceed05b395c4660be082a4377da", |
| | | "dxmodules\\zoneinfo\\Pacific\\Truk": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\Pacific\\Wake": "5763840e0d743d0555d9f0813404da80", |
| | | "dxmodules\\zoneinfo\\Pacific\\Wallis": "36b100715cbee093d7c6056eaf60aeeb", |
| | | "dxmodules\\zoneinfo\\Pacific\\Yap": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\Poland": "2ed881ef7e09c844c009673ded84c798", |
| | | "dxmodules\\zoneinfo\\Portugal": "b9ba38decf09fe0728f81ebeabf29cfe", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Abidjan": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Accra": "6cb97bef390f7c65022c2e8c7eec45e0", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Addis_Ababa": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Algiers": "3342407b34291d264175caaf37813938", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Asmara": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Asmera": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Bamako": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Bangui": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Banjul": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Bissau": "af82ce73e5877a3dfd5c9dc93e869fa9", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Blantyre": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Brazzaville": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Bujumbura": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Cairo": "b9bb9d8c3cddc72252f4aa2082af4213", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Casablanca": "565d702c341dd4239a7e76208653c18c", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Ceuta": "5c2bf01f3f9fadcfa9a188e594f232e9", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Conakry": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Dakar": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Dar_es_Salaam": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Djibouti": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Douala": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\El_Aaiun": "b5acb6aaf433bd0dfe09d90fcc30c7e3", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Freetown": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Gaborone": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Harare": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Johannesburg": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Juba": "659ed8d529baf6f5043db708c1d17bee", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Kampala": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Khartoum": "021e36c906192435e0cb9c09440173a3", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Kigali": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Kinshasa": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Lagos": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Libreville": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Lome": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Luanda": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Lubumbashi": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Lusaka": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Malabo": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Maputo": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Maseru": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Mbabane": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Mogadishu": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Monrovia": "896a875aafa39c10b614c9803d1f2673", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Nairobi": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Ndjamena": "a0aad5ca661653e362b8afc808dc85c1", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Niamey": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Nouakchott": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Ouagadougou": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Porto-Novo": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Sao_Tome": "06142521165cb91ddc40c1d9000c7038", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Timbuktu": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Tripoli": "edec79f292e5b8c0d32b521af1f118bd", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Tunis": "4f1b4fe95a2512916e20c6f6e26d8e3c", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Windhoek": "6e9276508be4c6bfa224b9dddfefa61e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Adak": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Anchorage": "596428a3a840d568656088bd48e608f1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Anguilla": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Antigua": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Araguaina": "f41ab2d0a7a5b7fa0e3d3ac456b6bc97", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Catamarca": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\ComodRivadavia": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\La_Rioja": "00095a6391dda3fdca483ec5847abf2b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Rio_Gallegos": "b97bc475f57e6b72c5ef969ed629e144", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Salta": "ed7e059362f3ae6381c2390798b0d524", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\San_Juan": "7c35305a9821e159720fae50b96790ca", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\San_Luis": "3e91f210d3eedf4543a4b716a5ba504c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Tucuman": "b58092fe8d0461c10f5c3153ad9ed653", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Ushuaia": "b1d065d0cd8358933796fe3f034d799a", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Aruba": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Asuncion": "09a3f0569913d138c4f5d8c0c97c055c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Atikokan": "6b028d3f8073ba06f9467133f6a1a0dd", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Atka": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Bahia": "2f5dd75c9ee116e4ca290849dfff7a9f", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Bahia_Banderas": "6d24d30bc671042918ba397a15e6114c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Barbados": "92550378b8952475d3bffe20b1168820", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Belem": "432beed5d93041f2b551051332d7d72e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Belize": "da3145d79cba5f541dd261434e449173", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Blanc-Sablon": "4169ae15c5a1477cfe281fa7702bcc14", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Boa_Vista": "a98b8a6d614366047943d78bc1896acb", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Bogota": "cb5574ae9b01614c9e8c082039fe8147", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Boise": "45dce4d7ef2491d2450d16565f878b02", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cambridge_Bay": "048d33fc74c19008a5a440b8b226cb45", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Campo_Grande": "6e2912b5b855c5e6d39eeb1bcf19aea5", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cancun": "a2fe4da50cfb1afe8a46d6f55b805afa", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Caracas": "a5bf9cdb87d451a4aabad61d4ce91a2b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Catamarca": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cayenne": "e9f3bdd863a3cf2127077a21e918b057", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cayman": "843b6eadcdd7838269e2195df886ebf1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Chicago": "d0f076c9f390e7d8a933cc7cc1ad2e90", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Chihuahua": "75c741bb811f4ee563ce05eb976e53a1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Coral_Harbour": "6b028d3f8073ba06f9467133f6a1a0dd", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Costa_Rica": "2dec281340a45276b0799a3bec48b76b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Creston": "dbf874c388dc236612025d145b46d868", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cuiaba": "71d500778aa9de635b9438695cf8b61e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Curacao": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Danmarkshavn": "20e68f0a941140b269efb3af346b1e34", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Dawson": "9c8e92765ad27141e3a56f6a31599c99", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Dawson_Creek": "f7955656cccdf253d996deb5bb4176ef", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Denver": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Detroit": "ae3ba6ed8738ceda9eef109c6c586736", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Dominica": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Edmonton": "1f23503189b8ce70677b2dcbb4a57e8c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Eirunepe": "236e0fa8dd250599b2146a7a203a6ae4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\El_Salvador": "b77c5f52b45573ae0f5673ac0ca1b086", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Ensenada": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Fortaleza": "2e202e859552b09ad60cdc408de47c94", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Fort_Nelson": "8853bd10553d7ca5eb5f0b9c7af5a047", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Fort_Wayne": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Glace_Bay": "6ba1b7da532cefb6e32d083377b71303", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Godthab": "4a1f3fd710057cfeaf3e7ac964a18466", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Goose_Bay": "18a9d1af32911f30273fabcc694d9654", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Grand_Turk": "539dcee68a715238ef8aa5642a9b5214", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Grenada": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Guadeloupe": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Guatemala": "097638f469fdba70e9637561cffefd91", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Guayaquil": "bbe67886e74ffd7d1ed09a3481b5120c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Guyana": "7fb63c484765baf41049bd41cfca0184", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Halifax": "820f35f23d49a527ffe813e2d96c5da7", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Havana": "1877fc45317e144ea206ddc622cebba2", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Hermosillo": "7bdce7a211e50eff3b5b8de21a46d581", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Knox": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Marengo": "541539f004b1b1722ac96e897d06ac45", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Petersburg": "82b5d3f05f88ac02cb5a4c3fb08fa191", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Tell_City": "dfe557585c608ee9e34e9b75fbe72617", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Vevay": "d0f3d93603268abdfeb402bbe0c3c0b3", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Vincennes": "d13258dc61c8a747a914396a56e4218c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Winamac": "e6b915ae1c01b71fd7b42b00b4664029", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Inuvik": "4ea2c19a83f810220c7302c9914e4ee4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Iqaluit": "4142e0b137ac6cf3fdad0fce11560ca1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Juneau": "6276c692ca4f68dcb846d7e918ee23dd", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Kentucky\\Louisville": "99545115e4f688d7f573d38d667194d9", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Kentucky\\Monticello": "4041c24d41fbbd407e4d398824225d50", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Knox_IN": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Kralendijk": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\La_Paz": "962d2f2486d3c16a6095390156e322b3", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Lima": "cc24c83127c28793afc54e43fe5766e4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Los_Angeles": "9323ff44ce205ce1a1bad7e2dca39939", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Louisville": "99545115e4f688d7f573d38d667194d9", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Lower_Princes": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Maceio": "378a3e07cabc7773b6078025e9981793", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Managua": "4667d4aa7d530f1f61f5b116258eb84d", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Manaus": "585a0b598d406e6c0d710182bbdba35e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Marigot": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Martinique": "ecdf79bbd2c17670a4637d06b01d7819", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Matamoros": "9ba17635ae8f44fa50c4565328433383", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Mazatlan": "2a157b818df8ab296baf6de38cd7d32b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Menominee": "c720185d11deb83ad58b22b118830261", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Merida": "91ebe16317802987c2cd9c567b6e4c2a", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Metlakatla": "02b06c27e6b6de8398ac263055a2d280", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Mexico_City": "cff58c6976849e1e8f94d4288b07b9d2", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Miquelon": "ac08a2e10dea976318846a7f7b254f26", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Moncton": "2fa9e016bc7e55f51d036a158a40e0e9", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Monterrey": "f77b22ac5e4f995ef8d4839835a54faa", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Montevideo": "51fb8d4c68e90f30d5eb1dd503bf202e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Montreal": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Montserrat": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Nassau": "1444a5132c9a26f350ebe705760215c7", |
| | | "dxmodules\\zoneinfo\\posix\\America\\New_York": "e4ca381035a34b7a852184cc0dd89baa", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Nipigon": "365984faa12e0762dac780bf71204633", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Nome": "f9cb8bbe99e6143a75b2797ddf94f234", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Noronha": "a8562cc7d0e4555968ad7744dceb9d43", |
| | | "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\Beulah": "59406487459534f8844f828b8356d083", |
| | | "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\Center": "6964f42dc925648abaa448f18b330d46", |
| | | "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\New_Salem": "c14a42a9b8d8571354c8ced6fa931eac", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Nuuk": "4a1f3fd710057cfeaf3e7ac964a18466", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Ojinaga": "95e6bee1cb146689410010d58e6ee974", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Panama": "843b6eadcdd7838269e2195df886ebf1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Pangnirtung": "b71f8c6f5a9b289c981af0cdbf80f7e1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Paramaribo": "2d11461cf62c48496eb9a866b3eb1712", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Phoenix": "c697bb02e057325a74547912f631a3a7", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Port-au-Prince": "27e4cb1b082cd694df8c1b2f27838f85", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Porto_Acre": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Porto_Velho": "63160b0eb1d694ae0f97644160eea68a", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Port_of_Spain": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Puerto_Rico": "b3feb20144b4070d5eff32dab8c8a160", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Punta_Arenas": "9c43769cae1008f7fd054e807960a9cd", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Rainy_River": "4bdb5a197d174ac4834b4e738340fdf6", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Rankin_Inlet": "902bc59be5586a60cf0c67188027f7c4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Recife": "a9b9203d577c57c1cbf0873327336ac1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Regina": "cec6491b350dfbdb74732df745eb37d3", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Resolute": "e272bb16aa765ea5439726dde6f283eb", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Rio_Branco": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Rosario": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Santarem": "31689ae81ac7aea65cc5784da4560e73", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Santa_Isabel": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Santiago": "b8db6707d0c4f0dfc7a12be81d35df8f", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Santo_Domingo": "7edb49f18d76f116c5578c3dcd279ade", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Sao_Paulo": "339ff8dbd88e39f59b2fd4ee57b1fdb1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Scoresbysund": "1a5f6775efbfe9befc36df0a3d19c594", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Shiprock": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Sitka": "efa4e4969d3d0423dc3429a756921244", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Barthelemy": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Johns": "79d938b80bf215c8e13d2cb4727343d8", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Kitts": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Lucia": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Thomas": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Vincent": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Swift_Current": "c74726e554d359f38a26870282725f04", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Tegucigalpa": "963e88d190d129470f37774310dd20e4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Thule": "32b5bb9f1f25d306246bd96a0ef317c4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Thunder_Bay": "aa82e0d2a447d3610f4c2eea10c2a7b8", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Tijuana": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Toronto": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Tortola": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Vancouver": "9d48c60fed12ae8a6f5b139bf0b254b5", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Virgin": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Whitehorse": "3b82b92569a6900dadc0aa62c7cb6f36", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Winnipeg": "f0683580a6116b3c744cb6b3d63aa0b1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Yakutat": "ee0f462df87e663c328908c5e81260d0", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Yellowknife": "b5087ae9a8ccc013470ebf44bc635281", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Casey": "f6d44d9ea6501a60287aeff26715bef0", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Davis": "80a08215623fd38f21aa72861fdf54cd", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\DumontDUrville": "e3f2c24ea8bfb0c5bea7a209cfd1baae", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Macquarie": "7c8809733d07903666654c0e67aeaec5", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Mawson": "d285e96947e86928c647ab2b2cf185b5", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\McMurdo": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Palmer": "3a6a847fb145840a4941337c2ae86d96", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Rothera": "70e1309683f8a4afa2f0d752bf97b46c", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\South_Pole": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Syowa": "553ede0b9071e1364892b1ed27a7f1a6", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Troll": "f13b257391af38577970477597e9d499", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Vostok": "4bb37b331311a0867117d218adf10610", |
| | | "dxmodules\\zoneinfo\\posix\\Arctic\\Longyearbyen": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Aden": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Almaty": "938c35fa2fdc23ae382ad9b2278c6f58", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Amman": "63694da35da6a976fb37a62debd191a4", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Anadyr": "5648ae758f6447668653221263b5ea9d", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Aqtau": "d020e6bedcd22c98f021e7c1c3ed8ee4", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Aqtobe": "486c6c79d56174ee29d05fc6efd9e18e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ashgabat": "235b16a54519989a51679188703ca5ac", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ashkhabad": "235b16a54519989a51679188703ca5ac", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Atyrau": "5fbe4e89da1f20229c0c3747017557c0", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Baghdad": "af9423b28aad58ffc1790d29244309b8", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Bahrain": "fc5a2c1c087d56e4b7323259ab62bef6", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Baku": "27e366b2523ae3dfd1e648ecdf54bc15", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Bangkok": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Barnaul": "cfefaae119b421f5b3c990ef4948ebf7", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Beirut": "785117e925db8afec6b0c761163b002c", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Bishkek": "5dec7f8d19f19560c2fd59b16f2a2214", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Brunei": "3db4e51993e234a73f7054160abf663d", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Calcutta": "569f373970581e6488a24b5c70326d49", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Chita": "6b2c484a3c93d7523cd09ec0d13b53fe", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Choibalsan": "8ca46182ff4884d5b45c3c41e777783a", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Chongqing": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Chungking": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Colombo": "12c255c649eaa1ade0387c30596825d9", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Dacca": "ea255e2dada4541d25ad34139c18419f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Damascus": "07b6153d721b5d7d93d78f2591201ffa", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Dhaka": "ea255e2dada4541d25ad34139c18419f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Dili": "5c7fb0d932343cc330df273a5bb9308b", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Dubai": "e17583385b056a775970e7bcd9a6b7dd", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Dushanbe": "29a7b7661ea6575cd7f8ba1435b78f1d", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Famagusta": "14a69e4234b2f2c02a3d3a46d0ecffbb", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Gaza": "798a2fa999dfbd3d557b0afeedc99562", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Harbin": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Hebron": "f600ca83e00a4c2d046dbd5ae0461018", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Hong_Kong": "1f5267f14578c917d94c972e46fc8e0e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Hovd": "585f478cf864b0065bd07587e6b1e41f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ho_Chi_Minh": "104047aa22a3824e08e4fffeccc80d19", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Irkutsk": "8a84642c58ed64282884014698df2f7d", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Jakarta": "c280819a288b0aea09db4fd1fd017546", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Jayapura": "75c2120efce23b61989c6a15635d115f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Jerusalem": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kabul": "47a295d1de026d2e443c132316ed4533", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kamchatka": "da5950adc8bcdb823cff01b81d2d1ec9", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Karachi": "b1afc0a7ce4118813cdc8679e8b20d8a", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kashgar": "a43f32e98fa40e6601db5cca019a01a8", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kathmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Katmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Khandyga": "d8845dc2bfed88c1aef353c99c332d8e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kolkata": "569f373970581e6488a24b5c70326d49", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Krasnoyarsk": "6459a2dc5df86eecb3d8d881e285fbc5", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kuala_Lumpur": "8a0970a2f6db03aa6317757fe59d24e5", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kuching": "941bf864c5cd1bcbcba5bf386815338d", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kuwait": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Macao": "f61abab83b519b307988b2c9e1c13037", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Macau": "f61abab83b519b307988b2c9e1c13037", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Magadan": "7d44faf13ac5b3facbd83ff3857a0e1e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Makassar": "13cba3c3bb605214bf3464922974ca13", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Manila": "7edfd09b1ebe5e5a152a03a7a705f5bc", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Muscat": "e17583385b056a775970e7bcd9a6b7dd", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Novokuznetsk": "d5f8acb7b4e7d664a04dd154980eda1f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Novosibirsk": "b6434f1e22bf4098c2a8c5371dc301fe", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Omsk": "e789f5c5cce168d524f5a8c2486b62ba", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Oral": "2586cc76cb792e5a3e56f5c130892c93", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Phnom_Penh": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Pontianak": "75dbcd818e883badda4d6df52f07c9ae", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Pyongyang": "55ccc2dfaf651c7452baf53f3c0bcaa1", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Qatar": "fc5a2c1c087d56e4b7323259ab62bef6", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Qostanay": "6f2759a853ade2f4c50fddc156e833c6", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Qyzylorda": "2794eeaae5075fae6c902660beae2141", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Rangoon": "facd5e2823e744613e5d83384b53b17f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Riyadh": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Saigon": "104047aa22a3824e08e4fffeccc80d19", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Sakhalin": "d065dcba4d1f2f8df4862ea639caf3f3", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Samarkand": "7c0752cecdf1b32c7618128577045bcc", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Seoul": "f7a6e371bd709b3c2f64ce6f67f39f29", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Shanghai": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Srednekolymsk": "9e7e46bbc5dad40e5f90e797d941d22e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Taipei": "2e67467e3c050e8b3a4022eb9e20300e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tashkent": "3e47dbc84c7895e2cb890776d3ad119b", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tbilisi": "da70a44f47a6a309eff8c9302fecf559", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tehran": "d2cb514595346f1168c2f1167409ec7c", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tel_Aviv": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Thimbu": "97be2e1f7789978b407476a8094d5ee1", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Thimphu": "97be2e1f7789978b407476a8094d5ee1", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tokyo": "478afb8b1f182b2ff53caa2e6cc8ffd9", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tomsk": "903e9bdc80298a4433a48219a071d4af", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ujung_Pandang": "13cba3c3bb605214bf3464922974ca13", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ulaanbaatar": "3f0446e3735c9dd93089eeae31a37c1b", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ulan_Bator": "3f0446e3735c9dd93089eeae31a37c1b", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Urumqi": "a43f32e98fa40e6601db5cca019a01a8", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ust-Nera": "4d04e65ff5d8c7b407d6cb8dedbe33a4", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Vientiane": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Vladivostok": "cecab70411f0df191ef4a2cb747bdb08", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Yakutsk": "bfef1f6f86fa7080259fd26f7668bc84", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Yangon": "facd5e2823e744613e5d83384b53b17f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Yekaterinburg": "807931acd2f4fa27806b8208de988391", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Yerevan": "e196b792aab3b785a957682c74f574e7", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Azores": "5433c796c8a770b6b06fe812ae08527f", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Bermuda": "659000f311b0ab5c90442cb81278c62c", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Canary": "167a786aa74ba2a9dd68c470746aa0ac", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Cape_Verde": "b3795953b76fb3cc553fdbb4d825cb93", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Faeroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Faroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Jan_Mayen": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Madeira": "2e4a8509560836b8341ec2e612627005", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Reykjavik": "d5e2f791bed996743c667784bb8c52ea", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\South_Georgia": "f0b2aeeddf3200b6a5839d86f35879e6", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Stanley": "5a5247cc12a456fee6716540c14e55ad", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\St_Helena": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\ACT": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Adelaide": "a3ec822dc0c8fd04e431b3316d1166ca", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Brisbane": "0c8a54dfc42c9a987fff25d5d72096fa", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Broken_Hill": "c0a218c9fe25b535b4a1a6b70dad3af2", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Canberra": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Currie": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Darwin": "cbb2b15b2c2034c2584f801cec184e2b", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Eucla": "1459b57ff3474bbe12013908f4bed8aa", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Hobart": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\LHI": "b664b61c1949c1beea8838facf6c1d8b", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Lindeman": "4d125f1a5ec84cf6f62607152dedf324", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Lord_Howe": "b664b61c1949c1beea8838facf6c1d8b", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Melbourne": "5f06e3a482d43ee4018736ac792b1129", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\North": "cbb2b15b2c2034c2584f801cec184e2b", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\NSW": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Perth": "a54a9120fddca3a9bb951ac9d8bce260", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Queensland": "0c8a54dfc42c9a987fff25d5d72096fa", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\South": "a3ec822dc0c8fd04e431b3316d1166ca", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Sydney": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Tasmania": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Victoria": "5f06e3a482d43ee4018736ac792b1129", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\West": "a54a9120fddca3a9bb951ac9d8bce260", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Yancowinna": "c0a218c9fe25b535b4a1a6b70dad3af2", |
| | | "dxmodules\\zoneinfo\\posix\\Brazil\\Acre": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\posix\\Brazil\\DeNoronha": "a8562cc7d0e4555968ad7744dceb9d43", |
| | | "dxmodules\\zoneinfo\\posix\\Brazil\\East": "339ff8dbd88e39f59b2fd4ee57b1fdb1", |
| | | "dxmodules\\zoneinfo\\posix\\Brazil\\West": "585a0b598d406e6c0d710182bbdba35e", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Atlantic": "820f35f23d49a527ffe813e2d96c5da7", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Central": "f0683580a6116b3c744cb6b3d63aa0b1", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Eastern": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Mountain": "1f23503189b8ce70677b2dcbb4a57e8c", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Newfoundland": "79d938b80bf215c8e13d2cb4727343d8", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Pacific": "9d48c60fed12ae8a6f5b139bf0b254b5", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Saskatchewan": "cec6491b350dfbdb74732df745eb37d3", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Yukon": "3b82b92569a6900dadc0aa62c7cb6f36", |
| | | "dxmodules\\zoneinfo\\posix\\CET": "3f166816639388adb3d3567e28ef2145", |
| | | "dxmodules\\zoneinfo\\posix\\Chile\\Continental": "b8db6707d0c4f0dfc7a12be81d35df8f", |
| | | "dxmodules\\zoneinfo\\posix\\Chile\\EasterIsland": "ea76f04afd1b377b869cd7532b35457c", |
| | | "dxmodules\\zoneinfo\\posix\\CST6CDT": "8396c3e49c717f9ba736b4d4d1b24b8b", |
| | | "dxmodules\\zoneinfo\\posix\\Cuba": "1877fc45317e144ea206ddc622cebba2", |
| | | "dxmodules\\zoneinfo\\posix\\EET": "16b84f2a83840fd4132c2e3fbff3b758", |
| | | "dxmodules\\zoneinfo\\posix\\Egypt": "b9bb9d8c3cddc72252f4aa2082af4213", |
| | | "dxmodules\\zoneinfo\\posix\\Eire": "0e226ce4b36682f2c9c2fa1146809778", |
| | | "dxmodules\\zoneinfo\\posix\\EST": "d0f150b6acc4dc78b8ada8abb1079af6", |
| | | "dxmodules\\zoneinfo\\posix\\EST5EDT": "e7a28a1315bcd4deedaaac6d1c3cd3e2", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+1": "169210c55520d3a8efc1362a5d89e402", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+10": "03d40b4007e96680e56f10372148cf51", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+11": "bb030b7fea0da0987217737e22a9cbe0", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+12": "66046646734491458066327a04705b0c", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+2": "0a97351084a016afb88b8b698ea922d8", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+3": "73897f3686a7bca3e2719cfa59f83b6b", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+4": "e943df1168ea3d597ec62c8933a11a9c", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+5": "a9d53018097b6bcca5e6a4e55211e80b", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+6": "0a8c24c796c1473250ff564fce59e937", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+7": "d87007923e671b8b78552d613299ac8a", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+8": "e99240e190c8a4ccf3cc0a26618fb09b", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+9": "e77b0b4911d483289610c4efcd599d7d", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-1": "a3c457b6cc2c3be7f34da00d84ec229e", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-10": "8ed77c9096196e97be5f0807bf939bac", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-11": "dcdc4caf8194fa9d29ceccdc225a5048", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-12": "fe87b6111ce93c3d10fe152ca715a715", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-13": "0fd6f7e68d38e1cef98efdc6ecedae80", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-14": "155f8eb5a5dd22c81eef6986c8c5317c", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-2": "a9eafb629b4070ca0ff8f99631390031", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-3": "b73ddab7b5ca9128a8b2925fad5b11f0", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-4": "0c08dc6b2974b3207bf6293544a236b0", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-5": "57ca1133eeeb09c7c30c04850d49d4e5", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-6": "642170284ddc2575f5e077d7ea33dcdc", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-7": "2f4d1ba17adf0c86acb4cc6258f8a0cb", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-8": "f4d3b2b664698da9268d3f244fec9232", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-9": "02963228a1537cc2c8bdf22e99178893", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\Greenwich": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\UCT": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\Universal": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\UTC": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\Zulu": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Amsterdam": "e3b0d618da0bd60d894183dd0d53923e", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Andorra": "8bfff3a580b4b0db3dff30d1d7385ac4", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Astrakhan": "ba197918d51925f1e0b771923ce3a19f", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Athens": "75d641576f8d4376045ba8f16db4063a", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Belfast": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Belgrade": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Berlin": "4790e83465681cefbf852aed265354bf", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Bratislava": "eab2cea5cb5bf0374f6bf891b9102844", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Brussels": "3d5d93412e485bac12e0587239835fd9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Bucharest": "751205baadb94c5f41dadbcc97ab23db", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Budapest": "f76d3a5131d6910f5c2a34fbe35c265e", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Busingen": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Chisinau": "717476d2fe0213c40e31f52573c05356", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Copenhagen": "96039e70388d843950bcbef21328bba6", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Dublin": "0e226ce4b36682f2c9c2fa1146809778", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Gibraltar": "77fe14fec44142c1435dcc4eac003df4", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Guernsey": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Helsinki": "3eaa8467ffb21b15bd75200ff2c0a3db", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Isle_of_Man": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Jersey": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Kaliningrad": "7dc8e4aecf6dcf214b52938e289c9831", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Kiev": "f957769855be8b9d5983e51c033975d8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Kirov": "6467d1d15049cb0015bbd56c92b18814", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Lisbon": "b9ba38decf09fe0728f81ebeabf29cfe", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Ljubljana": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\London": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Luxembourg": "3242615a805f051357309a89874633f3", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Madrid": "3ecb0fe1a9207bc3f77e793315ce0e5d", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Malta": "b6e707a0d755cfd038a7c4ecc44845e7", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Mariehamn": "3eaa8467ffb21b15bd75200ff2c0a3db", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Minsk": "07aeb33b58212d75e92b8eb157cc1624", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Monaco": "89271b78b389e6180385b96e7af94e7a", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Moscow": "223bbf37352a9d4807919132f360535e", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Oslo": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Paris": "fe22373ca65df6ba6b254f5c4304fae8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Podgorica": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Prague": "eab2cea5cb5bf0374f6bf891b9102844", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Riga": "b4541699f68b4aba0daa45df63e596a4", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Rome": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Samara": "d390934cf2dc01f033ffda93394c85d7", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\San_Marino": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Sarajevo": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Saratov": "756b361dc39b978b78eaf6df78a7ad0e", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Simferopol": "9b2ddc8ca9d5c792d09f37ca58104afa", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Skopje": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Sofia": "68e6be692f44b3ed696fd2e6ef806927", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Stockholm": "1b9ed89af7331c6141249d181b42c621", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Tallinn": "46abec9f16a148333139ff5b0b6d1115", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Tirane": "d5977bad592e33b2e4058a242d735927", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Tiraspol": "717476d2fe0213c40e31f52573c05356", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Ulyanovsk": "ff8f50dd006548eb8751802c600f2299", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Uzhgorod": "0b4761ce9ee17b7b8bfb0d12063803c6", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Vaduz": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Vatican": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Vienna": "cb0f39744833718fbd602c54e0425157", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Vilnius": "524d360c5369c1abcb59e8140b59acda", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Volgograd": "442a047745c83ebebc180c67f6798fc2", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Warsaw": "2ed881ef7e09c844c009673ded84c798", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Zagreb": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Zaporozhye": "69430a5e3e93bd0ed6e2e604ddf6e903", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Zurich": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\posix\\GB": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\GB-Eire": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\GMT": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\GMT+0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\GMT-0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\GMT0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Greenwich": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Hongkong": "1f5267f14578c917d94c972e46fc8e0e", |
| | | "dxmodules\\zoneinfo\\posix\\HST": "fd4ae9e0296519fb47b4b036ea4af025", |
| | | "dxmodules\\zoneinfo\\posix\\Iceland": "d5e2f791bed996743c667784bb8c52ea", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Antananarivo": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Chagos": "dfb323eb6037596036669f4b4505544c", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Christmas": "02b16169f8f47de904f3f05cb7f72583", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Cocos": "d9ffcdd40666dcb76225bdfb4654c0cf", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Comoro": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Kerguelen": "749273edab499ed254e32606a9e5579e", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Mahe": "0df488f823d924b336f01d53d270af73", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Maldives": "89a066bf0512071db2a9eb425df46341", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Mauritius": "8f06c0fc457b6a12c0bbc4946e2dfb05", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Mayotte": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Reunion": "817b0a2e45ae9c1e566499a4b068295e", |
| | | "dxmodules\\zoneinfo\\posix\\Iran": "d2cb514595346f1168c2f1167409ec7c", |
| | | "dxmodules\\zoneinfo\\posix\\Israel": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\posix\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af", |
| | | "dxmodules\\zoneinfo\\posix\\Japan": "478afb8b1f182b2ff53caa2e6cc8ffd9", |
| | | "dxmodules\\zoneinfo\\posix\\Kwajalein": "6d9261ff9442c0cf69446e362202d691", |
| | | "dxmodules\\zoneinfo\\posix\\Libya": "edec79f292e5b8c0d32b521af1f118bd", |
| | | "dxmodules\\zoneinfo\\posix\\MET": "3b07c8cc8c1fed960246da4e3791a73c", |
| | | "dxmodules\\zoneinfo\\posix\\Mexico\\BajaNorte": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\posix\\Mexico\\BajaSur": "2a157b818df8ab296baf6de38cd7d32b", |
| | | "dxmodules\\zoneinfo\\posix\\Mexico\\General": "cff58c6976849e1e8f94d4288b07b9d2", |
| | | "dxmodules\\zoneinfo\\posix\\MST": "04da8453f31d6971b7fa4f3f8fb26654", |
| | | "dxmodules\\zoneinfo\\posix\\MST7MDT": "76be6718eb3cf4ac468387b5d13ffafb", |
| | | "dxmodules\\zoneinfo\\posix\\Navajo": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\posix\\NZ": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\posix\\NZ-CHAT": "0e76ddb8bb10f4b8f2ee092f731b6452", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Apia": "6b2ba3b8fc50b635cdc0c1f117243439", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Auckland": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Bougainville": "e2da4052206976c32cd533f22f0bcf15", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Chatham": "0e76ddb8bb10f4b8f2ee092f731b6452", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Chuuk": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Easter": "ea76f04afd1b377b869cd7532b35457c", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Efate": "25c51b2838decef2f9d90c15e4ef7d3c", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Enderbury": "6356a41b8b79885979b2b6613abecb73", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Fakaofo": "de7a32503bd8fdc5baec11e6b9aad69b", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Fiji": "7133b1eaf825848a26c6fe35f2601908", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Funafuti": "eb33daa3195c75c1a5b54b14fe461b73", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Galapagos": "684faae885b8ab403c2a54b9f1eecea9", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Gambier": "921dd1aee0026d9b376f293ce4f246bc", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Guadalcanal": "1de7b39a3bcdce97e8c93d336157dd8b", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Guam": "af8e7d6ffe7865cc595b49479e53d408", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Honolulu": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Johnston": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Kiritimati": "f5876d683bfa2f0339c3c048224e430f", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Kosrae": "ef22d34dcb3734017a59ecc62ab84713", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Kwajalein": "6d9261ff9442c0cf69446e362202d691", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Majuro": "86a054fd15bfbd9fe15156ba7f4155fd", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Marquesas": "e05efeb2e72d3a51e6019499841b509c", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Midway": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Nauru": "4f7dd62a8207d60009300c99c1773846", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Niue": "2d69ed1a3e4496ecd16c94846675a0f3", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Norfolk": "0ba7dc541ce5ad91b2d0aa81589ee205", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Noumea": "48f634aa56c4cfee3f6afd37b28b66b2", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Pago_Pago": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Palau": "3ffa839dec8323e475526d5cd38fa82a", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Pitcairn": "42e5aa28598d96efb16eb6734f31fda6", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Pohnpei": "45f293ec35daa27a60c7e0c90b58012d", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Ponape": "45f293ec35daa27a60c7e0c90b58012d", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Port_Moresby": "c43a5f332114d2a9cd1d6c9f259c71f3", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Rarotonga": "770947b4fd41633dc1d9cecc1ee972d2", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Saipan": "af8e7d6ffe7865cc595b49479e53d408", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Samoa": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Tahiti": "cdbc49403d1d7684e83fdfc258106885", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Tarawa": "b2564fba66250ab89502eec6d72c0c5e", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Tongatapu": "db7a5ceed05b395c4660be082a4377da", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Truk": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Wake": "5763840e0d743d0555d9f0813404da80", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Wallis": "36b100715cbee093d7c6056eaf60aeeb", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Yap": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\posix\\Poland": "2ed881ef7e09c844c009673ded84c798", |
| | | "dxmodules\\zoneinfo\\posix\\Portugal": "b9ba38decf09fe0728f81ebeabf29cfe", |
| | | "dxmodules\\zoneinfo\\posix\\PRC": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\posix\\PST8PDT": "c9452f6b9e08d83c6815c38600798964", |
| | | "dxmodules\\zoneinfo\\posix\\ROC": "2e67467e3c050e8b3a4022eb9e20300e", |
| | | "dxmodules\\zoneinfo\\posix\\ROK": "f7a6e371bd709b3c2f64ce6f67f39f29", |
| | | "dxmodules\\zoneinfo\\posix\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3", |
| | | "dxmodules\\zoneinfo\\posix\\Turkey": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\posix\\UCT": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\Universal": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Alaska": "596428a3a840d568656088bd48e608f1", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Aleutian": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Arizona": "c697bb02e057325a74547912f631a3a7", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Central": "d0f076c9f390e7d8a933cc7cc1ad2e90", |
| | | "dxmodules\\zoneinfo\\posix\\US\\East-Indiana": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Eastern": "e4ca381035a34b7a852184cc0dd89baa", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Hawaii": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Indiana-Starke": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Michigan": "ae3ba6ed8738ceda9eef109c6c586736", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Mountain": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Pacific": "9323ff44ce205ce1a1bad7e2dca39939", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Samoa": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\posix\\UTC": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\W-SU": "223bbf37352a9d4807919132f360535e", |
| | | "dxmodules\\zoneinfo\\posix\\WET": "92388453e62ec1a69fbf12685ad247c7", |
| | | "dxmodules\\zoneinfo\\posix\\Zulu": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posixrules": "e4ca381035a34b7a852184cc0dd89baa", |
| | | "dxmodules\\zoneinfo\\PRC": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\PST8PDT": "c9452f6b9e08d83c6815c38600798964", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Abidjan": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Accra": "255520b3cb5f796d992bd52bdc839d56", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Addis_Ababa": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Algiers": "dc7f41bae1e1b345035837c6906d2f1c", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Asmara": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Asmera": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Bamako": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Bangui": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Banjul": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Bissau": "f9a1ce1e51007b314f4dbb27844724c7", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Blantyre": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Brazzaville": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Bujumbura": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Cairo": "c0216212a93d68f21decbbc1f0675104", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Casablanca": "ce60e1f9ec1b5a9b18c628d3dc8a0cc4", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Ceuta": "92a85bb65bee16f54ff4f05b7a335dd2", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Conakry": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Dakar": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Dar_es_Salaam": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Djibouti": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Douala": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\El_Aaiun": "f10771f58dd1f28f45157eda123196e1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Freetown": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Gaborone": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Harare": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Johannesburg": "5280e94d5521939f68b5550d5f6c24d6", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Juba": "894503e89177c5ac997b405e476f0b90", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Kampala": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Khartoum": "30901eba0d53204dc8eaa9c9299893f8", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Kigali": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Kinshasa": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Lagos": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Libreville": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Lome": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Luanda": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Lubumbashi": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Lusaka": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Malabo": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Maputo": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Maseru": "5280e94d5521939f68b5550d5f6c24d6", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Mbabane": "5280e94d5521939f68b5550d5f6c24d6", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Mogadishu": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Monrovia": "86cab61bd646f40aa46cd5c1ee80a2fc", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Nairobi": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Ndjamena": "eab0671bca010ceb9da03005e6fc6880", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Niamey": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Nouakchott": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Ouagadougou": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Porto-Novo": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Sao_Tome": "1793151a4454db88070f6caf62c2d45f", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Timbuktu": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Tripoli": "140c8538c93832c7c7ae0e40d592dd33", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Tunis": "38ccd67fb776c5af2edf8e925c10f956", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Windhoek": "760491921188579dd193bb89f2650a38", |
| | | "dxmodules\\zoneinfo\\right\\America\\Adak": "282e70d388dfd3923238b8ca86244246", |
| | | "dxmodules\\zoneinfo\\right\\America\\Anchorage": "be6e5ef83221831fd57a032e03246920", |
| | | "dxmodules\\zoneinfo\\right\\America\\Anguilla": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Antigua": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Araguaina": "4c90a3a30f8a255daccba781fa8b119e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Buenos_Aires": "7f85ebd305bc1f7a173caf79f56e77aa", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Catamarca": "e4215654b35cc84b7de145a99ba2a8d4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\ComodRivadavia": "e4215654b35cc84b7de145a99ba2a8d4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Cordoba": "790e6c0ccdc0a17b0087bb7301434648", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Jujuy": "068eec3da9e503286b7c90c971573616", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\La_Rioja": "71958e1b5b3be0f35981845e14efef81", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Mendoza": "b95d8152904b0fdf042c6f5167ff90ab", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Rio_Gallegos": "629f976661deb50db7be073b3855b1f7", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Salta": "af0b9512b0dcc379b6f8ba6ddd7d369d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\San_Juan": "f2fb8b1669d16992662ec824a2e14cb2", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\San_Luis": "08bbc43d6dabe797db33e439d7bce790", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Tucuman": "36d861157f9c70e9dda84b82a34a3ea0", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Ushuaia": "c75191b4db13d1b265b118754debe666", |
| | | "dxmodules\\zoneinfo\\right\\America\\Aruba": "a3dd71a0d51b6cd76218b8d299ba7a93", |
| | | "dxmodules\\zoneinfo\\right\\America\\Asuncion": "33de989fafc47189f03da27c62698373", |
| | | "dxmodules\\zoneinfo\\right\\America\\Atikokan": "b73584d3158e258d8c2b8a43795e2fc9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Atka": "282e70d388dfd3923238b8ca86244246", |
| | | "dxmodules\\zoneinfo\\right\\America\\Bahia": "e4e5ec529a25a5e1c5d0de9080e0b80c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Bahia_Banderas": "c4d9dbbd094173ced5c98e67415078d2", |
| | | "dxmodules\\zoneinfo\\right\\America\\Barbados": "167070d16fcfd7709c995c5f08804df9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Belem": "3ffce1c62895f47fac4097dea33c0100", |
| | | "dxmodules\\zoneinfo\\right\\America\\Belize": "a6f600d246de9f362ce80412e50e703c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Blanc-Sablon": "2637c152f56e58d0978deab40e3fb7af", |
| | | "dxmodules\\zoneinfo\\right\\America\\Boa_Vista": "a2142636ddbbf1a9ef329cd6187f3a7f", |
| | | "dxmodules\\zoneinfo\\right\\America\\Bogota": "da0ff1f7f9dd392ffa9939ab4548bce9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Boise": "ece4d700b42901dd8e70c2ae78feafe8", |
| | | "dxmodules\\zoneinfo\\right\\America\\Buenos_Aires": "7f85ebd305bc1f7a173caf79f56e77aa", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cambridge_Bay": "5ba6299259dca6c49bd37d55b0a23547", |
| | | "dxmodules\\zoneinfo\\right\\America\\Campo_Grande": "ee14c0299e6e91649c3629942385173f", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cancun": "63af9c5ca1e21df45291d378868bfcf3", |
| | | "dxmodules\\zoneinfo\\right\\America\\Caracas": "9f18da7625c6014ac20d61dadce08109", |
| | | "dxmodules\\zoneinfo\\right\\America\\Catamarca": "e4215654b35cc84b7de145a99ba2a8d4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cayenne": "9f8f2cb60fe8096e11d2ade69bf11a35", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cayman": "dbb2a11343300a2c631a6c4b7a3cafac", |
| | | "dxmodules\\zoneinfo\\right\\America\\Chicago": "9e0de2483877c5197b136801aa179825", |
| | | "dxmodules\\zoneinfo\\right\\America\\Chihuahua": "33a79cc0ff099fde13feeb3853c3a751", |
| | | "dxmodules\\zoneinfo\\right\\America\\Coral_Harbour": "b73584d3158e258d8c2b8a43795e2fc9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cordoba": "790e6c0ccdc0a17b0087bb7301434648", |
| | | "dxmodules\\zoneinfo\\right\\America\\Costa_Rica": "36385e27a28e5a44cc3e0379cc203d33", |
| | | "dxmodules\\zoneinfo\\right\\America\\Creston": "28eecb163abd15d8373177be150d09c8", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cuiaba": "9cbde1280ec1e7841e72f6480f3a9e25", |
| | | "dxmodules\\zoneinfo\\right\\America\\Curacao": "a3dd71a0d51b6cd76218b8d299ba7a93", |
| | | "dxmodules\\zoneinfo\\right\\America\\Danmarkshavn": "1790826b85dedc3851db28dd0e220497", |
| | | "dxmodules\\zoneinfo\\right\\America\\Dawson": "c1f9e0a66ac60a0adb572b8dbb15c6fd", |
| | | "dxmodules\\zoneinfo\\right\\America\\Dawson_Creek": "91bdb9ec7c7faaa5f5fcea3d32ef5816", |
| | | "dxmodules\\zoneinfo\\right\\America\\Denver": "a04f44b808f1e82a194885aa0528e6ce", |
| | | "dxmodules\\zoneinfo\\right\\America\\Detroit": "c7e43a31c24443dcc5a10b94194d77b9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Dominica": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Edmonton": "8a4c9e63fdbeaf36632157a97751f2a6", |
| | | "dxmodules\\zoneinfo\\right\\America\\Eirunepe": "302b93102906666bd37f06475e830e5f", |
| | | "dxmodules\\zoneinfo\\right\\America\\El_Salvador": "0e5b3b1aee31e8b3764c85507d67ca05", |
| | | "dxmodules\\zoneinfo\\right\\America\\Ensenada": "4a5aba6b91f6832078382d3f52fd391d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Fortaleza": "7b3782d2bdd4ffe39f16e901227dbf52", |
| | | "dxmodules\\zoneinfo\\right\\America\\Fort_Nelson": "97edfbbc575258ef1141d09612c03f29", |
| | | "dxmodules\\zoneinfo\\right\\America\\Fort_Wayne": "aee84cbeb49b67cf69ab388c16ee8bdb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Glace_Bay": "619356a2105ad4806faf3e0e6bb55de4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Godthab": "610a757eed1026677433258d80198461", |
| | | "dxmodules\\zoneinfo\\right\\America\\Goose_Bay": "321d549f59669036366d42f88a64fbcb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Grand_Turk": "97a0ab9ba0d288e45eef032be8e2e3f2", |
| | | "dxmodules\\zoneinfo\\right\\America\\Grenada": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Guadeloupe": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Guatemala": "fcf1a91ff1bd3861f6bafee15b34bb29", |
| | | "dxmodules\\zoneinfo\\right\\America\\Guayaquil": "821825cf4a6e5d691de018004a5b6cc2", |
| | | "dxmodules\\zoneinfo\\right\\America\\Guyana": "8c4403bcd4ab8dd738cac26d695e06d9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Halifax": "cf585454a2b0677c20dac5e7da2f1220", |
| | | "dxmodules\\zoneinfo\\right\\America\\Havana": "c84c293edbe480ea115abcdf96f1c499", |
| | | "dxmodules\\zoneinfo\\right\\America\\Hermosillo": "0d7e7c94e0f93d6a3d0f7828923f71a7", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Indianapolis": "aee84cbeb49b67cf69ab388c16ee8bdb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Knox": "a4c0cd6601d2974d0d4d331285637042", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Marengo": "5d9df0d965feb22a56a929b7613c9f03", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Petersburg": "743c8227b7bd283ce0433e18d5a2f353", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Tell_City": "4ba7cc16e819553cef1801ac62588f26", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Vevay": "394e9f77e455be15e967a99801c73d63", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Vincennes": "db6628fda4b1727179f7612321616526", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Winamac": "d9776c230a2fbe0821766ab8f9eeb92d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indianapolis": "aee84cbeb49b67cf69ab388c16ee8bdb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Inuvik": "4610d997061651f8c1d87590ce6c6d48", |
| | | "dxmodules\\zoneinfo\\right\\America\\Iqaluit": "54608782aaa5eea3bc3f826c194f86da", |
| | | "dxmodules\\zoneinfo\\right\\America\\Jamaica": "bdf8b2720941180acbbd1404c63f5451", |
| | | "dxmodules\\zoneinfo\\right\\America\\Jujuy": "068eec3da9e503286b7c90c971573616", |
| | | "dxmodules\\zoneinfo\\right\\America\\Juneau": "cf88eba298e22fda671fa79332f5b433", |
| | | "dxmodules\\zoneinfo\\right\\America\\Kentucky\\Louisville": "97e994707ab30ad515214f8be3f51b54", |
| | | "dxmodules\\zoneinfo\\right\\America\\Kentucky\\Monticello": "8853e2c10605fab7539dc797b7909ab9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Knox_IN": "a4c0cd6601d2974d0d4d331285637042", |
| | | "dxmodules\\zoneinfo\\right\\America\\Kralendijk": "a3dd71a0d51b6cd76218b8d299ba7a93", |
| | | "dxmodules\\zoneinfo\\right\\America\\La_Paz": "a51b556e863e357dc307e9dd60c8c1bd", |
| | | "dxmodules\\zoneinfo\\right\\America\\Lima": "6d54c069c8dd341c783de76e7559ec9d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Los_Angeles": "24885c31a23d629863272538b997f87f", |
| | | "dxmodules\\zoneinfo\\right\\America\\Louisville": "97e994707ab30ad515214f8be3f51b54", |
| | | "dxmodules\\zoneinfo\\right\\America\\Lower_Princes": "a3dd71a0d51b6cd76218b8d299ba7a93", |
| | | "dxmodules\\zoneinfo\\right\\America\\Maceio": "6e90d06bd13956adada999198e8b03b1", |
| | | "dxmodules\\zoneinfo\\right\\America\\Managua": "78f94cdc6037f2664b8bcdc2f76beceb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Manaus": "362317d9e24808cca7dfd43119fba293", |
| | | "dxmodules\\zoneinfo\\right\\America\\Marigot": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Martinique": "08b0afa4a3679ec32bd97dd42a2d5e65", |
| | | "dxmodules\\zoneinfo\\right\\America\\Matamoros": "00b0a1fee9df01734ec34c14112254d3", |
| | | "dxmodules\\zoneinfo\\right\\America\\Mazatlan": "c366dd821b732f958ecc81707eecc297", |
| | | "dxmodules\\zoneinfo\\right\\America\\Mendoza": "b95d8152904b0fdf042c6f5167ff90ab", |
| | | "dxmodules\\zoneinfo\\right\\America\\Menominee": "312103138547f25d87854e7335909792", |
| | | "dxmodules\\zoneinfo\\right\\America\\Merida": "a55e8a1f3630c03f89edadaf4680ec25", |
| | | "dxmodules\\zoneinfo\\right\\America\\Metlakatla": "d342ef14d6184402e7b8ef06e05e7a0e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Mexico_City": "9a5c52d9e60891e2b51c17610e75d11f", |
| | | "dxmodules\\zoneinfo\\right\\America\\Miquelon": "2db4fc96974a34db4e86c2c8501400da", |
| | | "dxmodules\\zoneinfo\\right\\America\\Moncton": "fe0d305f26fb8f81d5cb95fa80d4e4bc", |
| | | "dxmodules\\zoneinfo\\right\\America\\Monterrey": "d1560b82e96ac594927f7652ca277d16", |
| | | "dxmodules\\zoneinfo\\right\\America\\Montevideo": "a7be914a9c0d90f855fd6f5555788996", |
| | | "dxmodules\\zoneinfo\\right\\America\\Montreal": "541dd79e6726de72a7b31476c8d9a8ff", |
| | | "dxmodules\\zoneinfo\\right\\America\\Montserrat": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Nassau": "73ec388017abd0e22f37d88a0b8e8a97", |
| | | "dxmodules\\zoneinfo\\right\\America\\New_York": "7b602715824f47ba6028f0075b3ea7dc", |
| | | "dxmodules\\zoneinfo\\right\\America\\Nipigon": "152d6acbfae9d604319acc2947000c9e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Nome": "ff654dddf7473e79e85d1109a433036d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Noronha": "72b7085c49fead430e7a2dd06590b224", |
| | | "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\Beulah": "7dae7b69dfbde952510327d4049133f9", |
| | | "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\Center": "3df021012c8eb85b4a732df260ca46fc", |
| | | "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\New_Salem": "d85974b0e5491f9676676010d6b8a5eb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Nuuk": "610a757eed1026677433258d80198461", |
| | | "dxmodules\\zoneinfo\\right\\America\\Ojinaga": "9c60152b7b11563719f61bb0f52e9e9e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Panama": "dbb2a11343300a2c631a6c4b7a3cafac", |
| | | "dxmodules\\zoneinfo\\right\\America\\Pangnirtung": "8409ed8281ca17daf9c87560426b7c02", |
| | | "dxmodules\\zoneinfo\\right\\America\\Paramaribo": "c3b09c0d420c43da423799e52b93f6e4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Phoenix": "5adc29642d304ff453993c2b4395505d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Port-au-Prince": "8df9214442b5652478760d8ea7af38b7", |
| | | "dxmodules\\zoneinfo\\right\\America\\Porto_Acre": "30bb03697d8aba618afd831bfc83a9a3", |
| | | "dxmodules\\zoneinfo\\right\\America\\Porto_Velho": "34a694f0e37d4fc37e9ac49e37a5de1c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Port_of_Spain": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Puerto_Rico": "f03c81ed80547f70a80a01c94dc85ab9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Punta_Arenas": "f70175b387bb3327bbec390a86d21455", |
| | | "dxmodules\\zoneinfo\\right\\America\\Rainy_River": "23dbcf1cd24e67cc24648c25eb298ba0", |
| | | "dxmodules\\zoneinfo\\right\\America\\Rankin_Inlet": "d6a6ce35fb5ca3d134fe3d7ce1b7468b", |
| | | "dxmodules\\zoneinfo\\right\\America\\Recife": "07264d0df9168584cd65dca59efdcd0b", |
| | | "dxmodules\\zoneinfo\\right\\America\\Regina": "49b33e71c4d5d99090e25929482b9820", |
| | | "dxmodules\\zoneinfo\\right\\America\\Resolute": "37e1fe49d7b779172f4193f908fa02b5", |
| | | "dxmodules\\zoneinfo\\right\\America\\Rio_Branco": "30bb03697d8aba618afd831bfc83a9a3", |
| | | "dxmodules\\zoneinfo\\right\\America\\Rosario": "790e6c0ccdc0a17b0087bb7301434648", |
| | | "dxmodules\\zoneinfo\\right\\America\\Santarem": "9baa062bb495b0f959fdfd859e262d40", |
| | | "dxmodules\\zoneinfo\\right\\America\\Santa_Isabel": "4a5aba6b91f6832078382d3f52fd391d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Santiago": "b77df3a65e22297b42228afa2929584f", |
| | | "dxmodules\\zoneinfo\\right\\America\\Santo_Domingo": "059582246c0bb5af0c12326bfcf86019", |
| | | "dxmodules\\zoneinfo\\right\\America\\Sao_Paulo": "81339e51f13782b28042f92786116ee3", |
| | | "dxmodules\\zoneinfo\\right\\America\\Scoresbysund": "e26dc30e3bfb3562a24a9267cff7c283", |
| | | "dxmodules\\zoneinfo\\right\\America\\Shiprock": "a04f44b808f1e82a194885aa0528e6ce", |
| | | "dxmodules\\zoneinfo\\right\\America\\Sitka": "c1a683fe328612597c6da3179763ee4c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Barthelemy": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Johns": "5f670ecdff8ed7f414f51b4ff0c3300c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Kitts": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Lucia": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Thomas": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Vincent": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Swift_Current": "ec2feb211b495fb642849e26cfa1fac4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Tegucigalpa": "dfd6bb815ab1c7c942efd30bd72220d4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Thule": "4b1a8f5b8395dbee7ff1977cb5500e48", |
| | | "dxmodules\\zoneinfo\\right\\America\\Thunder_Bay": "5f3b82b19c7ca9e8144b64d1e595c475", |
| | | "dxmodules\\zoneinfo\\right\\America\\Tijuana": "4a5aba6b91f6832078382d3f52fd391d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Toronto": "541dd79e6726de72a7b31476c8d9a8ff", |
| | | "dxmodules\\zoneinfo\\right\\America\\Tortola": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Vancouver": "813c4030632e8d4b89dfeea68deca975", |
| | | "dxmodules\\zoneinfo\\right\\America\\Virgin": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Whitehorse": "8751f4da107a273bcc9060790bd9460b", |
| | | "dxmodules\\zoneinfo\\right\\America\\Winnipeg": "387856cd57cd5f8898ad0e66acbbf27e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Yakutat": "729d277e238d7320e9c505e0e2f6cb7e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Yellowknife": "1ad33e12252975f4a164863f7b347834", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Casey": "3b466e0683793f6433a74e7c79b00782", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Davis": "eaf9670244da968a46f0042f98250702", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\DumontDUrville": "6e986536bd542e2209819737c97e847d", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Macquarie": "bc2f8c209b76c37bc97baafe71d49c4c", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Mawson": "7829c411c82e902894831e718e8790f1", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\McMurdo": "82b0518985a7fc92949ed0f6f26ff413", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Palmer": "8c3e3369c7685369c36fdd5eb3eaed96", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Rothera": "b0ee319a72f04eaa17795ba5e57a908b", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\South_Pole": "82b0518985a7fc92949ed0f6f26ff413", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Syowa": "1da7fe0d4a3413fc84ab4b2769090608", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Troll": "a335c40b4c451315ca42c3e54c1905d8", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Vostok": "0cafcb51dca9ed5d72d03f4aed483489", |
| | | "dxmodules\\zoneinfo\\right\\Arctic\\Longyearbyen": "e4dc442993a2b2784b8b7dbd7160eec4", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Aden": "9c257d575e96015f3fbed54d87f8bc50", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Almaty": "1810c448a8354615683abca84d527bfe", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Amman": "ee2c93bf5727fd8420f2b749d7428efb", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Anadyr": "a9cc54432e82d7032c7def8468a089d0", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Aqtau": "e2007ee6f3e74a8019391ac1f0aec4dc", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Aqtobe": "663580fb15202c6df3d9b9bf5ebf522f", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ashgabat": "4eacdff5fe2196cd19a342d8b39b0ca8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ashkhabad": "4eacdff5fe2196cd19a342d8b39b0ca8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Atyrau": "c7ff154fd4ea56ecf3bfc0b934c5cd22", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Baghdad": "bb9b7e0ac51f666dfa71ab3a1a6fca45", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Bahrain": "435d4f3daf5c15caa49fbe664a2c1684", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Baku": "1652d1e2640b9106a8fb3523ab7112ae", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Bangkok": "eaa810414de8de8a06c0eb1c700afd0a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Barnaul": "4d4df10cbd37b44eb42b9d19eb4f7c33", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Beirut": "784e4b8ee1013ead6843993b38bf7dcf", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Bishkek": "576e721428ae8b35565251b8580322fc", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Brunei": "c88f7e5336c048f58831ca0e922cb883", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Calcutta": "2e0eb1e900fb8859c72a5d9412f95dba", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Chita": "67f7e1fbed85796b3f266f642742c1aa", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Choibalsan": "f95f3247720172902bd68d5b559efbf7", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Chongqing": "06fb988f003b033771d03ba8888480b1", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Chungking": "06fb988f003b033771d03ba8888480b1", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Colombo": "0e141adc9705e2bb75c8cc2635adbd95", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Dacca": "e35ecddcb5d5139a9200291f723231a8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Damascus": "1f2c159804ad4460e814c7e4e06a1c81", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Dhaka": "e35ecddcb5d5139a9200291f723231a8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Dili": "2ff451580ef93c763ea5d159420f5d11", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Dubai": "72e2ef10fde1f8fcabbc5a21d5d9a856", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Dushanbe": "6c0f6914cb140fbd7601bb4ce5da1d50", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Famagusta": "cf108cc298788103758b0132fba32a57", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Gaza": "9d26fe2afd426828d5da3c22b5bfdd83", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Harbin": "06fb988f003b033771d03ba8888480b1", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Hebron": "06834d169792c0c58cd69baaee42e92c", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Hong_Kong": "ac812a20a17a6221694038b62ac77ff0", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Hovd": "b0fcc3ae79e32a173e4db193a76ccc0e", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ho_Chi_Minh": "7420517dd4ad95118f1e7d88e2430163", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Irkutsk": "db926d9012302148e205b89a6e449967", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Istanbul": "3f72cd0fb7e26b0dc8d7833327f035db", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Jakarta": "3c216e1d6bed7b8b4d3f5295a10f02ac", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Jayapura": "7e3faf3974a4a2f1a6172bc80c4e91df", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Jerusalem": "6fa25ac8d4a8f5e7c03de4434c5cc6b8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kabul": "0cacb17b331b880fea6a3c03a056c024", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kamchatka": "307d5eec76955cf8ae4c87b1ae514387", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Karachi": "4038cb8adc007467f1297aa72557863f", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kashgar": "5ce95bd9a706925bc86863eb692c862c", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kathmandu": "c4549d6c756ada9f9dbfce26ea69a210", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Katmandu": "c4549d6c756ada9f9dbfce26ea69a210", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Khandyga": "78c9936524b6cae7bf4335cd38e4d09b", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kolkata": "2e0eb1e900fb8859c72a5d9412f95dba", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Krasnoyarsk": "dd9dc5be8bfe0fcf767c0d1006b694c3", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kuala_Lumpur": "fce33beb3d31d52349a77dc45114937a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kuching": "f3da8074fccd8144590e2533384313cf", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kuwait": "9c257d575e96015f3fbed54d87f8bc50", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Macao": "dd42c3ea58c64c46070051f16626a0b0", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Macau": "dd42c3ea58c64c46070051f16626a0b0", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Magadan": "74537315aad0bc57f1dbbc77f838c193", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Makassar": "20db83c594a3c11f74ab275542d59aa4", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Manila": "f8c658820eb89da38eda688ddfc48606", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Muscat": "72e2ef10fde1f8fcabbc5a21d5d9a856", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Nicosia": "2f833febb7eee0222af785894a47d5a8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Novokuznetsk": "0aba150238505be93a22b0b4ddf47312", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Novosibirsk": "7040261c320043d7f3122b2604635284", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Omsk": "040c540fb238f31ea69249b753ef0ef7", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Oral": "0fda7755065f5eaa92c21eb716aa56b5", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Phnom_Penh": "eaa810414de8de8a06c0eb1c700afd0a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Pontianak": "55fb83fe4f7872c919ce934a0b70a651", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Pyongyang": "cb4953e8661526fba1d6ed8f738e895f", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Qatar": "435d4f3daf5c15caa49fbe664a2c1684", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Qostanay": "34cfcbb0d35f54e00b2784c11fabf5a2", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Qyzylorda": "d0b30771ffbee9e46794adbfe8acc33c", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Rangoon": "4ab2c8e9530b82eff44f4a64776faa99", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Riyadh": "9c257d575e96015f3fbed54d87f8bc50", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Saigon": "7420517dd4ad95118f1e7d88e2430163", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Sakhalin": "5da56bcd444fcef1275c92aabd8cb8e6", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Samarkand": "e72a66455d6dc27dce4e3f3a1a5e7177", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Seoul": "e73238fa6c85ea037bf4dcc235113fe9", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Shanghai": "06fb988f003b033771d03ba8888480b1", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Singapore": "72be432785863c8a11d83d6f3849f6a1", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Srednekolymsk": "2b062b872cebf7f3a35de885144a46a8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Taipei": "8f3da0ea2509c2fe35c6bb244f84d2e2", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tashkent": "88e80b0efe0b23c657d37e68ff5c3ecf", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tbilisi": "351bbf0c6e2e8d38f5eec8c04aa4d6d3", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tehran": "c3a0c2539fccc3d3f8081b4218c0eb20", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tel_Aviv": "6fa25ac8d4a8f5e7c03de4434c5cc6b8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Thimbu": "e18d256eca7ba79605a1fe408157624a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Thimphu": "e18d256eca7ba79605a1fe408157624a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tokyo": "e40de6c7fb9ce735aeff885394a727d2", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tomsk": "d5844b6b75a8c2bfa61c735627349854", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ujung_Pandang": "20db83c594a3c11f74ab275542d59aa4", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ulaanbaatar": "ffe40602251f6104563a95d5a6201755", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ulan_Bator": "ffe40602251f6104563a95d5a6201755", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Urumqi": "5ce95bd9a706925bc86863eb692c862c", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ust-Nera": "3052b62f431959f55e69a42da2a4367f", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Vientiane": "eaa810414de8de8a06c0eb1c700afd0a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Vladivostok": "3a665f9e10006d046da39a389e2d4de6", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Yakutsk": "909fefe03904758645a9e688099adb74", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Yangon": "4ab2c8e9530b82eff44f4a64776faa99", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Yekaterinburg": "17b849bae102efb9cb3f1761a951528a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Yerevan": "8c67b19d3e6eb4b74d85bce71832e379", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Azores": "6782096c0c0016381184311eccf7e79b", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Bermuda": "cd84da3d7c53c2facfad094b6a63a6a1", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Canary": "59557b15427f688dd2f6730c1461aa94", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Cape_Verde": "a51b284fc44efbbacabd8edf369b3937", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Faeroe": "91920c175797f2fee4628b758df58d61", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Faroe": "91920c175797f2fee4628b758df58d61", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Jan_Mayen": "e4dc442993a2b2784b8b7dbd7160eec4", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Madeira": "4259292f99911b4275ed87264edb7666", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Reykjavik": "4cbcb014d0b6e243af59821c0c384948", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\South_Georgia": "94b903dd1e41634f0a57917c82c4a86e", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Stanley": "cd95a853a4b676c8afb1b7f003d525b5", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\St_Helena": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\ACT": "cb021aa4d7a0d3d4717a896c093cd59c", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Adelaide": "3bd3b9a49709c2662be4cb2b14a61387", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Brisbane": "b63c9e16e5df9ee561be859ebfab9e4f", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Broken_Hill": "25dcfe77e4c8bc1baa8d54ac88daa98d", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Canberra": "cb021aa4d7a0d3d4717a896c093cd59c", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Currie": "1b2240d848becc1dfcbee0dbcfa17bdf", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Darwin": "abd6799885314c1d86458b5164642ac1", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Eucla": "1a12dadcc17e599cb35bde71a032dc55", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Hobart": "1b2240d848becc1dfcbee0dbcfa17bdf", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\LHI": "74cd4736a6c2c6c92bf73d1125384b5d", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Lindeman": "1ad460f55e6a27574ecb7292ecff49b3", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Lord_Howe": "74cd4736a6c2c6c92bf73d1125384b5d", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Melbourne": "110415758f3860609f5fb34978117b2f", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\North": "abd6799885314c1d86458b5164642ac1", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\NSW": "cb021aa4d7a0d3d4717a896c093cd59c", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Perth": "80cea3a163beeb09331e60663144ca34", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Queensland": "b63c9e16e5df9ee561be859ebfab9e4f", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\South": "3bd3b9a49709c2662be4cb2b14a61387", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Sydney": "cb021aa4d7a0d3d4717a896c093cd59c", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Tasmania": "1b2240d848becc1dfcbee0dbcfa17bdf", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Victoria": "110415758f3860609f5fb34978117b2f", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\West": "80cea3a163beeb09331e60663144ca34", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Yancowinna": "25dcfe77e4c8bc1baa8d54ac88daa98d", |
| | | "dxmodules\\zoneinfo\\right\\Brazil\\Acre": "30bb03697d8aba618afd831bfc83a9a3", |
| | | "dxmodules\\zoneinfo\\right\\Brazil\\DeNoronha": "72b7085c49fead430e7a2dd06590b224", |
| | | "dxmodules\\zoneinfo\\right\\Brazil\\East": "81339e51f13782b28042f92786116ee3", |
| | | "dxmodules\\zoneinfo\\right\\Brazil\\West": "362317d9e24808cca7dfd43119fba293", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Atlantic": "cf585454a2b0677c20dac5e7da2f1220", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Central": "387856cd57cd5f8898ad0e66acbbf27e", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Eastern": "541dd79e6726de72a7b31476c8d9a8ff", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Mountain": "8a4c9e63fdbeaf36632157a97751f2a6", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Newfoundland": "5f670ecdff8ed7f414f51b4ff0c3300c", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Pacific": "813c4030632e8d4b89dfeea68deca975", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Saskatchewan": "49b33e71c4d5d99090e25929482b9820", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Yukon": "8751f4da107a273bcc9060790bd9460b", |
| | | "dxmodules\\zoneinfo\\right\\CET": "326f99da17d68d4cfee53cf8d0aa7204", |
| | | "dxmodules\\zoneinfo\\right\\Chile\\Continental": "b77df3a65e22297b42228afa2929584f", |
| | | "dxmodules\\zoneinfo\\right\\Chile\\EasterIsland": "4dfc6403a5adf1616fb68203f03bf30e", |
| | | "dxmodules\\zoneinfo\\right\\CST6CDT": "169a8197b636d243e7c004a8e7fba824", |
| | | "dxmodules\\zoneinfo\\right\\Cuba": "c84c293edbe480ea115abcdf96f1c499", |
| | | "dxmodules\\zoneinfo\\right\\EET": "6816fac705bb26c7b7255b2783f0a970", |
| | | "dxmodules\\zoneinfo\\right\\Egypt": "c0216212a93d68f21decbbc1f0675104", |
| | | "dxmodules\\zoneinfo\\right\\Eire": "fa14bdeed6096bf8faebc5fedc011cdc", |
| | | "dxmodules\\zoneinfo\\right\\EST": "1888b614cef3c1a33820f2ea2b3b7b3f", |
| | | "dxmodules\\zoneinfo\\right\\EST5EDT": "dddda24b1babea1d79989f4e38faae26", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+1": "44ac89638b691ebce09448dad59e536e", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+10": "b42c0dab5f49eb25e21920c0b22f54a2", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+11": "5dcac640065e3fb5b799e2c0a6df1d2f", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+12": "4fae182c01b8355025d83b4acbfada68", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+2": "8a6d714494a35f050b117b592b40bcd8", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+3": "733b613bf354c20c0d3b3465435c9cc9", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+4": "088c840877ba64a21a9edc90ef942671", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+5": "04aefa0c42f095280b700db4d1a30d6e", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+6": "8ceb55f06163274ace7c942c0199ff90", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+7": "172c592ca91950907dd7b1924c4f3d06", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+8": "05ba396e91ef7b3445aff2aaf23ede98", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+9": "819b92c43b3741d65b3676cc0f5d33a2", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-1": "c79b1c43563ac924fe564ee658820b57", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-10": "b4a6988ab9c89ada1e5593dff9eeabf4", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-11": "5fa302adca1e4c397c7a860211e864b8", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-12": "c250ec4b2d85f3696b182af7f7dc7fb1", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-13": "d275f6c033dec2c0babfbd3ac01655f6", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-14": "ce6effbe9cc3a96f6d196aff4fb71af9", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-2": "cf76c5d0e5c517917500a34c8771ddab", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-3": "2f737a03e95cd1a3cf6a35eb25d33b0c", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-4": "5a6b49c6fdcb2144d7e0cd7388e7838c", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-5": "ab06ee74ab85a30e8adf0b69de519c82", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-6": "0510dc5e9d0b6b6ec42190d5d3ea6cdb", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-7": "f78c916860aca5b070021182c4779d18", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-8": "00b5994c24a396764b490ae18ab9a599", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-9": "936c9e724d32db15be2477ea4b408b1d", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\Greenwich": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\UCT": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\Universal": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\UTC": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\Zulu": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Amsterdam": "9c9b6e69b6805f0c4dbe28b68e8c3376", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Andorra": "8f9ed78972f8047376bbcca787297bba", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Astrakhan": "144a16fbf22ba65c2aec4a868c93f1f8", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Athens": "9cfb86a10147b0d4add4e9c81a524dc1", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Belfast": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Belgrade": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Berlin": "5d9f8ec5a71ff774a799eb7a6fbde2bb", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Bratislava": "8cca872478ba5c4443e357a3eb155afd", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Brussels": "feffc38f8d6d4951f1a5bcfe3512b54a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Bucharest": "ea1e49ce1f0883770bdd67baac18be47", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Budapest": "0ef953b4cdd6aa5fc6c05c806ef855a8", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Busingen": "1e716194b428d38f654955cc74308f66", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Chisinau": "1a8a06d7addd111a3c3a6062cb62890d", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Copenhagen": "85ff23778461ff94dc34930a683397c9", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Dublin": "fa14bdeed6096bf8faebc5fedc011cdc", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Gibraltar": "1e5adb0d08c0e55ceef8aee44c7d6d24", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Guernsey": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Helsinki": "5449e97f865215aad28e8ea273482016", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Isle_of_Man": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Istanbul": "3f72cd0fb7e26b0dc8d7833327f035db", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Jersey": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Kaliningrad": "829ea9e23f1ccfc7760bb26ba9b544d4", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Kiev": "b1849500983d6e866fe6a9559ed6799c", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Kirov": "ec7954a2d2c6b2f071d4ceefe04ef8c1", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Lisbon": "4ad34a3a04aee31ee75cbbbe2d1bd17c", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Ljubljana": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\London": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Luxembourg": "7bbbe6a6b7b9cb4bf346284de85a3309", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Madrid": "5b1ddafe484b5a19b108489dc08c18b2", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Malta": "69f5e652e0a30cfabd18421114661a61", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Mariehamn": "5449e97f865215aad28e8ea273482016", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Minsk": "aceeb3176221fa68458c66484343958b", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Monaco": "6e5200d2c0717b4a4b36ad0373581e5e", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Moscow": "1a3b8b78c50ba48197e1d2fa2f3b4b23", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Nicosia": "2f833febb7eee0222af785894a47d5a8", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Oslo": "e4dc442993a2b2784b8b7dbd7160eec4", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Paris": "303279bb72826189bcfeb2c8aa98c66f", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Podgorica": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Prague": "8cca872478ba5c4443e357a3eb155afd", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Riga": "76bf464b939efe723c1ccf72873e44e3", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Rome": "e540b9cb4bf053e9d8511725272cdf5b", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Samara": "37128ba2e90a9999239fd86519a62eb0", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\San_Marino": "e540b9cb4bf053e9d8511725272cdf5b", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Sarajevo": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Saratov": "e4f53774f2ef10a94be981221b099ac6", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Simferopol": "c8a8d124342e44f3eefc263f59a5dd48", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Skopje": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Sofia": "458a54a31208222a2c5445708bae28e0", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Stockholm": "80f1f38ebf4384271a53183343a66975", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Tallinn": "df5ddb83f7e5387846f5841f0518d0c5", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Tirane": "2b5278f6502eb243455557a3a211282a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Tiraspol": "1a8a06d7addd111a3c3a6062cb62890d", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Ulyanovsk": "cee2b943281f2225c621bf96786fd7a7", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Uzhgorod": "10025f95c80284615561b410964fb264", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Vaduz": "1e716194b428d38f654955cc74308f66", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Vatican": "e540b9cb4bf053e9d8511725272cdf5b", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Vienna": "955182f26f6aea388d4a583df74adaa7", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Vilnius": "d28049e44c7514397233af6e474430ad", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Volgograd": "f39a8e18a68ed983e5422cdd92247936", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Warsaw": "2e719e7f3a3f27ae2fe160a8a71c5adc", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Zagreb": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Zaporozhye": "5146398eb6c7013f023928bdf865dd69", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Zurich": "1e716194b428d38f654955cc74308f66", |
| | | "dxmodules\\zoneinfo\\right\\GB": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\GB-Eire": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\GMT": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\GMT+0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\GMT-0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\GMT0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Greenwich": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Hongkong": "ac812a20a17a6221694038b62ac77ff0", |
| | | "dxmodules\\zoneinfo\\right\\HST": "704400f39808fde5ab87bcca534c957d", |
| | | "dxmodules\\zoneinfo\\right\\Iceland": "4cbcb014d0b6e243af59821c0c384948", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Antananarivo": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Chagos": "a4d08c5e820b85cb1caa8ef9eb22813f", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Christmas": "f0970ef1981829970d8acbf71af3172f", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Cocos": "6c238b2fd09e4630a6df4b1b463d4c73", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Comoro": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Kerguelen": "a70e3e41f1c77f539ae8395fff564397", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Mahe": "3564352984fa37e355be931b944efee9", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Maldives": "1528d9c478ca032641e3c6a7e258f49f", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Mauritius": "8f0a9bacf3a5f672a9f012772b77b17e", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Mayotte": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Reunion": "054a3a19a8120a110f71d23ca04307ca", |
| | | "dxmodules\\zoneinfo\\right\\Iran": "c3a0c2539fccc3d3f8081b4218c0eb20", |
| | | "dxmodules\\zoneinfo\\right\\Israel": "6fa25ac8d4a8f5e7c03de4434c5cc6b8", |
| | | "dxmodules\\zoneinfo\\right\\Jamaica": "bdf8b2720941180acbbd1404c63f5451", |
| | | "dxmodules\\zoneinfo\\right\\Japan": "e40de6c7fb9ce735aeff885394a727d2", |
| | | "dxmodules\\zoneinfo\\right\\Kwajalein": "11e6875e86cf9f056be3f6dc4b5f9945", |
| | | "dxmodules\\zoneinfo\\right\\Libya": "140c8538c93832c7c7ae0e40d592dd33", |
| | | "dxmodules\\zoneinfo\\right\\MET": "553ea71b74d03c717e719edafac08447", |
| | | "dxmodules\\zoneinfo\\right\\Mexico\\BajaNorte": "4a5aba6b91f6832078382d3f52fd391d", |
| | | "dxmodules\\zoneinfo\\right\\Mexico\\BajaSur": "c366dd821b732f958ecc81707eecc297", |
| | | "dxmodules\\zoneinfo\\right\\Mexico\\General": "9a5c52d9e60891e2b51c17610e75d11f", |
| | | "dxmodules\\zoneinfo\\right\\MST": "eb8570ce4a109cb5f39ae339449435a2", |
| | | "dxmodules\\zoneinfo\\right\\MST7MDT": "0ac5e09fecc392c1825926ea3addb2dd", |
| | | "dxmodules\\zoneinfo\\right\\Navajo": "a04f44b808f1e82a194885aa0528e6ce", |
| | | "dxmodules\\zoneinfo\\right\\NZ": "82b0518985a7fc92949ed0f6f26ff413", |
| | | "dxmodules\\zoneinfo\\right\\NZ-CHAT": "037f7cdaa548a8bb0ed6f906972c87f6", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Apia": "87dd16cbe46e5afc0171dd29e0961fe9", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Auckland": "82b0518985a7fc92949ed0f6f26ff413", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Bougainville": "43d1bca50fc4b42c880e2e1d3b6745e4", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Chatham": "037f7cdaa548a8bb0ed6f906972c87f6", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Chuuk": "90ac2179ed963cbd44f031d797ab5cea", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Easter": "4dfc6403a5adf1616fb68203f03bf30e", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Efate": "18abb66b7aa9eca73e343cac55d66f24", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Enderbury": "87bf251369c2dfc68c7738e0b82d54ba", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Fakaofo": "231d2a10cf0411401a431366984e2a06", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Fiji": "9860735dadf3f3d4c9e464e595525cc8", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Funafuti": "a68d87ac4ad319e17b93f08249728242", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Galapagos": "890a615f425dbba4064293c1a946c7c2", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Gambier": "10b8f639b1500971337f57d49f6a6253", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Guadalcanal": "4d90ac24eb4f59d4c6a6bd58d779cc91", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Guam": "e2a0ac2f20ee3bb3c4324676115aff33", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Honolulu": "8388fd415f4c8a2a30a7357da5c8b7a5", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Johnston": "8388fd415f4c8a2a30a7357da5c8b7a5", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Kiritimati": "5b9795133f270e2aba9484f1f71bb049", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Kosrae": "fa011f144e058aa5184d6b53a15061f1", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Kwajalein": "11e6875e86cf9f056be3f6dc4b5f9945", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Majuro": "2a91ede5e92cb49bb3f0f387e84c8ddf", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Marquesas": "34a88ad280b7cb93e02d617121337d4b", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Midway": "77931d9a150d72054deaf73ea1af39dc", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Nauru": "49b4493e5dc16b8b96db9097b40684be", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Niue": "2cdf947862d9d3529e2a8a9e34cc3a72", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Norfolk": "c8c9b74862de9c5b6a922ceea4a518ec", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Noumea": "0511ee78de0dd4d2e5e1ad2486d4d15a", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Pago_Pago": "77931d9a150d72054deaf73ea1af39dc", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Palau": "7c8e4928f42b47884c73837fc95b91c4", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Pitcairn": "a75b2a9013f723970ceae201335f736f", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Pohnpei": "47b2894646c6d9e8773ed8720d851121", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Ponape": "47b2894646c6d9e8773ed8720d851121", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Port_Moresby": "470ebd903539f82cb2fed9ab0f960ee4", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Rarotonga": "45029b877e70bd0df13b50ab015d49fc", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Saipan": "e2a0ac2f20ee3bb3c4324676115aff33", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Samoa": "77931d9a150d72054deaf73ea1af39dc", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Tahiti": "6ea49c35b2399f4a8f36d5a5a5377bb9", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Tarawa": "d31390f2de53b92e266ba9d8e5b94398", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Tongatapu": "74dfc4d2ae719db55b2afdb6710a3d51", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Truk": "90ac2179ed963cbd44f031d797ab5cea", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Wake": "a3e7ed5df57910e74754f6236266417d", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Wallis": "4cffb736eadc485f07015943ad212f7b", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Yap": "90ac2179ed963cbd44f031d797ab5cea", |
| | | "dxmodules\\zoneinfo\\right\\Poland": "2e719e7f3a3f27ae2fe160a8a71c5adc", |
| | | "dxmodules\\zoneinfo\\right\\Portugal": "4ad34a3a04aee31ee75cbbbe2d1bd17c", |
| | | "dxmodules\\zoneinfo\\right\\PRC": "06fb988f003b033771d03ba8888480b1", |
| | | "dxmodules\\zoneinfo\\right\\PST8PDT": "78287f21c770bec0e27c5d2031b24786", |
| | | "dxmodules\\zoneinfo\\right\\ROC": "8f3da0ea2509c2fe35c6bb244f84d2e2", |
| | | "dxmodules\\zoneinfo\\right\\ROK": "e73238fa6c85ea037bf4dcc235113fe9", |
| | | "dxmodules\\zoneinfo\\right\\Singapore": "72be432785863c8a11d83d6f3849f6a1", |
| | | "dxmodules\\zoneinfo\\right\\Turkey": "3f72cd0fb7e26b0dc8d7833327f035db", |
| | | "dxmodules\\zoneinfo\\right\\UCT": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\Universal": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\US\\Alaska": "be6e5ef83221831fd57a032e03246920", |
| | | "dxmodules\\zoneinfo\\right\\US\\Aleutian": "282e70d388dfd3923238b8ca86244246", |
| | | "dxmodules\\zoneinfo\\right\\US\\Arizona": "5adc29642d304ff453993c2b4395505d", |
| | | "dxmodules\\zoneinfo\\right\\US\\Central": "9e0de2483877c5197b136801aa179825", |
| | | "dxmodules\\zoneinfo\\right\\US\\East-Indiana": "aee84cbeb49b67cf69ab388c16ee8bdb", |
| | | "dxmodules\\zoneinfo\\right\\US\\Eastern": "7b602715824f47ba6028f0075b3ea7dc", |
| | | "dxmodules\\zoneinfo\\right\\US\\Hawaii": "8388fd415f4c8a2a30a7357da5c8b7a5", |
| | | "dxmodules\\zoneinfo\\right\\US\\Indiana-Starke": "a4c0cd6601d2974d0d4d331285637042", |
| | | "dxmodules\\zoneinfo\\right\\US\\Michigan": "c7e43a31c24443dcc5a10b94194d77b9", |
| | | "dxmodules\\zoneinfo\\right\\US\\Mountain": "a04f44b808f1e82a194885aa0528e6ce", |
| | | "dxmodules\\zoneinfo\\right\\US\\Pacific": "24885c31a23d629863272538b997f87f", |
| | | "dxmodules\\zoneinfo\\right\\US\\Samoa": "77931d9a150d72054deaf73ea1af39dc", |
| | | "dxmodules\\zoneinfo\\right\\UTC": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\W-SU": "1a3b8b78c50ba48197e1d2fa2f3b4b23", |
| | | "dxmodules\\zoneinfo\\right\\WET": "17c38eb83369fc8dc351e115cd619911", |
| | | "dxmodules\\zoneinfo\\right\\Zulu": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\ROC": "2e67467e3c050e8b3a4022eb9e20300e", |
| | | "dxmodules\\zoneinfo\\ROK": "f7a6e371bd709b3c2f64ce6f67f39f29", |
| | | "dxmodules\\zoneinfo\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3", |
| | | "dxmodules\\zoneinfo\\Turkey": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\tzdata.zi": "4c99a0629d76991746913273d2467669", |
| | | "dxmodules\\zoneinfo\\UCT": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\Universal": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\US\\Alaska": "596428a3a840d568656088bd48e608f1", |
| | | "dxmodules\\zoneinfo\\US\\Aleutian": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\US\\Arizona": "c697bb02e057325a74547912f631a3a7", |
| | | "dxmodules\\zoneinfo\\US\\Central": "d0f076c9f390e7d8a933cc7cc1ad2e90", |
| | | "dxmodules\\zoneinfo\\US\\East-Indiana": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\US\\Eastern": "e4ca381035a34b7a852184cc0dd89baa", |
| | | "dxmodules\\zoneinfo\\US\\Hawaii": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\US\\Indiana-Starke": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\US\\Michigan": "ae3ba6ed8738ceda9eef109c6c586736", |
| | | "dxmodules\\zoneinfo\\US\\Mountain": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\US\\Pacific": "9323ff44ce205ce1a1bad7e2dca39939", |
| | | "dxmodules\\zoneinfo\\US\\Samoa": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\UTC": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\W-SU": "223bbf37352a9d4807919132f360535e", |
| | | "dxmodules\\zoneinfo\\WET": "92388453e62ec1a69fbf12685ad247c7", |
| | | "dxmodules\\zoneinfo\\zone.tab": "02dddc33edc3a0eeb783555dc2ce1156", |
| | | "dxmodules\\zoneinfo\\zone1970.tab": "2b7b091f4b1c41d6384b254f55654299", |
| | | "dxmodules\\zoneinfo\\Zulu": "c79354b8dbee09e62bbc3fb544853283", |
| | | "README_CN.md": "bbcb5da83f48849dbfe5388e965c2b99", |
| | | "resource\\CN\\wav\\access_f.wav": "f951f3cc1f03aaa794231413fd4efcc6", |
| | | "resource\\CN\\wav\\access_s.wav": "6d1b31bdcaaa13ba719e3223b55d5235", |
| | | "resource\\CN\\wav\\btn11.wav": "a623797305d7b0e6b8cb6b2ab3d43591", |
| | | "resource\\CN\\wav\\btn12.wav": "26bbfc3eed36211713dca9afb423e168", |
| | | "resource\\CN\\wav\\btn13.wav": "67d6fe32693cb2e7653c2ff2141ce873", |
| | | "resource\\CN\\wav\\btn21.wav": "53071472fce6128fdd2ed304e4d78406", |
| | | "resource\\CN\\wav\\btn22.wav": "e35c87d370695099d3b6d7f512496395", |
| | | "resource\\CN\\wav\\btn23.wav": "f25db5592331f1e6deb67beecb3c1131", |
| | | "resource\\CN\\wav\\btn31.wav": "054a4f36ebda08fadca3162d955560bf", |
| | | "resource\\CN\\wav\\btn32.wav": "64eb5fef123eafd7b52108ebcd6bace9", |
| | | "resource\\CN\\wav\\btn33.wav": "67d6fe32693cb2e7653c2ff2141ce873", |
| | | "resource\\CN\\wav\\calibration_s.wav": "d2ff1f1f4a40bf4166130dc079939079", |
| | | "resource\\CN\\wav\\control_f.wav": "4dbaca7e4d227a720620b846544b469a", |
| | | "resource\\CN\\wav\\door_close.wav": "325ca8082f8e9fceb2c7eeeb78d8645b", |
| | | "resource\\CN\\wav\\door_open.wav": "f3b5291fc8babaffd32107198cdd5afa", |
| | | "resource\\CN\\wav\\emergency.wav": "a1855c22f3ef2f69d5c84d3a2852ae1f", |
| | | "resource\\CN\\wav\\emergency_f.wav": "946ac86e74b849ad8f1bec3615cf9b39", |
| | | "resource\\CN\\wav\\emergency_s.wav": "a717e3417891ff306225ac075ba28082", |
| | | "resource\\CN\\wav\\failed.wav": "891194e741b0bc8f6332f78eb607cc85", |
| | | "resource\\CN\\wav\\light_close.wav": "b1ac09e91ac4ce3825614ad1654a3f58", |
| | | "resource\\CN\\wav\\light_open.wav": "16b7b6b8c6eb469645a15e4a54a3e014", |
| | | "resource\\CN\\wav\\network.wav": "7bbc6d740918a20acfb5ef75df685bdb", |
| | | "resource\\CN\\wav\\read.wav": "c83edd035dc15f7a716644319e849215", |
| | | "resource\\CN\\wav\\recg_f.wav": "5cd4d88db4e3f8332b9e73fe05222c83", |
| | | "resource\\CN\\wav\\recg_s.wav": "4afadeb018b08518d5d3dd1cfc5e0d64", |
| | | "resource\\CN\\wav\\recognition.wav": "da00dd97d1e8ca0ed20dc43eb4daafc8", |
| | | "resource\\CN\\wav\\recognition_s.wav": "df9916d6fe3d285894668e63d1aeeb1d", |
| | | "resource\\CN\\wav\\register.wav": "a91d6ebb846dc834816a954168da1352", |
| | | "resource\\CN\\wav\\stranger.wav": "2e6690d7ddcd3609ca3e6d6717b61a9c", |
| | | "resource\\CN\\wav\\user2.wav": "868a9b15aac20b62457f98c955f4e5e0", |
| | | "resource\\CN\\wav\\user2_s.wav": "98904054df059be8cd69e08c302317e7", |
| | | "resource\\CN\\wav\\verify.wav": "2bc2b96e0ca05052985fda98fb552ef9", |
| | | "resource\\CN\\wav\\verify_10x_f.wav": "bf26ce11bbd801f5efeff8c9250f219f", |
| | | "resource\\CN\\wav\\verify_10x_s.wav": "2d04b22277844d9c35e08e4e2c67c11c", |
| | | "resource\\CN\\wav\\verify_200_f.wav": "393036b5fc28a3c04580593d59e26e7e", |
| | | "resource\\CN\\wav\\verify_200_s.wav": "585267371d37f3f45e3826ec7dcafbd3", |
| | | "resource\\CN\\wav\\verify_300_f.wav": "e44977e8b6dcac8adbf304894afd24e0", |
| | | "resource\\CN\\wav\\verify_300_s.wav": "d8e23a91e4999b2d77454aab824bd611", |
| | | "resource\\CN\\wav\\verify_400_f.wav": "05752c8c9c2bf4334943999842529d8b", |
| | | "resource\\CN\\wav\\verify_400_s.wav": "740a63ffe907dda0f2d0e14cb9a83f74", |
| | | "resource\\EN\\wav\\calibration_s.wav": "b5497547d9e7e6fb5b28ee307b27752b", |
| | | "resource\\EN\\wav\\network.wav": "1e8ccfd03ca83976fefdba1edcf1b194", |
| | | "resource\\EN\\wav\\read.wav": "8c1f6ee62c7bf74db5ecab28d3988eeb", |
| | | "resource\\EN\\wav\\recg_f.wav": "e303563b867dd6eaebac18679ca760df", |
| | | "resource\\EN\\wav\\recg_s.wav": "183a843b668aa919311a6d352af80f35", |
| | | "resource\\EN\\wav\\recognition.wav": "1c9e06bc338c49c120aa101b1fac8de0", |
| | | "resource\\EN\\wav\\recognition_s.wav": "f887f2b1615121bbe815fef7f64d3b92", |
| | | "resource\\EN\\wav\\register.wav": "de5d0048f840243fdd1392c09d9ac164", |
| | | "resource\\EN\\wav\\stranger.wav": "31775350903916827fdec25b9c65dd94", |
| | | "resource\\EN\\wav\\verify.wav": "2e77ec2c754e1dea329988d4e462aa2f", |
| | | "resource\\EN\\wav\\verify_10x_f.wav": "7ccc23490436b9f1de32200230953a62", |
| | | "resource\\EN\\wav\\verify_10x_s.wav": "0630e0410fca3c7fd7e701c69e8ea4bc", |
| | | "resource\\EN\\wav\\verify_200_f.wav": "64ce473b0f560cc1613469ab94197ce6", |
| | | "resource\\EN\\wav\\verify_200_s.wav": "e3d28c408cc3bef5461620c75b15abdf", |
| | | "resource\\EN\\wav\\verify_300_f.wav": "7fa0d7bf85d040b72a89cfb9e2f06bcf", |
| | | "resource\\EN\\wav\\verify_300_s.wav": "3e69fd763477d6cc30543d838f33d718", |
| | | "resource\\EN\\wav\\verify_400_f.wav": "d074b8f6e4e968b6d1984b123ed4d387", |
| | | "resource\\EN\\wav\\verify_400_s.wav": "9141136d3310a5fac5917d3f6056249f", |
| | | "resource\\font\\AlibabaPuHuiTi-3-65-Medium.ttf": "c8015ba2be3b6bb5fd991e9435ec1f8d", |
| | | "resource\\font\\Arabic.ttf": "3f00fe80780beb16682239db77e1aa80", |
| | | "resource\\font\\Korean.ttf": "470e4a7b27f9944288feb9fa3883b4fb", |
| | | "resource\\i18n\\CN.json": "bc0fd0baf44a41fa1e1ae92b4061a792", |
| | | "resource\\i18n\\EN.json": "bc0fd0baf44a41fa1e1ae92b4061a792", |
| | | "resource\\image\\4g.png": "e5b27ed5a596cb16c7ab695d82fe3014", |
| | | "resource\\image\\4g_dark.png": "414b3a9fcefd8ea6909158b51038d4d8", |
| | | "resource\\image\\accessCtrl.png": "6be30c8f648ec7153ae2c39a15884181", |
| | | "resource\\image\\add.png": "498480ce68e4d6047eb74d3aa5229f56", |
| | | "resource\\image\\advance.png": "d98aeb99a04163bce23b6c2638cd705a", |
| | | "resource\\image\\app.png": "7640c7358a3f5dba1f887b8413b93a9d", |
| | | "resource\\image\\app_btn.png": "aa325cea46fd3918c86d76bf009b1663", |
| | | "resource\\image\\app_qrcode.png": "0a20655d02ff0e473106bf41f7c9687b", |
| | | "resource\\image\\arrow_right.png": "edc6876d6fa1e2d0be2e606c73e0f2ec", |
| | | "resource\\image\\back.png": "aa5869ff78051dbdc5f688f1805064da", |
| | | "resource\\image\\background.jpg": "90d464f4221f62132ebf74e69446b6d7", |
| | | "resource\\image\\backspace.png": "26302e37dd8618e92c3a47d68039d0ec", |
| | | "resource\\image\\back_2.png": "b3f16ab01606d85c2c70124d50b3af1b", |
| | | "resource\\image\\basic.png": "84eedd84efdc5fdb54138dd29cf6fc41", |
| | | "resource\\image\\black_btn.png": "13ee1720aff247ba3f8e22e00f89a316", |
| | | "resource\\image\\card.png": "c05047d2ad6549db001d08790cb5d9ff", |
| | | "resource\\image\\close.png": "a5353c231df804fcc4577672ab3a4302", |
| | | "resource\\image\\close_small.png": "7d6cddddc38ce8d4950789169213add4", |
| | | "resource\\image\\cloudCert.png": "4481cfb9c2d1f44f0a0dd0489cb6fc2b", |
| | | "resource\\image\\co2_f.png": "7e6f00c03b71a4dbe439491083ca731c", |
| | | "resource\\image\\co2_s.png": "4fb691286b8856f1ed25ef8bacdb6099", |
| | | "resource\\image\\commMgmt.png": "5cd157e1b8c82fdf9ddba1f6d5047b9b", |
| | | "resource\\image\\config.png": "50d2091b9f7fba5915dbed0aa0dcf918", |
| | | "resource\\image\\config_btn.png": "e54cbc27d30e7c6480b83107a631e7ef", |
| | | "resource\\image\\delete.png": "014bad6d9a94a133c58ef350e198101e", |
| | | "resource\\image\\delete_fill.png": "947fc08278354a1151d5599382c2c5f3", |
| | | "resource\\image\\deviceInfo.png": "3e40246e01c1f7eede4d76fcbba33825", |
| | | "resource\\image\\devInfo.png": "1a80aba6780a45f8775bdfdcff4df23a", |
| | | "resource\\image\\doorControl.png": "68993ef92bb8c6b2d0dab2c75cc7533d", |
| | | "resource\\image\\down.png": "c4d5c1883db4694ccedb7c1140d89da9", |
| | | "resource\\image\\emergencyOpen.png": "890877dee840dabe60487f8ce57b41f6", |
| | | "resource\\image\\empty.png": "8283ac78099d9c13ef4b552ce86f5c38", |
| | | "resource\\image\\enter.png": "787e076256c8a47e07f2091a57585fb5", |
| | | "resource\\image\\enter_b.png": "02cb6c84fec128a639e3cf0828a6ee5f", |
| | | "resource\\image\\ethernet.png": "f3abb111d96a11a56f7ed77b21abab4c", |
| | | "resource\\image\\ethernet_dark.png": "10656303a6d22e204014f55ed0fb3efb", |
| | | "resource\\image\\eth_disable.png": "7017f5cc2c9b4f802f082f6c0f5bb581", |
| | | "resource\\image\\eth_enable.png": "84d1334e524ac669c3b79e8a69b41eb1", |
| | | "resource\\image\\eye-fill.png": "9ae71914bd47423be04d0a22eb4f3995", |
| | | "resource\\image\\eye-off.png": "295c3e8255ced50cf2667ecda524e11e", |
| | | "resource\\image\\eye_fill.png": "d0ac0d07f13e02e5fae7a12a0858ec49", |
| | | "resource\\image\\eye_fill_show.png": "265cf669797b94a138982c01c29d0bd9", |
| | | "resource\\image\\face.png": "d695a5f29dbf051fc0c6e0d4e177f5c5", |
| | | "resource\\image\\faceAdd.png": "5e0e3d4eb3f034a179a8eef5c08d4c63", |
| | | "resource\\image\\faceEmpty.png": "9ef3bd1d776183e203e69d5c91e4b129", |
| | | "resource\\image\\faceError.png": "19841af9136d4483642a254ab1a6f57c", |
| | | "resource\\image\\faceRec.png": "f1bfcb61f4642c6c1bbc04856fb57905", |
| | | "resource\\image\\faceRec2.png": "580c72783b4cfc64ec0a9593e77c456a", |
| | | "resource\\image\\factoryTest.png": "4bdb36420046870efcabd4a040e31913", |
| | | "resource\\image\\failBg.png": "5d6dca3cc98032a10ef4bc0658f7e546", |
| | | "resource\\image\\grey_btn.png": "b0ca6e44c0e01a17d0bdda5f7e057cc2", |
| | | "resource\\image\\help.png": "7d75da0510ca74870858a639882dc2ef", |
| | | "resource\\image\\idleImage.jpg": "90d464f4221f62132ebf74e69446b6d7", |
| | | "resource\\image\\input_bg.png": "8a8f5c43f1118869a7679ccbaaf47de2", |
| | | "resource\\image\\light_close.png": "607b38280bb5321327cacce5bd6c3fe9", |
| | | "resource\\image\\light_open.png": "1a8df3753b6f0df9e7abb5b53dabd72e", |
| | | "resource\\image\\localUser.png": "6429f43f7fee002d66d50a3d92a087da", |
| | | "resource\\image\\lock.png": "c1419aa2a9c9da4b7dbf3529a1af37f3", |
| | | "resource\\image\\logo.png": "5768b9344bedc53096d2227bee5d52d4", |
| | | "resource\\image\\menu_btn.png": "df98739cd4804d08b23eaf33bb92e1bc", |
| | | "resource\\image\\mini_app.png": "82ee9005b5d162a6fbb0d32764088da4", |
| | | "resource\\image\\mini_background.png": "620bf06dbfffe37f717b91fb3ed8ef40", |
| | | "resource\\image\\mini_config.png": "6bf78553fb53673a89e80613cfbee4c1", |
| | | "resource\\image\\mini_password.png": "6892385a457e084953bcf9acb2ae9957", |
| | | "resource\\image\\mqtt.png": "542ebc6bdbb66ea0f25cf29aeb9d264c", |
| | | "resource\\image\\mqtt_dark.png": "d4aab5adc128846c47a3b8bb015c757b", |
| | | "resource\\image\\mqtt_enable.png": "fc766f5fcbb95eca648ee10d421cc8fe", |
| | | "resource\\image\\network.png": "0a0119e3d5fce101b28575a4e44aaf7e", |
| | | "resource\\image\\networkSetting.png": "3e83d354e8293ed112fe7cc405b94187", |
| | | "resource\\image\\network_dark.png": "3c5f8ce5732e95ad613cdd41dc5adbc0", |
| | | "resource\\image\\o2_f.png": "b787951eba880b3ae82b42594b4e30df", |
| | | "resource\\image\\o2_s.png": "50564fb865bb7f5ed0352e43ea17d853", |
| | | "resource\\image\\ph3_f.png": "e95a348c887298dc4ed0555c577ea5bb", |
| | | "resource\\image\\ph3_s.png": "96e68d741b75fcd6938a6909014cccb0", |
| | | "resource\\image\\pwd_btn.png": "8764458bee98bff728445837e126231e", |
| | | "resource\\image\\qrcode_small.png": "285bbe7e8f968c8bf4506a563dffcac2", |
| | | "resource\\image\\recordQuery.png": "d340255a0c2342382bff6f8c57f6376b", |
| | | "resource\\image\\recQuery.png": "1b8c58663a6e61f4f885e784ee4e87d4", |
| | | "resource\\image\\rectangle.png": "394e2e483120908674f6de7fb879bfcf", |
| | | "resource\\image\\register.png": "7fa975d92007703532ba8011f2a0109f", |
| | | "resource\\image\\right.png": "a6f6bc770ad7a8220effcc96e750aaaa", |
| | | "resource\\image\\select_arrow.png": "9d82daa1092375abc413d581f36aaf2d", |
| | | "resource\\image\\setting.png": "92365fd93f2cfa63c7901ce3d8900a42", |
| | | "resource\\image\\setting32.png": "e531bf8a9ce7f6cf93a8ea9baf95377c", |
| | | "resource\\image\\space.png": "de9816e31308bd7ce187fe03ab634a37", |
| | | "resource\\image\\successBg.png": "1ef294bd7e1688bba47c2337906b1d1d", |
| | | "resource\\image\\success_fill.png": "09166b0cd4da44b76b4f6cdc2c550103", |
| | | "resource\\image\\sysSettings.png": "0a84bbe887481a1cce1ca562f83d5b89", |
| | | "resource\\image\\systemSetting.png": "9aee20d073df321250a5bbc57d16d5f1", |
| | | "resource\\image\\sys_info.png": "20dc23c019d07cd2c3ce32a160b7b63f", |
| | | "resource\\image\\title_bg.png": "82fbdcc4133899d03072dcd57a92f203", |
| | | "resource\\image\\trackFace.png": "e90f92eb629563ede01aadca2b719de9", |
| | | "resource\\image\\unlock.png": "7b97b659c36d3ba4f435f44792b90a80", |
| | | "resource\\image\\user.png": "6429f43f7fee002d66d50a3d92a087da", |
| | | "resource\\image\\userGuide.png": "3227210f670f66cd6c29641e1212b0b8", |
| | | "resource\\image\\userMgmt.png": "5dad96f344513f970c2b582d7feb537d", |
| | | "resource\\image\\user_1.png": "36ab26e22dc39ea28c03f05f4ab891ce", |
| | | "resource\\image\\user_f.png": "d82d235224deccd2235ab15dbf1fda26", |
| | | "resource\\image\\user_s.png": "709953f3695cae9ac1bb50533f1a96ba", |
| | | "resource\\image\\user_w.png": "bc2ca556f37181815c0093d802f2f24f", |
| | | "resource\\image\\vf105\\4g.png": "deebc58c4b7c81d3628c6bfe3d833917", |
| | | "resource\\image\\vf105\\4g_dark.png": "5cfe44ac267d0a1dfbfb896caa5dfe42", |
| | | "resource\\image\\vf105\\accessCtrl.png": "0561dac85eb4b325fdc377c63a1d1f52", |
| | | "resource\\image\\vf105\\add.png": "5ae43bc20471a91c6891d9a7cbe1e960", |
| | | "resource\\image\\vf105\\advance.png": "cb19e041703481ec6b0936074d3ff9d0", |
| | | "resource\\image\\vf105\\app.png": "2aa76ac48dcd1e35789f4031e2c90d76", |
| | | "resource\\image\\vf105\\app_btn.png": "9e8242d16657897b531a57bad52a0b20", |
| | | "resource\\image\\vf105\\app_qrcode.png": "919faf258376df92efc42a27ba5f42ea", |
| | | "resource\\image\\vf105\\arrow_right.png": "c01c64cf2d2f257917e6b733d2dc61ee", |
| | | "resource\\image\\vf105\\back.png": "be4dce7a5996ed70af1207a1f3e1ffbf", |
| | | "resource\\image\\vf105\\background.jpg": "1327b8fbd25c1a38da1a14c6b23fd381", |
| | | "resource\\image\\vf105\\backspace.png": "4f3eebd143aa2abc2c4f058d311a108d", |
| | | "resource\\image\\vf105\\back_2.png": "1d4bd817afe4cb46769c9a478305c823", |
| | | "resource\\image\\vf105\\basic.png": "1917055452e69999d6160255283bd5fe", |
| | | "resource\\image\\vf105\\black_btn.png": "da8f9db1ef40edace91552ae2a89357a", |
| | | "resource\\image\\vf105\\card.png": "59af350406e053f432e558f8ae3787d5", |
| | | "resource\\image\\vf105\\close.png": "cc269b704bc8c998f1f0b4eaae921469", |
| | | "resource\\image\\vf105\\close_small.png": "e5e5c5a54b90cda627c6c03675cdf56b", |
| | | "resource\\image\\vf105\\cloudCert.png": "5e56e48322f2bcef31ba844c8bebc393", |
| | | "resource\\image\\vf105\\commMgmt.png": "81b9d03c23f75ad877df64de06911c44", |
| | | "resource\\image\\vf105\\config.png": "648480dea71675fbb8a838a96b861f4c", |
| | | "resource\\image\\vf105\\config_btn.png": "2a581106bd12c67da3205b613bc10122", |
| | | "resource\\image\\vf105\\delete.png": "2ad0310904b10885096fba14965244f2", |
| | | "resource\\image\\vf105\\delete_fill.png": "29d3a8d714b6a0f0bd73dd8ef5947df6", |
| | | "resource\\image\\vf105\\developer.png": "e71e5ac6071eb821e86b44a91b59c838", |
| | | "resource\\image\\vf105\\deviceInfo.png": "deb7e25ebba6ac92b86bf0e740fdba12", |
| | | "resource\\image\\vf105\\devInfo.png": "fc661d4864cae401050ffd3fb61c19ac", |
| | | "resource\\image\\vf105\\doorControl.png": "e9e1e2400a3bc2b8a566757a7e73b104", |
| | | "resource\\image\\vf105\\down.png": "4fb09683bd3472015d5ae857b902e5f8", |
| | | "resource\\image\\vf105\\empty.png": "1ace2c58eefdbb660ebda558bbf971ff", |
| | | "resource\\image\\vf105\\enter.png": "4fdefe7a74ee80fb788fe44cbae40939", |
| | | "resource\\image\\vf105\\enter_b.png": "a17ddca038c8e48961421e42dadef12c", |
| | | "resource\\image\\vf105\\ethernet.png": "bd6ff1bd4635626409ae1368ea819190", |
| | | "resource\\image\\vf105\\ethernet_dark.png": "b620fb06a520673227b24fe875bc8c04", |
| | | "resource\\image\\vf105\\eth_disable.png": "fb715be89aae2b189cef1a93796a2bbd", |
| | | "resource\\image\\vf105\\eth_enable.png": "11366418b487b814ad63be2a11fad9a3", |
| | | "resource\\image\\vf105\\eye-fill.png": "8cbf389b92610178808283930cf2c29e", |
| | | "resource\\image\\vf105\\eye-off.png": "fb636053be988b443f9d52901dd773a1", |
| | | "resource\\image\\vf105\\eye_fill.png": "4b7ef420f57d10e271c745587a9c5692", |
| | | "resource\\image\\vf105\\eye_fill_show.png": "9677930e55cbe5766a75554d527ab3f1", |
| | | "resource\\image\\vf105\\face.png": "dc94fe6a6c31259ae386b6a84f41884a", |
| | | "resource\\image\\vf105\\faceAdd.png": "2e02cea502f061c31537bff3281d8d93", |
| | | "resource\\image\\vf105\\faceEmpty.png": "4e766bd9e4150be9a1149a7c072a9787", |
| | | "resource\\image\\vf105\\faceError.png": "0be5992ee5364f99589217b1199ad7db", |
| | | "resource\\image\\vf105\\faceRec.png": "9c6573c2861d9e136ba789ad748af684", |
| | | "resource\\image\\vf105\\faceRec2.png": "62ceecccb4888209192f7000f307bb70", |
| | | "resource\\image\\vf105\\factoryTest.png": "f0324fe73098bb08a2208e44f6ef3d6d", |
| | | "resource\\image\\vf105\\failBg.png": "358ad8e1f0312efbafdb077b504c165e", |
| | | "resource\\image\\vf105\\fingerBoxF.png": "125df8fa37905599d62ff47bbbd83aaf", |
| | | "resource\\image\\vf105\\fingerBoxS.png": "db2154eb4d4bd3d83b5230c04444477e", |
| | | "resource\\image\\vf105\\fingerRe0.png": "031e35a4b855732d72e64097ec9d01f6", |
| | | "resource\\image\\vf105\\fingerRe1.png": "0056ca579917f7d4fc9da9eebf848107", |
| | | "resource\\image\\vf105\\fingerRe2.png": "5f76290d264c5be03cf87367ccff6b98", |
| | | "resource\\image\\vf105\\fingerRe3.png": "f8cd749690744cffceff1ccd2d82e3fd", |
| | | "resource\\image\\vf105\\grey_btn.png": "76a60991c1e633ddbf6fd62c9f620d25", |
| | | "resource\\image\\vf105\\help.png": "ca3028f1bea2dbb14ffb86c2e779a038", |
| | | "resource\\image\\vf105\\idleImage.jpg": "44bfe1382c2e7055a1955b924acea44a", |
| | | "resource\\image\\vf105\\idleImage.png": "3ae637d7958e135f2164f4e9577f493f", |
| | | "resource\\image\\vf105\\localUser.png": "46e92a28978bbd8da82d8eb7d3168aa4", |
| | | "resource\\image\\vf105\\lock.png": "6ce2803f6feb5dd8e1b015fd774c497d", |
| | | "resource\\image\\vf105\\menu_btn.png": "1e7fc164bce121b3f06e50af62c51e25", |
| | | "resource\\image\\vf105\\mini_app.png": "973d67e3375260e7001ae01e0cac2d38", |
| | | "resource\\image\\vf105\\mini_background.png": "f6ea6c8747055632dfc26c4dd2223549", |
| | | "resource\\image\\vf105\\mini_config.png": "0c77094b492d84314afbdd24ee57c09d", |
| | | "resource\\image\\vf105\\mini_password.png": "17481fb43930feaa36c882db1186748a", |
| | | "resource\\image\\vf105\\mqtt.png": "ee92d53c5c6982b7c0418a5ec6821f59", |
| | | "resource\\image\\vf105\\mqtt_dark.png": "a4571c52ac1208ca9de4279cafcfeea8", |
| | | "resource\\image\\vf105\\network.png": "e067a6a31b3b3f8e6cacd96cc77c5216", |
| | | "resource\\image\\vf105\\networkSetting.png": "61b2477bcb70865b7c166df7f777f416", |
| | | "resource\\image\\vf105\\network_dark.png": "d142406315dcfa2a1277f9aacf03cffa", |
| | | "resource\\image\\vf105\\pwd_btn.png": "c3fed4b5d9c6288bf1207ca5d92d619c", |
| | | "resource\\image\\vf105\\qrcode_small.png": "cc962f51b5404db51bbc2868c4d6af77", |
| | | "resource\\image\\vf105\\recordQuery.png": "7503152bdf3aafded5295fa321d93654", |
| | | "resource\\image\\vf105\\recQuery.png": "1de029b697e42affb3103ddba57382f1", |
| | | "resource\\image\\vf105\\rectangle.png": "b64428c942dfa899df37b9cf0d3f43f8", |
| | | "resource\\image\\vf105\\register.png": "f4b081b7aef4dc6d1ba1ce6e99056734", |
| | | "resource\\image\\vf105\\right.png": "cb0cbed9eb5970784965d8e89f82478f", |
| | | "resource\\image\\vf105\\select_arrow.png": "da3020499f41c8b7f6f2ea5f4336db4b", |
| | | "resource\\image\\vf105\\setting.png": "a65d388b9aab8be38c636823a63946a4", |
| | | "resource\\image\\vf105\\setting32.png": "23524292f4f233b55c9f418a5e2e25b7", |
| | | "resource\\image\\vf105\\space.png": "e86fb40094372f10671b013ce07b7eb6", |
| | | "resource\\image\\vf105\\successBg.png": "fbf2cd4b5878d02d9c3583a444d02467", |
| | | "resource\\image\\vf105\\success_fill.png": "1299222da2acb2f5209dc754cc0e3677", |
| | | "resource\\image\\vf105\\sysSettings.png": "e2f48df59e6624717dd0c6ca35ff91ca", |
| | | "resource\\image\\vf105\\systemSetting.png": "8ebd576b41be069d1db5e1919b95bd52", |
| | | "resource\\image\\vf105\\sys_info.png": "374377d37b88c5be8678dd8314f443d0", |
| | | "resource\\image\\vf105\\trackFace.png": "efc48bdabbc21e49cb3d20e4e43b63c0", |
| | | "resource\\image\\vf105\\unlock.png": "5efdc71f5f45a431e0e8b0d74faa91a2", |
| | | "resource\\image\\vf105\\user.png": "7e8ef656c544c3432f015c655421ff8f", |
| | | "resource\\image\\vf105\\userGuide.png": "cbfac61db886f390c07d2a98161ef802", |
| | | "resource\\image\\vf105\\userMgmt.png": "5cc57923cb18f394673cea498132daa2", |
| | | "resource\\image\\vf105\\vip.png": "921e0753528bf63d031b73473549db9f", |
| | | "resource\\image\\vf105\\voiceBroadcast.png": "9a0e56e9e8d878559f9dad0138c3c1d9", |
| | | "resource\\image\\vf105\\wechat.png": "bf6b8466a1a8d84d869b06efd3540d46", |
| | | "resource\\image\\vf105\\wifi.png": "fb46272231389474003cd2f5191ea353", |
| | | "resource\\image\\vf105\\wifi_dark.png": "a167e7e06f3ed5740e3336b7f8123c8b", |
| | | "resource\\image\\vf114\\4g.png": "bdd7c97e50e4b092673b29bbe88bd8b8", |
| | | "resource\\image\\vf114\\4g_dark.png": "3539b8fc025cb50b04db91d632952548", |
| | | "resource\\image\\vf114\\accessCtrl.png": "9dfb072e0137274eec201845ad555665", |
| | | "resource\\image\\vf114\\add.png": "95fdd8fc16b07b45a6ec87cd737e5071", |
| | | "resource\\image\\vf114\\advance.png": "ad39f26cd248c761944c588396617b75", |
| | | "resource\\image\\vf114\\app.png": "702301a70e1a69b8dc07ae08ee0b3c9a", |
| | | "resource\\image\\vf114\\app_btn.png": "0173d42cca268ee3162e1d4877655af4", |
| | | "resource\\image\\vf114\\app_qrcode.png": "e03e3a48337ca68e4f6639bb814a3cd4", |
| | | "resource\\image\\vf114\\arrow_right.png": "76e59179fee9109776b2d6c3178de0d0", |
| | | "resource\\image\\vf114\\back.png": "974667f9572bd57b221c95da25ae5343", |
| | | "resource\\image\\vf114\\background.jpg": "ad3dd883a8878f3cd8b6d9d9b1726c05", |
| | | "resource\\image\\vf114\\backspace.png": "63458547fb5c95ea53cf92a2204b04a9", |
| | | "resource\\image\\vf114\\back_2.png": "d166678290cae0616dcb2053294eca28", |
| | | "resource\\image\\vf114\\basic.png": "6885a5790b032eda507250b01411eda8", |
| | | "resource\\image\\vf114\\black_btn.png": "2c69fa32fd710cd0544b19a2b3630fc3", |
| | | "resource\\image\\vf114\\card.png": "a7700c9f983f73747ab519b74a9a35b1", |
| | | "resource\\image\\vf114\\close.png": "324b84b237288f7cde0b08ad12d1d577", |
| | | "resource\\image\\vf114\\close_small.png": "b88b06ecb81f18c9b70ba6c4b4052169", |
| | | "resource\\image\\vf114\\cloudCert.png": "e1f01a5bcc0e0f40afb8ad3ae8a1d77b", |
| | | "resource\\image\\vf114\\commMgmt.png": "33c350ead16aa52ec41b0e68d5a28684", |
| | | "resource\\image\\vf114\\config.png": "fd5f1336f72193f7c15698941a208509", |
| | | "resource\\image\\vf114\\config_btn.png": "8ed325539cc83b73d915e9ccda9e2e43", |
| | | "resource\\image\\vf114\\delete.png": "3cce3c9fafb55aac0402255f0631f436", |
| | | "resource\\image\\vf114\\delete_fill.png": "b08f9411e7522b9e7cafab4d40c5311e", |
| | | "resource\\image\\vf114\\developer.png": "44a015510d4b1aabfa4959afb94a433b", |
| | | "resource\\image\\vf114\\deviceInfo.png": "d4f02a866605b683f135ab7dbba549b9", |
| | | "resource\\image\\vf114\\devInfo.png": "faed670572922bda527fc8255412e548", |
| | | "resource\\image\\vf114\\doorControl.png": "7be9d2b7b3b3432176e9bb2fdaf49f5e", |
| | | "resource\\image\\vf114\\down.png": "5a6689a7adc59c87a6ed2d565875c99d", |
| | | "resource\\image\\vf114\\empty.png": "0c4645c8c569b84b22b84ef471a256fb", |
| | | "resource\\image\\vf114\\enter.png": "cfdde3f3e9127940c95ba141a3ed9b9a", |
| | | "resource\\image\\vf114\\enter_b.png": "1604cad02b5a9daa13e5d813b113ab54", |
| | | "resource\\image\\vf114\\ethernet.png": "fad299febb1021bb8c11d2b5bffe44bb", |
| | | "resource\\image\\vf114\\ethernet_dark.png": "693e0fdda1c57c85fe39231915ce3cbc", |
| | | "resource\\image\\vf114\\eth_disable.png": "6cf5c960b556abf16fea7c42687baa5b", |
| | | "resource\\image\\vf114\\eth_enable.png": "a7ff6da3b332f5fbaf0a56e77f2760d2", |
| | | "resource\\image\\vf114\\eye-fill.png": "e9fafd51f0d641f0c8adc683374d6c05", |
| | | "resource\\image\\vf114\\eye-off.png": "a501181551682e1408f723fdbe63b9de", |
| | | "resource\\image\\vf114\\eye_fill.png": "eda7423b7a833faf1b795fe592ae5aa4", |
| | | "resource\\image\\vf114\\eye_fill_show.png": "0974c798b074126a70924b61456b44ea", |
| | | "resource\\image\\vf114\\face.png": "06b7afd104e793f5352d04d34df91c05", |
| | | "resource\\image\\vf114\\faceAdd.png": "0b5ad2c4bd3e8c5fbf139495310574be", |
| | | "resource\\image\\vf114\\faceEmpty.png": "3c72971bf874c4ab54793944f65a2275", |
| | | "resource\\image\\vf114\\faceError.png": "1f53a4b110495ef1685c87776af5eedf", |
| | | "resource\\image\\vf114\\faceRec.png": "862e02eb3cf55fe786aafea089df57c4", |
| | | "resource\\image\\vf114\\faceRec2.png": "a0fee4f4e7662b1ad9f6a51f1dddc35f", |
| | | "resource\\image\\vf114\\factoryTest.png": "b8490aa1a9f613bc1cbd6b96d8214dc0", |
| | | "resource\\image\\vf114\\failBg.png": "5527c1808e8443f945cd2c72d4794d83", |
| | | "resource\\image\\vf114\\fingerBoxF.png": "125df8fa37905599d62ff47bbbd83aaf", |
| | | "resource\\image\\vf114\\fingerBoxS.png": "db2154eb4d4bd3d83b5230c04444477e", |
| | | "resource\\image\\vf114\\fingerRe0.png": "031e35a4b855732d72e64097ec9d01f6", |
| | | "resource\\image\\vf114\\fingerRe1.png": "0056ca579917f7d4fc9da9eebf848107", |
| | | "resource\\image\\vf114\\fingerRe2.png": "5f76290d264c5be03cf87367ccff6b98", |
| | | "resource\\image\\vf114\\fingerRe3.png": "f8cd749690744cffceff1ccd2d82e3fd", |
| | | "resource\\image\\vf114\\grey_btn.png": "5c9d4c08a43153dfdc1302e37f4c1634", |
| | | "resource\\image\\vf114\\help.png": "a5b6c8c6931e00bc77804e42aeae011f", |
| | | "resource\\image\\vf114\\idleImage.jpg": "ad3dd883a8878f3cd8b6d9d9b1726c05", |
| | | "resource\\image\\vf114\\idleImage.png": "67b21ca8b9dfffb56ca1461c16b55afc", |
| | | "resource\\image\\vf114\\localUser.png": "af0d5ded90865acac93e68870f910cd9", |
| | | "resource\\image\\vf114\\lock.png": "54ae7cc3b5d50ec68939bd5bc8309ef2", |
| | | "resource\\image\\vf114\\menu_btn.png": "fd5f1336f72193f7c15698941a208509", |
| | | "resource\\image\\vf114\\mini_app.png": "638cdf3c7fbd1f86c69927dde9a214fe", |
| | | "resource\\image\\vf114\\mini_background.png": "11134c0d4ac0097232618ed1a62883e4", |
| | | "resource\\image\\vf114\\mini_config.png": "69f3f7a33cf1617ec08fb8d228facb0a", |
| | | "resource\\image\\vf114\\mini_password.png": "be1e0d36d21e9f70262243e63ac11fe8", |
| | | "resource\\image\\vf114\\mqtt.png": "e1a62521c2273ec0cef41144854acea9", |
| | | "resource\\image\\vf114\\mqtt_dark.png": "51ab6bb9a073752697b1f7241f5ad6f2", |
| | | "resource\\image\\vf114\\network.png": "d0460d1844015a805a1f52d8432001f5", |
| | | "resource\\image\\vf114\\networkSetting.png": "d1e5477b9ddf2da94e637876530481dd", |
| | | "resource\\image\\vf114\\network_dark.png": "60f7b54297f927126f52302de8b4b18f", |
| | | "resource\\image\\vf114\\pwd_btn.png": "a8f19a82bfe03b629ac3e0a3964135fc", |
| | | "resource\\image\\vf114\\qrcode_small.png": "12ba5e07703c3bf32c6ef4ff7750242e", |
| | | "resource\\image\\vf114\\recordQuery.png": "a4ad2ada5f8bf9c13d5a58bf70e40cac", |
| | | "resource\\image\\vf114\\recQuery.png": "98a6a81d624137dea96dcc0e8780902f", |
| | | "resource\\image\\vf114\\rectangle.png": "9482162a7b2744f313041be02c2c7c35", |
| | | "resource\\image\\vf114\\register.png": "35b0032b10158b850ebab52c1b89fc2b", |
| | | "resource\\image\\vf114\\right.png": "55fb9deeabf97b30da9749dd51aea5ea", |
| | | "resource\\image\\vf114\\select_arrow.png": "db66347b510537a4314da045c526cb0e", |
| | | "resource\\image\\vf114\\setting.png": "ecf2ed928f51c830176a6ae4f503034c", |
| | | "resource\\image\\vf114\\setting32.png": "8412dcd0fa26cb8bb812d76d2c257e9b", |
| | | "resource\\image\\vf114\\space.png": "65eac6437c86617b7be146390b34e12a", |
| | | "resource\\image\\vf114\\successBg.png": "a3ca0ce6acf62f57e4fcf25f5a073c13", |
| | | "resource\\image\\vf114\\success_fill.png": "589b3bd7fbcf7880c5f2b23accdd36e1", |
| | | "resource\\image\\vf114\\sysSettings.png": "946f8967e9b323b34f27242f0990d137", |
| | | "resource\\image\\vf114\\systemSetting.png": "19f0225379041aec6b16e1cf5af54962", |
| | | "resource\\image\\vf114\\sys_info.png": "5725825e5d4364dc578ad47754f92270", |
| | | "resource\\image\\vf114\\trackFace.png": "1b2e2ddf116119b5d39cbc37bf5011ed", |
| | | "resource\\image\\vf114\\unlock.png": "fb4defefea714489b8ed7b7002270f38", |
| | | "resource\\image\\vf114\\user.png": "af0d5ded90865acac93e68870f910cd9", |
| | | "resource\\image\\vf114\\userGuide.png": "89831ab4360b20a5b4c99e0ea48f5ac7", |
| | | "resource\\image\\vf114\\userMgmt.png": "0e3e47b6fe33cb209bc0c350917945e2", |
| | | "resource\\image\\vf114\\vip.png": "936afbfc08e7d30831805407a3d73f24", |
| | | "resource\\image\\vf114\\voiceBroadcast.png": "eb3ed0a4728e47e3ee684637fa0862ce", |
| | | "resource\\image\\vf114\\wechat.png": "78a3125fc2c9b62d5fb83b5f9a255a4f", |
| | | "resource\\image\\vf114\\wifi.png": "f966bbd23a878842cc6927cf2232eb26", |
| | | "resource\\image\\vf114\\wifi_dark.png": "aa8fd7b0f6920c47c18e3a4c731c1279", |
| | | "resource\\image\\vf202\\4g.png": "dac9a45fe25163789ea513e2fcf76c2f", |
| | | "resource\\image\\vf202\\4g_dark.png": "0e91379860cc3f29cb10e941ea1cf445", |
| | | "resource\\image\\vf202\\accessCtrl.png": "252dfe563aa14ed13f6335c66819e88e", |
| | | "resource\\image\\vf202\\add.png": "37f570778a63000e2fe13693a837e50c", |
| | | "resource\\image\\vf202\\advance.png": "6890b0ea472a8d2534982a338bb212e6", |
| | | "resource\\image\\vf202\\app.png": "778a7f45f1c61545c444b35ac1bb636c", |
| | | "resource\\image\\vf202\\app_btn.png": "1a7beb9c843dac5bfe8cb516ae85e578", |
| | | "resource\\image\\vf202\\app_qrcode.png": "24f2dd26efc016c829afd1ad9ec10021", |
| | | "resource\\image\\vf202\\arrow_right.png": "44bd3be59aa1e6a3d55e1932ee139a41", |
| | | "resource\\image\\vf202\\back.png": "576a3ac118a18df9e5c19371b51cd0b7", |
| | | "resource\\image\\vf202\\background.jpg": "e261f9d11ba192b9a318855198a82a72", |
| | | "resource\\image\\vf202\\backspace.png": "83a1bf7837d546548d4cc224ac0b95f2", |
| | | "resource\\image\\vf202\\back_2.png": "2f4178d75fa6e2811745b790763dfd22", |
| | | "resource\\image\\vf202\\basic.png": "19f16388b948bb3c62d8177060dcd0a6", |
| | | "resource\\image\\vf202\\black_btn.png": "b15f6df11a49a205289eb2471da39ae6", |
| | | "resource\\image\\vf202\\card.png": "9f9b02e484e6621f0929289daa32ab31", |
| | | "resource\\image\\vf202\\close.png": "9d61811afdf59012d7bb482487b49edb", |
| | | "resource\\image\\vf202\\close_small.png": "9956b2ae6ed2874af7c1fc631f34a423", |
| | | "resource\\image\\vf202\\cloudCert.png": "245c00f50c46be8da93960416f47cfff", |
| | | "resource\\image\\vf202\\commMgmt.png": "58ad847a1a506b66f92adcad635e0f12", |
| | | "resource\\image\\vf202\\config.png": "5bf26f61a5105bc20c9885679754ce1c", |
| | | "resource\\image\\vf202\\config_btn.png": "8d16e5ca4e08e31e9e22422ed21d6478", |
| | | "resource\\image\\vf202\\delete.png": "46e9b381a1bc45e950f1b332ecf54940", |
| | | "resource\\image\\vf202\\delete_fill.png": "4a215805b88677ede12627c4ac9e3a17", |
| | | "resource\\image\\vf202\\developer.png": "3314b8f50d20c7939bf17806622f2180", |
| | | "resource\\image\\vf202\\deviceInfo.png": "4710af6ceceaab1cdfc0032223144a64", |
| | | "resource\\image\\vf202\\devInfo.png": "ca529fac38bf272fab9c0fa93d651ce5", |
| | | "resource\\image\\vf202\\doorControl.png": "5ba35b3c1e45572f306fcc223e2c864f", |
| | | "resource\\image\\vf202\\down.png": "2a176c857ace4437068c182e7b175619", |
| | | "resource\\image\\vf202\\empty.png": "e36fc80c084639da27bee183eeaadba0", |
| | | "resource\\image\\vf202\\enter.png": "43b728abb252831b9309bd655a6ade86", |
| | | "resource\\image\\vf202\\enter_b.png": "d15c73e1c6d60bc4e74f501c0eb00ff4", |
| | | "resource\\image\\vf202\\ethernet.png": "7a6a8557200fe9ea9405fb5701797366", |
| | | "resource\\image\\vf202\\ethernet_dark.png": "21febf0b45887830c68938fbc756a6b2", |
| | | "resource\\image\\vf202\\eth_disable.png": "46def5850282186289fedcf3e1090ec1", |
| | | "resource\\image\\vf202\\eth_enable.png": "c7e2883cdca3c31dfa5ce7b59a38dd95", |
| | | "resource\\image\\vf202\\eye-fill.png": "f759a1d079b83215b7fdf8bde65ca6a9", |
| | | "resource\\image\\vf202\\eye-off.png": "08232a8b9562ac218e5364bc1702635d", |
| | | "resource\\image\\vf202\\eye_fill.png": "d40a644a0ecf10d29a5c3255e584729e", |
| | | "resource\\image\\vf202\\eye_fill_show.png": "a9c69cb678a2face9eb5c6d74ea3e819", |
| | | "resource\\image\\vf202\\face.png": "3ace44209c5a0972f0577fea245cc1f4", |
| | | "resource\\image\\vf202\\faceAdd.png": "0d9521169bdf6134a77f0efe20a4f923", |
| | | "resource\\image\\vf202\\faceEmpty.png": "0e7656faefc150c0a978dfac8e498c8d", |
| | | "resource\\image\\vf202\\faceError.png": "5d8036a7cae3615be4dcb2087f63e626", |
| | | "resource\\image\\vf202\\faceRec.png": "103012d8e17f980f91f37a00c246eae3", |
| | | "resource\\image\\vf202\\faceRec2.png": "300f0aa222a85398f67c7e28273ef501", |
| | | "resource\\image\\vf202\\factoryTest.png": "b3e8ae285f5f45675d3fa6f61446b01a", |
| | | "resource\\image\\vf202\\failBg.png": "a1d3e65aa14f159f468ba8835639c131", |
| | | "resource\\image\\vf202\\grey_btn.png": "1646b5420adf33ad1689af68c3062402", |
| | | "resource\\image\\vf202\\help.png": "6728c869776d883015eba1fffcf90613", |
| | | "resource\\image\\vf202\\idleImage.jpg": "e261f9d11ba192b9a318855198a82a72", |
| | | "resource\\image\\vf202\\idleImage.png": "6642f66bb0278150beac1b7b9fd7cd73", |
| | | "resource\\image\\vf202\\localUser.png": "46e06778952856e8805c39139128a3aa", |
| | | "resource\\image\\vf202\\lock.png": "d845e9bb5e35713e514b40c79dd8df94", |
| | | "resource\\image\\vf202\\menu_btn.png": "5bf26f61a5105bc20c9885679754ce1c", |
| | | "resource\\image\\vf202\\mini_app.png": "1ca5b55edcdcc5a3fd63f6ca4c977648", |
| | | "resource\\image\\vf202\\mini_background.png": "f7fa498fee57c3711d6824423665d6c3", |
| | | "resource\\image\\vf202\\mini_config.png": "a0978038a399d5d12a08f8886c3925bc", |
| | | "resource\\image\\vf202\\mini_password.png": "ab932304364b69d12884d019a178fe6a", |
| | | "resource\\image\\vf202\\mqtt.png": "8ae57eb8159a7e262ff69e7f1a394d53", |
| | | "resource\\image\\vf202\\mqtt_dark.png": "825ee7221785793dc3d70d685587bf8d", |
| | | "resource\\image\\vf202\\network.png": "95f44b690704e449e8575950954e3d6f", |
| | | "resource\\image\\vf202\\networkSetting.png": "f35618eddfc8409171159bdb0c0094f9", |
| | | "resource\\image\\vf202\\network_dark.png": "6458359eb6eede7a43750a562c0c4ea2", |
| | | "resource\\image\\vf202\\pwd_btn.png": "abee92156861b29fc866e9d4b73a5c42", |
| | | "resource\\image\\vf202\\qrcode_small.png": "6d00a50369b5002f9c1e0b2f63419169", |
| | | "resource\\image\\vf202\\recordQuery.png": "a51176f07c88fc740ca262c051fc31f6", |
| | | "resource\\image\\vf202\\recQuery.png": "9667e8dff1cbd45c47fd179a390e8464", |
| | | "resource\\image\\vf202\\rectangle.png": "0ad638ea5e599eba928210127349f72f", |
| | | "resource\\image\\vf202\\register.png": "c3e3895f3eb275b924c682b12e1f4858", |
| | | "resource\\image\\vf202\\right.png": "a0cf4963f9225509668bb4f4547fe1f2", |
| | | "resource\\image\\vf202\\select_arrow.png": "f99d4833326933fc5979d1bef6ab13a3", |
| | | "resource\\image\\vf202\\setting.png": "6d936d9331f9a16106f0956d63a43d9b", |
| | | "resource\\image\\vf202\\setting32.png": "76b9637f7aece12d2ebb14684fe9a0c7", |
| | | "resource\\image\\vf202\\space.png": "bdf92f0846c70e068872a62e64198a95", |
| | | "resource\\image\\vf202\\successBg.png": "9b1cf2d0410a6c5b10802b0645d664bf", |
| | | "resource\\image\\vf202\\success_fill.png": "7d95368d99dcd7bb86d26f9c488fc51c", |
| | | "resource\\image\\vf202\\sysSettings.png": "cbd0b4362afbfb2f65df290e9fd5e0dd", |
| | | "resource\\image\\vf202\\systemSetting.png": "ebffe5062a323f123cdb3ed61d0beae3", |
| | | "resource\\image\\vf202\\sys_info.png": "9a22244032b537e10aefce4d751bf7a1", |
| | | "resource\\image\\vf202\\tip_card.png": "3d2870619abcb67b3665c28bad20f68c", |
| | | "resource\\image\\vf202\\trackFace.png": "ef2f257efcaeda212e148e7e74e88dae", |
| | | "resource\\image\\vf202\\unlock.png": "221c28aa8d6ee43ac1fecb62ef59554d", |
| | | "resource\\image\\vf202\\user.png": "46e06778952856e8805c39139128a3aa", |
| | | "resource\\image\\vf202\\userGuide.png": "e1237d22454a3b32b47382eaea2ea3f6", |
| | | "resource\\image\\vf202\\userMgmt.png": "8498f8a520f70a758c5f34f2b21d276d", |
| | | "resource\\image\\vf202\\vip.png": "f41ac8a61926ee0cc7ce66a0ffae9d4f", |
| | | "resource\\image\\vf202\\voiceBroadcast.png": "edf212a156202cbc40fb34f194a0d417", |
| | | "resource\\image\\vf202\\wechat.png": "d02d045138c3ae125888acf01ef50642", |
| | | "resource\\image\\vf202\\wifi.png": "cd0b8b70a30d25278896064e3ce20a79", |
| | | "resource\\image\\vf202\\wifi_dark.png": "520131d4f1423fb6be242a7c193d952b", |
| | | "resource\\image\\vf203\\4g.png": "e5b27ed5a596cb16c7ab695d82fe3014", |
| | | "resource\\image\\vf203\\4g_dark.png": "414b3a9fcefd8ea6909158b51038d4d8", |
| | | "resource\\image\\vf203\\accessCtrl.png": "6be30c8f648ec7153ae2c39a15884181", |
| | | "resource\\image\\vf203\\add.png": "498480ce68e4d6047eb74d3aa5229f56", |
| | | "resource\\image\\vf203\\advance.png": "d98aeb99a04163bce23b6c2638cd705a", |
| | | "resource\\image\\vf203\\app.png": "b356136ee80e638afc0bd63b5fe058c8", |
| | | "resource\\image\\vf203\\app_btn.png": "0630aeda9d5f294c1a8b4d5a4404e43d", |
| | | "resource\\image\\vf203\\app_qrcode.png": "162225bafe2c27282b0f6330b05959f6", |
| | | "resource\\image\\vf203\\arrow_right.png": "edc6876d6fa1e2d0be2e606c73e0f2ec", |
| | | "resource\\image\\vf203\\back.png": "aa5869ff78051dbdc5f688f1805064da", |
| | | "resource\\image\\vf203\\background.jpg": "75768189315c907532dda963d31b9ba0", |
| | | "resource\\image\\vf203\\backspace.png": "26302e37dd8618e92c3a47d68039d0ec", |
| | | "resource\\image\\vf203\\back_2.png": "b3f16ab01606d85c2c70124d50b3af1b", |
| | | "resource\\image\\vf203\\basic.png": "84eedd84efdc5fdb54138dd29cf6fc41", |
| | | "resource\\image\\vf203\\black_btn.png": "c66efd82b546bf991b1e231f89b71e9b", |
| | | "resource\\image\\vf203\\card.png": "c05047d2ad6549db001d08790cb5d9ff", |
| | | "resource\\image\\vf203\\close.png": "a5353c231df804fcc4577672ab3a4302", |
| | | "resource\\image\\vf203\\close_small.png": "7d6cddddc38ce8d4950789169213add4", |
| | | "resource\\image\\vf203\\cloudCert.png": "4481cfb9c2d1f44f0a0dd0489cb6fc2b", |
| | | "resource\\image\\vf203\\commMgmt.png": "5cd157e1b8c82fdf9ddba1f6d5047b9b", |
| | | "resource\\image\\vf203\\config.png": "feeed86aa53ad897dc851845f75ffc3e", |
| | | "resource\\image\\vf203\\config_btn.png": "537ce58e033cdc5c42c85c431f7a16ff", |
| | | "resource\\image\\vf203\\delete.png": "014bad6d9a94a133c58ef350e198101e", |
| | | "resource\\image\\vf203\\delete_fill.png": "947fc08278354a1151d5599382c2c5f3", |
| | | "resource\\image\\vf203\\developer.png": "07c619643647945294449fdfed486218", |
| | | "resource\\image\\vf203\\deviceInfo.png": "3e40246e01c1f7eede4d76fcbba33825", |
| | | "resource\\image\\vf203\\devInfo.png": "1a80aba6780a45f8775bdfdcff4df23a", |
| | | "resource\\image\\vf203\\doorControl.png": "68993ef92bb8c6b2d0dab2c75cc7533d", |
| | | "resource\\image\\vf203\\down.png": "c4d5c1883db4694ccedb7c1140d89da9", |
| | | "resource\\image\\vf203\\empty.png": "91882cb65ac01e63f52e63a7e8a35cbb", |
| | | "resource\\image\\vf203\\enter.png": "787e076256c8a47e07f2091a57585fb5", |
| | | "resource\\image\\vf203\\enter_b.png": "02cb6c84fec128a639e3cf0828a6ee5f", |
| | | "resource\\image\\vf203\\ethernet.png": "f3abb111d96a11a56f7ed77b21abab4c", |
| | | "resource\\image\\vf203\\ethernet_dark.png": "10656303a6d22e204014f55ed0fb3efb", |
| | | "resource\\image\\vf203\\eth_disable.png": "7017f5cc2c9b4f802f082f6c0f5bb581", |
| | | "resource\\image\\vf203\\eth_enable.png": "84d1334e524ac669c3b79e8a69b41eb1", |
| | | "resource\\image\\vf203\\eye-fill.png": "9ae71914bd47423be04d0a22eb4f3995", |
| | | "resource\\image\\vf203\\eye-off.png": "295c3e8255ced50cf2667ecda524e11e", |
| | | "resource\\image\\vf203\\eye_fill.png": "d0ac0d07f13e02e5fae7a12a0858ec49", |
| | | "resource\\image\\vf203\\eye_fill_show.png": "265cf669797b94a138982c01c29d0bd9", |
| | | "resource\\image\\vf203\\face.png": "4a3cab29dab637adc68625d143fe976d", |
| | | "resource\\image\\vf203\\faceAdd.png": "573d86de2713d8ae420bc0a20ba859a4", |
| | | "resource\\image\\vf203\\faceEmpty.png": "9ef3bd1d776183e203e69d5c91e4b129", |
| | | "resource\\image\\vf203\\faceError.png": "972e08c5d3d83a85f14d5ccd3907569a", |
| | | "resource\\image\\vf203\\faceRec.png": "f1bfcb61f4642c6c1bbc04856fb57905", |
| | | "resource\\image\\vf203\\faceRec2.png": "cdadd31ad335195cbb67e05e698f3b31", |
| | | "resource\\image\\vf203\\factoryTest.png": "4bdb36420046870efcabd4a040e31913", |
| | | "resource\\image\\vf203\\failBg.png": "b448125e6a812a5dea92f873e5157407", |
| | | "resource\\image\\vf203\\grey_btn.png": "b0ca6e44c0e01a17d0bdda5f7e057cc2", |
| | | "resource\\image\\vf203\\help.png": "7d75da0510ca74870858a639882dc2ef", |
| | | "resource\\image\\vf203\\idleImage.jpg": "75768189315c907532dda963d31b9ba0", |
| | | "resource\\image\\vf203\\idleImage.png": "4292e1d6db684081b4a94fbb59bd8388", |
| | | "resource\\image\\vf203\\localUser.png": "6429f43f7fee002d66d50a3d92a087da", |
| | | "resource\\image\\vf203\\lock.png": "c1419aa2a9c9da4b7dbf3529a1af37f3", |
| | | "resource\\image\\vf203\\menu_btn.png": "feeed86aa53ad897dc851845f75ffc3e", |
| | | "resource\\image\\vf203\\mini_app.png": "33f0225311e7a4463e9d86c6eab3efdc", |
| | | "resource\\image\\vf203\\mini_background.png": "620bf06dbfffe37f717b91fb3ed8ef40", |
| | | "resource\\image\\vf203\\mini_config.png": "1b2be1c6686f627e86dd49abb0b32a14", |
| | | "resource\\image\\vf203\\mini_password.png": "9a5013cd8f152d388a9b60e6ad2fdc12", |
| | | "resource\\image\\vf203\\mqtt.png": "542ebc6bdbb66ea0f25cf29aeb9d264c", |
| | | "resource\\image\\vf203\\mqtt_dark.png": "d4aab5adc128846c47a3b8bb015c757b", |
| | | "resource\\image\\vf203\\network.png": "0a0119e3d5fce101b28575a4e44aaf7e", |
| | | "resource\\image\\vf203\\networkSetting.png": "3e83d354e8293ed112fe7cc405b94187", |
| | | "resource\\image\\vf203\\network_dark.png": "3c5f8ce5732e95ad613cdd41dc5adbc0", |
| | | "resource\\image\\vf203\\pwd_btn.png": "c05557e93d0b23642cd506d82be8411a", |
| | | "resource\\image\\vf203\\qrcode_small.png": "285bbe7e8f968c8bf4506a563dffcac2", |
| | | "resource\\image\\vf203\\recordQuery.png": "d340255a0c2342382bff6f8c57f6376b", |
| | | "resource\\image\\vf203\\recQuery.png": "1b8c58663a6e61f4f885e784ee4e87d4", |
| | | "resource\\image\\vf203\\rectangle.png": "aad07a3c98dbc044765be57b7a95b2b9", |
| | | "resource\\image\\vf203\\register.png": "7fa975d92007703532ba8011f2a0109f", |
| | | "resource\\image\\vf203\\right.png": "a6f6bc770ad7a8220effcc96e750aaaa", |
| | | "resource\\image\\vf203\\select_arrow.png": "9d82daa1092375abc413d581f36aaf2d", |
| | | "resource\\image\\vf203\\setting.png": "92365fd93f2cfa63c7901ce3d8900a42", |
| | | "resource\\image\\vf203\\setting32.png": "e531bf8a9ce7f6cf93a8ea9baf95377c", |
| | | "resource\\image\\vf203\\space.png": "de9816e31308bd7ce187fe03ab634a37", |
| | | "resource\\image\\vf203\\successBg.png": "dcdf9bc63a89fff478bdf6a2ded56d8d", |
| | | "resource\\image\\vf203\\success_fill.png": "09166b0cd4da44b76b4f6cdc2c550103", |
| | | "resource\\image\\vf203\\sysSettings.png": "2607627249cd1c60619918793b3dd04f", |
| | | "resource\\image\\vf203\\systemSetting.png": "9aee20d073df321250a5bbc57d16d5f1", |
| | | "resource\\image\\vf203\\sys_info.png": "20dc23c019d07cd2c3ce32a160b7b63f", |
| | | "resource\\image\\vf203\\trackFace.png": "5b60294444dab3fec931a2bf80bd1ebc", |
| | | "resource\\image\\vf203\\unlock.png": "7b97b659c36d3ba4f435f44792b90a80", |
| | | "resource\\image\\vf203\\user.png": "6429f43f7fee002d66d50a3d92a087da", |
| | | "resource\\image\\vf203\\userGuide.png": "567e69e478c9470881f45bafbeb5e8de", |
| | | "resource\\image\\vf203\\userMgmt.png": "5dad96f344513f970c2b582d7feb537d", |
| | | "resource\\image\\vf203\\vip.png": "0e816b4860ee87ed1169154e3f0fc524", |
| | | "resource\\image\\vf203\\voiceBroadcast.png": "e6f1a31ba7159962d18b77deef71c106", |
| | | "resource\\image\\vf203\\wechat.png": "55eac1cc3b6398113293b7025e25c450", |
| | | "resource\\image\\vf203\\wifi.png": "fd668b648ac984ed92fad8e40e151283", |
| | | "resource\\image\\vf203\\wifi_dark.png": "37505f892ac6a43cb8dc5ea685de9740", |
| | | "resource\\image\\view_f.png": "4fbdda957ef2966bc4938990725d0246", |
| | | "resource\\image\\view_s.png": "93ddad11d282c5a8f56233682290b38c", |
| | | "resource\\image\\vip.png": "0e816b4860ee87ed1169154e3f0fc524", |
| | | "resource\\image\\voiceBroadcast.png": "e6f1a31ba7159962d18b77deef71c106", |
| | | "resource\\image\\wifi.png": "fd668b648ac984ed92fad8e40e151283", |
| | | "resource\\image\\wifi_dark.png": "37505f892ac6a43cb8dc5ea685de9740", |
| | | "resource\\langPack.js": "956b0d902f723e4817319436ee7df117", |
| | | "resource\\wav\\alarm.wav": "fe9d43cfb930f873973cc31fd6e8c132", |
| | | "resource\\wav\\AR\\calibration_1s.wav": "a5ed7bdf10f5c0bec1f964cbaf8d7c59", |
| | | "resource\\wav\\AR\\calibration_2s.wav": "1a533e06dd209b7b87d48947357a0ca0", |
| | | "resource\\wav\\AR\\calibration_s.wav": "40ecad9f2eba8373c6d9060e0e04e2ed", |
| | | "resource\\wav\\AR\\fingerF.wav": "1a8dabdb7bd80af25331217c5cb2a2f5", |
| | | "resource\\wav\\AR\\fingerInput1.wav": "a66c8d4329462cf4d69f386f9c9f9739", |
| | | "resource\\wav\\AR\\fingerInput2.wav": "2ee652221b5f1d1537b76347615d02b4", |
| | | "resource\\wav\\AR\\fingerInput3.wav": "e68e282f25963ae83451c19fe4075958", |
| | | "resource\\wav\\AR\\fingerR.wav": "564096e2700986fb5d284b550dc1849e", |
| | | "resource\\wav\\AR\\fingerS.wav": "d39c8e14ec9518a8f29df1934b4a87b8", |
| | | "resource\\wav\\AR\\fingerT.wav": "e741678c6bc7cb4a475ce16dafef4ffe", |
| | | "resource\\wav\\AR\\read.wav": "3a053015f4a30814b33dc900d7f48f33", |
| | | "resource\\wav\\AR\\recg_f.wav": "21dfe28f19a6be1c2a93f89f67d764f1", |
| | | "resource\\wav\\AR\\recg_s.wav": "44759af10d2fba0fef6675c029bfb15e", |
| | | "resource\\wav\\AR\\recognition.wav": "10b7198c357752c2f71093ece81def67", |
| | | "resource\\wav\\AR\\recognition_s.wav": "4ef357ffe8d6ead5dde8e1a1b46f174d", |
| | | "resource\\wav\\AR\\register.wav": "7a52494f55ef4ac161e24b35653bfa63", |
| | | "resource\\wav\\AR\\stranger.wav": "f5e4baa2f88c81ab03783631f64798b7", |
| | | "resource\\wav\\AR\\verify.wav": "7c8d730412feda278f5255ea2d504f41", |
| | | "resource\\wav\\AR\\verify_f.wav": "8a75cb02a71a12c27db4aeeae26ea6fa", |
| | | "resource\\wav\\AR\\verify_s.wav": "cb9c12b27047bcdcb7ac89c37a71ad9d", |
| | | "resource\\wav\\CN\\calibration_1s.wav": "95be0f4e70b3e3ed788933a6adaac48c", |
| | | "resource\\wav\\CN\\calibration_2s.wav": "dbd379708c7b4ee310ff8e5629c11e18", |
| | | "resource\\wav\\CN\\calibration_s.wav": "41fd2b04f2320aec19139c70e321795f", |
| | | "resource\\wav\\CN\\fingerF.wav": "932ad149b0290538c49f8208961e7bdb", |
| | | "resource\\wav\\CN\\fingerInput1.wav": "4bcae26fdfef53f4f9a2c0223deb56ae", |
| | | "resource\\wav\\CN\\fingerInput2.wav": "c0251f592f4c2570d1b760bde6c34b2a", |
| | | "resource\\wav\\CN\\fingerInput3.wav": "88f54eca8add2ef122583fed9df4bab0", |
| | | "resource\\wav\\CN\\fingerR.wav": "d597f3f0f968b868a896917354373922", |
| | | "resource\\wav\\CN\\fingerS.wav": "4163dbe6607e35f1d12061c5edf4f9f4", |
| | | "resource\\wav\\CN\\fingerT.wav": "428bea9dd8508f9321276eaeaa80a2ca", |
| | | "resource\\wav\\CN\\read.wav": "d0e959a98c294882ac5ddd63762b32d9", |
| | | "resource\\wav\\CN\\recg_f.wav": "9ec07057fa7deb60859ef1937f515df2", |
| | | "resource\\wav\\CN\\recg_s.wav": "c0b3486c9eb370d259a5d1b188b9d481", |
| | | "resource\\wav\\CN\\recognition.wav": "1adb5d50dd1f61d4e2e15ee859f1a838", |
| | | "resource\\wav\\CN\\recognition_s.wav": "16ea2454fa95d57c5bad0bdb6fcd5386", |
| | | "resource\\wav\\CN\\register.wav": "a811322b30389c915b3461f214958389", |
| | | "resource\\wav\\CN\\stranger.wav": "3961f3192cbbd85c356037610726d9cb", |
| | | "resource\\wav\\CN\\verify.wav": "36202c8c9f111fea718b536526098d4c", |
| | | "resource\\wav\\CN\\verify_f.wav": "f0429d7fb4a04c4c797a8b7bcbe45577", |
| | | "resource\\wav\\CN\\verify_s.wav": "cabb8f2b1cb7be25a18222e7b108f208", |
| | | "resource\\wav\\DE\\calibration_1s.wav": "52e28bd12e4376a0de8f2f8dfeeb3f8a", |
| | | "resource\\wav\\DE\\calibration_2s.wav": "121458873a5ea7999e6e859ca705a90e", |
| | | "resource\\wav\\DE\\calibration_s.wav": "5fa56f1ac0df95c5fa21d3c97283dee2", |
| | | "resource\\wav\\DE\\fingerF.wav": "c7fdcf59eaf7e2eb1f7e0983c604a7af", |
| | | "resource\\wav\\DE\\fingerInput1.wav": "9519473165bf28c615f9b68bb4613909", |
| | | "resource\\wav\\DE\\fingerInput2.wav": "b127650142eed76f25df1b2802803b47", |
| | | "resource\\wav\\DE\\fingerInput3.wav": "318e963b18d9d69e7de60e87536d7544", |
| | | "resource\\wav\\DE\\fingerR.wav": "238541066f5a5e269ec3bdfeae70ca18", |
| | | "resource\\wav\\DE\\fingerS.wav": "a616ec675a53124438592cdcaaf6bb9d", |
| | | "resource\\wav\\DE\\fingerT.wav": "9717d2422c6233b901fecba0f3b6f219", |
| | | "resource\\wav\\DE\\read.wav": "411c8189b9317faf448d1ff74e5c8029", |
| | | "resource\\wav\\DE\\recg_f.wav": "6055910c9079ddcd6ce9b94940729bcb", |
| | | "resource\\wav\\DE\\recg_s.wav": "15b60814216d9786606dec148a683227", |
| | | "resource\\wav\\DE\\recognition.wav": "0ef18cb9387fbd7ad2a2a17e4c39a4c6", |
| | | "resource\\wav\\DE\\recognition_s.wav": "d604c7898d99292bc0880611ea790876", |
| | | "resource\\wav\\DE\\register.wav": "dd310e24cfb6de7396f4c5ac1f97e9a0", |
| | | "resource\\wav\\DE\\stranger.wav": "bee4570c4eab0604302469a0b458f6ee", |
| | | "resource\\wav\\DE\\verify.wav": "345845ebd135af196e50c476eaeed831", |
| | | "resource\\wav\\DE\\verify_f.wav": "6a565e48d9369dd20ca2a29d548a4ade", |
| | | "resource\\wav\\DE\\verify_s.wav": "8ac44273c3c639b2f0a9abb14599664a", |
| | | "resource\\wav\\EN\\calibration_1s.wav": "921ee406cb5069069ba3e03d9d9b948d", |
| | | "resource\\wav\\EN\\calibration_2s.wav": "06d4447bacec83ae524d544e64b269a6", |
| | | "resource\\wav\\EN\\calibration_s.wav": "c0dcf35be40779f8925e332b3b8efc85", |
| | | "resource\\wav\\EN\\fingerF.wav": "510d14814a14e2cd331d0065423f5785", |
| | | "resource\\wav\\EN\\fingerInput1.wav": "5c41614ad862b0b4b5d4719d2031521f", |
| | | "resource\\wav\\EN\\fingerInput2.wav": "ea037a1332343280f87cfc66536a20ee", |
| | | "resource\\wav\\EN\\fingerInput3.wav": "058ab61627bc6886346d0e8de043525a", |
| | | "resource\\wav\\EN\\fingerR.wav": "11fe3281d28422191402630ea9d654f8", |
| | | "resource\\wav\\EN\\fingerS.wav": "16398aadc67ff3977262c15f83c16612", |
| | | "resource\\wav\\EN\\fingerT.wav": "72cd4670c8d86c1cab5d03706e98bd49", |
| | | "resource\\wav\\EN\\read.wav": "8d29d22febaf903ff3177f6844def6bf", |
| | | "resource\\wav\\EN\\recg_f.wav": "01ba9b3bb6216c28da18dd61e0f9488e", |
| | | "resource\\wav\\EN\\recg_s.wav": "bb83312e643dfc896395f0d64dd71c68", |
| | | "resource\\wav\\EN\\recognition.wav": "9e2d1c15eb5eb95f55864a2ddd9af4f6", |
| | | "resource\\wav\\EN\\recognition_s.wav": "6edb8d0669ba7d82bf6e14c0490cfdd3", |
| | | "resource\\wav\\EN\\register.wav": "4534ee5193306a8f75be48fdd9a42edc", |
| | | "resource\\wav\\EN\\stranger.wav": "0e902f86cb3fe443eac4b756b4c1b1c5", |
| | | "resource\\wav\\EN\\verify.wav": "e7f04238d896a0c7c2a3de8aad65beeb", |
| | | "resource\\wav\\EN\\verify_f.wav": "abf0d48629397aba9a97109f9fedd087", |
| | | "resource\\wav\\EN\\verify_s.wav": "935e88563857e8cade71bf558256842e", |
| | | "resource\\wav\\ES\\calibration_1s.wav": "7bdabdb4dbee796cc2bb7aa9b071c859", |
| | | "resource\\wav\\ES\\calibration_2s.wav": "c4262a41b7272816e49080d3616645ec", |
| | | "resource\\wav\\ES\\calibration_s.wav": "0ed429d1bcedf413d77ba5b7770068cc", |
| | | "resource\\wav\\ES\\fingerF.wav": "c4c938fea144e8def6798b1e487b7182", |
| | | "resource\\wav\\ES\\fingerInput1.wav": "7c7f92d28442dd9d3d7161ab06da56a5", |
| | | "resource\\wav\\ES\\fingerInput2.wav": "deef2ff30eddeefe95865db356e272ce", |
| | | "resource\\wav\\ES\\fingerInput3.wav": "7c7f92d28442dd9d3d7161ab06da56a5", |
| | | "resource\\wav\\ES\\fingerR.wav": "5d7bb888025f715db6683df774d3b6f9", |
| | | "resource\\wav\\ES\\fingerS.wav": "92ed0560df2d4ea38919241501011ef8", |
| | | "resource\\wav\\ES\\fingerT.wav": "d2f50e99b38d142dec28f6efc5989ed3", |
| | | "resource\\wav\\ES\\read.wav": "6c0f153f8a95fc9053f25d8cff92ea2a", |
| | | "resource\\wav\\ES\\recg_f.wav": "99536dea254832007f9b66461be00fc5", |
| | | "resource\\wav\\ES\\recg_s.wav": "3b7fe279b7d99b8f15cb8b4e12d5e06f", |
| | | "resource\\wav\\ES\\recognition.wav": "97e6ba9a65302ebed0561bed4ac7d0e1", |
| | | "resource\\wav\\ES\\recognition_s.wav": "879a7e5721996f7c49deb0f479fcec79", |
| | | "resource\\wav\\ES\\register.wav": "9e8e5c169b4417e0f070667cf6d6fd47", |
| | | "resource\\wav\\ES\\stranger.wav": "d26faf4f830cc418cdb4bcd2344c9763", |
| | | "resource\\wav\\ES\\verify.wav": "a5c501f02b699d7681537d33f913f007", |
| | | "resource\\wav\\ES\\verify_f.wav": "deef2ff30eddeefe95865db356e272ce", |
| | | "resource\\wav\\ES\\verify_s.wav": "c7d2f541fe970aec1515607ee1d71c05", |
| | | "resource\\wav\\FR\\calibration_1s.wav": "90bc4bcc25cd05d00e01bc33bc25e044", |
| | | "resource\\wav\\FR\\calibration_2s.wav": "822c2d270484e7330dcb3da58ab52479", |
| | | "resource\\wav\\FR\\calibration_s.wav": "569513acc17ea14570c33144d02d88fa", |
| | | "resource\\wav\\FR\\fingerF.wav": "2bbbf80c5343687aebfaa838bc38c381", |
| | | "resource\\wav\\FR\\fingerInput1.wav": "18db34e42be799d8ef63ecd4ee880434", |
| | | "resource\\wav\\FR\\fingerInput2.wav": "91ee1f94fdedf6797865f070346f6778", |
| | | "resource\\wav\\FR\\fingerInput3.wav": "8e2e87765ae0389566d4319a22a4826d", |
| | | "resource\\wav\\FR\\fingerR.wav": "1ecfd9d1c72a4eae2644306e0bd25aff", |
| | | "resource\\wav\\FR\\fingerS.wav": "da70743ef141747fedde637c70ce93ec", |
| | | "resource\\wav\\FR\\fingerT.wav": "4e01419987fa49b88a79a36aec7ec312", |
| | | "resource\\wav\\FR\\read.wav": "77eb8c0ffe8b1e278bdb59f5f22c386f", |
| | | "resource\\wav\\FR\\recg_f.wav": "a4e0c3cf167fa4db3e5eacf08ab0e287", |
| | | "resource\\wav\\FR\\recg_s.wav": "56a17208c5af5f9cd82d0c4762c12c54", |
| | | "resource\\wav\\FR\\recognition.wav": "d7961442cd6d0a233227be08df97014c", |
| | | "resource\\wav\\FR\\recognition_s.wav": "6f41689362369dd66a5d91dae1df11a9", |
| | | "resource\\wav\\FR\\register.wav": "64a3b9782abffd3264e0a42a59aed4c2", |
| | | "resource\\wav\\FR\\stranger.wav": "c5bdaee5595fd3f2fb7b43b64854965c", |
| | | "resource\\wav\\FR\\verify.wav": "98f91f55b0e363a4ff5147a38ec7a142", |
| | | "resource\\wav\\FR\\verify_f.wav": "2dd839c1fce3797a94488fd04b0a6b6d", |
| | | "resource\\wav\\FR\\verify_s.wav": "670eac29b52aa9648c04ec00a4bdc53a", |
| | | "resource\\wav\\KO\\.DS_Store": "194577a7e20bdcc7afbb718f502c134c", |
| | | "resource\\wav\\KO\\calibration_1s.wav": "7402d18dab54f254b7fc632fa39fd975", |
| | | "resource\\wav\\KO\\calibration_2s.wav": "ea767fb11a3ea7c5e4979645ea1b290f", |
| | | "resource\\wav\\KO\\calibration_s.wav": "376e3a44b29864d1ced354796e1780d2", |
| | | "resource\\wav\\KO\\fingerF.wav": "d22570bfe2b6f7da61db3814347da015", |
| | | "resource\\wav\\KO\\fingerInput1.wav": "a0f3beaaf7da75825ebf96e3e63ff6a2", |
| | | "resource\\wav\\KO\\fingerInput2.wav": "0e1f0069f6bea232d0b808bf68220a5f", |
| | | "resource\\wav\\KO\\fingerInput3.wav": "af87f04def1fbe6fa2202a1c476ac38a", |
| | | "resource\\wav\\KO\\fingerR.wav": "a2270f58b171bc065bd26a43df22ab19", |
| | | "resource\\wav\\KO\\fingerS.wav": "4351453d76fd352be3771a425d13bbb8", |
| | | "resource\\wav\\KO\\fingerT.wav": "6ebeba178719d5e0f50d3b09f047f383", |
| | | "resource\\wav\\KO\\read.wav": "b6bc10805b392d0310a79eea741e3b3f", |
| | | "resource\\wav\\KO\\recg_f.wav": "681345dd730860770e22689191f1d96a", |
| | | "resource\\wav\\KO\\recg_s.wav": "88b56cc7c059666edbdb0ce81b8c3c04", |
| | | "resource\\wav\\KO\\recognition.wav": "9454b2d82ad2d3513dafb355edc025f2", |
| | | "resource\\wav\\KO\\recognition_s.wav": "9398a4b31d5d2d1e3b10f04620a30dae", |
| | | "resource\\wav\\KO\\register.wav": "58cb13509719da302a3d431a59a68f5c", |
| | | "resource\\wav\\KO\\stranger.wav": "523d5eae87864b41350bf39829c53e76", |
| | | "resource\\wav\\KO\\verify.wav": "68c67283487bed689fb7d8567d5485e3", |
| | | "resource\\wav\\KO\\verify_f.wav": "e3de3c0fa0cfe2484e4b38c8269920cc", |
| | | "resource\\wav\\KO\\verify_s.wav": "8f6c8a4ecebd44941260a08ad3a4dd72", |
| | | "resource\\wav\\PT\\calibration_1s.wav": "da58062f0e45ebd7bbecb126b2d453ce", |
| | | "resource\\wav\\PT\\calibration_2s.wav": "5a92af498230aa4ba882fee5857cc73f", |
| | | "resource\\wav\\PT\\calibration_s.wav": "b926e31a78516b46d1dcf7a1f62c6cf8", |
| | | "resource\\wav\\PT\\fingerF.wav": "9d6f7c11fd9393547cb1feb72b8f06a7", |
| | | "resource\\wav\\PT\\fingerInput1.wav": "b2d2e38d58c4b86f4b2537647aabe446", |
| | | "resource\\wav\\PT\\fingerInput2.wav": "75f1d97cd779f2cb890efda812254dd3", |
| | | "resource\\wav\\PT\\fingerInput3.wav": "d446e2f562b509d806f1b8862d1d9b55", |
| | | "resource\\wav\\PT\\fingerR.wav": "f1786c3dc3a0683aeef6d26062f12ed1", |
| | | "resource\\wav\\PT\\fingerS.wav": "6c6ad480079a51836c06cbcad0306289", |
| | | "resource\\wav\\PT\\fingerT.wav": "15b6fc875a46ef3a81facda5b225510a", |
| | | "resource\\wav\\PT\\read.wav": "dd63196f7cb81caf949d1c46db597e9e", |
| | | "resource\\wav\\PT\\recg_f.wav": "92746b018b29bcfd7cb2caf841d32025", |
| | | "resource\\wav\\PT\\recg_s.wav": "0244bd357d573aabae6e3143e4093b52", |
| | | "resource\\wav\\PT\\recognition.wav": "02887b41858dd3ad6872ef666cda6b21", |
| | | "resource\\wav\\PT\\recognition_s.wav": "de2f118f324fb6754442233cc7bd9163", |
| | | "resource\\wav\\PT\\register.wav": "a821a9a578db5bc0a21c9d508f05154a", |
| | | "resource\\wav\\PT\\stranger.wav": "0d94a14857ddbbb9ec2f49da4308ce3e", |
| | | "resource\\wav\\PT\\verify.wav": "5d30cc1dfb9f198e3e35b969728e3370", |
| | | "resource\\wav\\PT\\verify_f.wav": "eb745523f398a46a6bb6e7bd61ae0fbb", |
| | | "resource\\wav\\PT\\verify_s.wav": "cce663087a3a629b6e57f1e70f8d7965", |
| | | "resource\\wav\\RU\\calibration_1s.wav": "345845ebd135af196e50c476eaeed831", |
| | | "resource\\wav\\RU\\calibration_2s.wav": "70e991ab0ac7b41f3307beda62326154", |
| | | "resource\\wav\\RU\\calibration_s.wav": "00b75e1fcffec26c49b5b7c7a24f4c43", |
| | | "resource\\wav\\RU\\fingerF.wav": "0b73f3a06b522b76ec6ef7ee76395813", |
| | | "resource\\wav\\RU\\fingerInput1.wav": "077b12f4ddabc15ecfad1e5d8802414b", |
| | | "resource\\wav\\RU\\fingerInput2.wav": "1da2108ea08bbc05af7a785ef58fd664", |
| | | "resource\\wav\\RU\\fingerInput3.wav": "7ba5db75cb9542f03eda5095d7a23572", |
| | | "resource\\wav\\RU\\fingerR.wav": "9758966564082624bce1d39433ed3f7a", |
| | | "resource\\wav\\RU\\fingerS.wav": "f1146d690c62e8a8b890fe88f443f082", |
| | | "resource\\wav\\RU\\fingerT.wav": "1a61470775f82c3d11868d260fe89a24", |
| | | "resource\\wav\\RU\\read.wav": "73f492713c7b86645be69f31d1a20ed3", |
| | | "resource\\wav\\RU\\recg_f.wav": "1e16e083ba2b7ed7bd21939c7999346a", |
| | | "resource\\wav\\RU\\recg_s.wav": "7f279071d927beb26abe377ac82a8287", |
| | | "resource\\wav\\RU\\recognition.wav": "8ad03ac16ae29e541aa75a8c73fe89c3", |
| | | "resource\\wav\\RU\\recognition_s.wav": "f7ea28dab9f7b655cb12e82611432619", |
| | | "resource\\wav\\RU\\register.wav": "61ad2813fd80f3e96f919df598660260", |
| | | "resource\\wav\\RU\\stranger.wav": "b2cc134c9efa67d19b614fa79a1f9d08", |
| | | "resource\\wav\\RU\\verify.wav": "7065f2418c31d521d57ca1a257227036", |
| | | "resource\\wav\\RU\\verify_f.wav": "1da2108ea08bbc05af7a785ef58fd664", |
| | | "resource\\wav\\RU\\verify_s.wav": "5f327d4e695ffec7c3d372a35b7c2c6d", |
| | | "resource\\wav\\success.wav": "1e9b06bd363e891ad7ed19c74edcd2ce", |
| | | "resource\\wav\\tamper.wav": "5be9a5cebd6bb26b6b3020b461600fde", |
| | | "resource\\web\\config.js": "3d7861b269daebe064e3173ad305ae23", |
| | | "resource\\web\\css\\app.7043d6da.css": "999a87106e2755763dd81279b6025992", |
| | | "resource\\web\\css\\chunk-vendors.6b92dc4c.css": "e1ec7b3d258707dfa59963f29e6f8e75", |
| | | "resource\\web\\favicon.ico": "1ba2ae710d927f13d483fd5d1e548c9b", |
| | | "resource\\web\\fonts\\element-icons.535877f5.woff": "535877f50039c0cb49a6196a5b7517cd", |
| | | "resource\\web\\fonts\\element-icons.732389de.ttf": "732389ded34cb9c52dd88271f1345af9", |
| | | "resource\\web\\img\\bg.a32161db.png": "a32161dbd9d76983f1abc8e6de118629", |
| | | "resource\\web\\img\\iconfont.675b1cb4.svg": "675b1cb40e0ad004e651cbf410d8c9b9", |
| | | "resource\\web\\index.css": "00f3e0e219f286a00a28b72e0f398238", |
| | | "resource\\web\\index.html": "1edc8246781c3c3bc7f200446d94817c", |
| | | "resource\\web\\js\\app.da6752e9.js": "fce7a868ce64badaf7742f7cfe6bd6b8", |
| | | "resource\\web\\js\\app.da6752e9.js.map": "10ba9093ac4c8ad8f829906bf188230c", |
| | | "resource\\web\\js\\chunk-vendors.303b1624.js": "3f495d9202748c1e070016b1af602295", |
| | | "resource\\web\\js\\chunk-vendors.303b1624.js.map": "1b58852183ab5b6ba073c10171483108", |
| | | "src\\common\\consts\\configConst.js": "54c90a4a5470745f5505b6b283ab8746", |
| | | "src\\common\\utils\\codeUtils.js": "749f60e6b75b7dfa7be62b4ed9c873b5", |
| | | "src\\common\\utils\\netUtils.js": "34da771eb84bbb2d0f7085a1af85d132", |
| | | "src\\common\\utils\\stringUtils.js": "425d9cd0390ab8a60f1507544c2cb00a", |
| | | "src\\common\\utils\\tokenUtil.js": "b7abd3698644aadb7d3e936fb6f7fc8b", |
| | | "src\\common\\utils\\utils.js": "bbee074a060e962a570dddc4d586504d", |
| | | "src\\config.json": "6619f6367ac0230030de3131160a2178", |
| | | "src\\controller.js": "3ca7b098eaf218df5e911fea64113d11", |
| | | "src\\driver.js": "94ef548d913eb6ba832e87e1748f2bc2", |
| | | "src\\main.js": "e5958b02098ba5d92c159970c2e9bd63", |
| | | "src\\screen.js": "b8a256f4f3ba51b4c1e49fcb69e06b28", |
| | | "src\\service\\accessService.js": "304718a9a06ded28947373c3d9a21295", |
| | | "src\\service\\api.js": "def5b52441ccc827913a73478cc7c32a", |
| | | "src\\service\\codeService.js": "e3f53b983c37a91d85a3de95fab7745d", |
| | | "src\\service\\configService.js": "d1c3c533c1d451c2eaf46758b4efeb19", |
| | | "src\\service\\faceService.js": "cfc3cf7d510f2ba6d6fcedb1251e0795", |
| | | "src\\service\\fingerService.js": "0fee47e46ded411c2da21eb508d8f9ba", |
| | | "src\\service\\gpiokeyService.js": "7aeb81b1577df935f147f3817a0a144b", |
| | | "src\\service\\grainService.js": "3ec28482d55059fd09d091145fad041c", |
| | | "src\\service\\httpService.js": "567d6f52d5392e3d95a54264e631944e", |
| | | "src\\service\\mqttService.js": "eafd4b82b1d5a7d02b32d046bf492ac9", |
| | | "src\\service\\nfcService.js": "fff19d7f08d3a499455ed93a5376c0fd", |
| | | "src\\service\\sqliteService.js": "9dd93a7afd36b50e6be015e950aaff83", |
| | | "src\\service\\uartBleService.js": "f8816894598283c7114b4d8708bb65aa", |
| | | "src\\service\\uartCodeService.js": "ed1952645c055885c78bc6c02699906f", |
| | | "src\\service\\weComService.js": "14896c15403107f7225fce6db9b8a049", |
| | | "src\\services.js": "426d898a09de0fcc61d6fc644052b51e", |
| | | "src\\view\\appView.js": "6bab5f16cbafe492d277948b144529ba", |
| | | "src\\view\\config\\configView.js": "9f89bd5efb5060c2dea799e684c8a460", |
| | | "src\\view\\config\\identityVerificationView.js": "6f4eece1b8021b0beb7ff9ac4315efff", |
| | | "src\\view\\config\\menu\\cloudCertView.js": "089fda3f32cc72c07ffc1f76fa98ac06", |
| | | "src\\view\\config\\menu\\developer\\capcalView.js": "eb3a2b6b8f4546b71471ae06fbf32741", |
| | | "src\\view\\config\\menu\\developerView.js": "a6ae2941432970908f887bd20807f1ff", |
| | | "src\\view\\config\\menu\\deviceInfo\\dataCapacityInfoView.js": "81fbf258e0ba70c126f850658981469e", |
| | | "src\\view\\config\\menu\\deviceInfo\\systemInfoView.js": "95a96c6d8586410be1fe085dfa61db9f", |
| | | "src\\view\\config\\menu\\deviceInfoView.js": "b703a2f9053c1b089294b3dffdf6a449", |
| | | "src\\view\\config\\menu\\doorControlView.js": "2b29eff26537ab92171a40110b8e8c0e", |
| | | "src\\view\\config\\menu\\helpView.js": "b3cf2078efe3a274740276b550b68b63", |
| | | "src\\view\\config\\menu\\localUser\\faceEnterView.js": "f6dc4e020a4eddba902820d4b2444ee3", |
| | | "src\\view\\config\\menu\\localUser\\fingerApplyView.js": "b2b5a46109f7ac768ae6d18131a33fbe", |
| | | "src\\view\\config\\menu\\localUser\\fingerEnterView.js": "46dd45fe0e8d06410a5f2bcbeb7be5ad", |
| | | "src\\view\\config\\menu\\localUser\\localUserAddView.js": "8266626bf9cadde968e2b439ef9073b0", |
| | | "src\\view\\config\\menu\\localUserView.js": "f7881e4a47fe06648d0934f286d59775", |
| | | "src\\view\\config\\menu\\networkSettingView.js": "7cb7b7ef6c1d49f819f509de43e49a56", |
| | | "src\\view\\config\\menu\\recordQuery\\recordQueryDetailView.js": "79e15d726de5146bab15a3dba533a82b", |
| | | "src\\view\\config\\menu\\recordQueryView.js": "f640c2f2d560213c44633d7ea36c6960", |
| | | "src\\view\\config\\menu\\systemSetting\\displaySettingView.js": "1a376eaccd07b12bd80773be83e080fc", |
| | | "src\\view\\config\\menu\\systemSetting\\faceRecognitionSettingView.js": "8ac866907bd817d51cde8d757e33b852", |
| | | "src\\view\\config\\menu\\systemSetting\\passLogSettingView.js": "b3fb57b54b5079075c331aceab74a052", |
| | | "src\\view\\config\\menu\\systemSetting\\passwordManagementView.js": "720e32768be124d5591cc0914c9ba340", |
| | | "src\\view\\config\\menu\\systemSetting\\passwordOpenDoorSettingView.js": "a56728c84d37129fbae06c3a23b01092", |
| | | "src\\view\\config\\menu\\systemSetting\\swipeCardRecognitionSettingView.js": "d23ab8015ac4dc7f316fc7ca4b852f6f", |
| | | "src\\view\\config\\menu\\systemSetting\\timeSettingView.js": "7c5744868ad7e40b3d9ce0708e3f7b85", |
| | | "src\\view\\config\\menu\\systemSettingView.js": "91aa4b58c5da0ba01e7a56ee348fee11", |
| | | "src\\view\\config\\menu\\voiceBroadcastView.js": "b985213b271e8e8019d3a5697f2a402c", |
| | | "src\\view\\config\\newPwdView.js": "9313a7399dcab5eff76b26dad4dbab99", |
| | | "src\\view\\emergencyPwdView.js": "db0fc9252e9e897fce33dbe3314963d0", |
| | | "src\\view\\gasDetailView.js": "e7f705f9b89459726064e51d57ed9d7c", |
| | | "src\\view\\i18n.js": "94f43798d35026189125bf2534d1bffd", |
| | | "src\\view\\idleView.js": "a1a6f9fb0ec44c59330a7461298aec46", |
| | | "src\\view\\mainView.js": "0c49e5905a87a5cfd33062df8531e421", |
| | | "src\\view\\pinyin\\dict.js": "a7812c30b956099fd248271ad6fd5ac9", |
| | | "src\\view\\pinyin\\pinyin.js": "84e7c2ac116f5c22cf07b563ba230c68", |
| | | "src\\view\\pwdView.js": "e46813353af5b4cd9f9b776328aa1987", |
| | | "src\\view\\topView.js": "de69270ae02a9893902b453f184eb070", |
| | | "src\\view\\viewUtils.js": "3d99a33880bd45247740e528f3bc8610", |
| | | "src\\view\\wechatBindView.js": "6d0239d71de3c1cf4c2e0817cd65ce3f", |
| | | "src\\view\\wechatFaceView.js": "65f5edfbe0ef402c66bd62bd3eebec49", |
| | | "src\\view\\wechatNetView.js": "84d8dd397ed6483a25ab99174e652362", |
| | | "src\\worker\\mqttWorker.js": "2dda93d129f1edd9f8a52aceddb0079d", |
| | | "src\\worker\\netWorker.js": "e38b00c21c77dc5b98425f12068f85ff", |
| | | "src\\worker\\passRecordWorker.js": "ad27fa58b7de2b8155bb3517e601bef4", |
| | | "src\\worker\\screenWorker.js": "57a6f54f05c57e186e44892c97e36647" |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "app.dxproj": "0029df84b57cdffbbc22d546e0e41eed", |
| | | "dxmodules\\crypto-es\\aes.js": "f5051ae3e240e86f1462fa124c91e34d", |
| | | "dxmodules\\crypto-es\\blowfish.js": "a6a17efb551cdd4dea32a0248c7301eb", |
| | | "dxmodules\\crypto-es\\cipher-core.js": "e7c981251689145cfd8e1cd8fc706530", |
| | | "dxmodules\\crypto-es\\core.js": "aff6ed577b1afec6b04d68e7dce1d71a", |
| | | "dxmodules\\crypto-es\\enc-base64.js": "017d46c5dad13cade58c2cac1d6f5edf", |
| | | "dxmodules\\crypto-es\\enc-base64url.js": "02a7c1b1bfa56f15696ad4cade9efcac", |
| | | "dxmodules\\crypto-es\\enc-utf16.js": "6175f56d0133cb3c253fc33d37943496", |
| | | "dxmodules\\crypto-es\\evpkdf.js": "b3dd824edce293775623ec11d698934c", |
| | | "dxmodules\\crypto-es\\format-hex.js": "192580e6589e2f9e5e6d2421ef970228", |
| | | "dxmodules\\crypto-es\\hmac.js": "b3e954bba3c4d3758c556eabb9f07a4f", |
| | | "dxmodules\\crypto-es\\index.js": "1ab9991ea80626fc1f48b8d20d91146a", |
| | | "dxmodules\\crypto-es\\md5.js": "22b9bf748f4874efced6f24843d9717d", |
| | | "dxmodules\\crypto-es\\mode-cfb.js": "dc945b79189a16a04fb8809cb1ac63ae", |
| | | "dxmodules\\crypto-es\\mode-ctr-gladman.js": "985134d79f545e9090b832dd8790bdcb", |
| | | "dxmodules\\crypto-es\\mode-ctr.js": "8aaf3891ab740c008923c8f6a1a404cc", |
| | | "dxmodules\\crypto-es\\mode-ecb.js": "0c6483c6b907719823c2a20168555654", |
| | | "dxmodules\\crypto-es\\mode-ofb.js": "60db86b4aa9f698949093c6c234b9584", |
| | | "dxmodules\\crypto-es\\pad-ansix923.js": "eafdac5e3d4c90c273f1c34ee39f5f95", |
| | | "dxmodules\\crypto-es\\pad-iso10126.js": "80893798281a09346db1ffebd9550da0", |
| | | "dxmodules\\crypto-es\\pad-iso97971.js": "50bb9404565dcdd2e7007b8a226d2d05", |
| | | "dxmodules\\crypto-es\\pad-nopadding.js": "8a873480d9df86d8a04d382ddbe31b3a", |
| | | "dxmodules\\crypto-es\\pad-zeropadding.js": "2a2ad73f1e17617337c3e498c3b1b145", |
| | | "dxmodules\\crypto-es\\pbkdf2.js": "effcee485c8753470be8737e6e86e203", |
| | | "dxmodules\\crypto-es\\rabbit-legacy.js": "580adab56a5e75aa7fa71ce7a79baeca", |
| | | "dxmodules\\crypto-es\\rabbit.js": "79323a58e0aa1df18d3c6920ea2bff94", |
| | | "dxmodules\\crypto-es\\rc4.js": "c76f35711e13d143f36b3c3032926aba", |
| | | "dxmodules\\crypto-es\\README.md": "f7f10d1eb7ac11ab28105200455e9dc8", |
| | | "dxmodules\\crypto-es\\ripemd160.js": "8321142c9245a95ff86519b0564e04c9", |
| | | "dxmodules\\crypto-es\\sha1.js": "20f5f5895e00141cbba984369cc85677", |
| | | "dxmodules\\crypto-es\\sha224.js": "a022faef3a3261f2ef46aad689868663", |
| | | "dxmodules\\crypto-es\\sha256.js": "b56fc502be36fd7748191ef2ab848aa1", |
| | | "dxmodules\\crypto-es\\sha3.js": "1e8ad2a56cf2900bcb2f92ae118a8f10", |
| | | "dxmodules\\crypto-es\\sha384.js": "761d6fdde71581343ac4ea0b15ebc95d", |
| | | "dxmodules\\crypto-es\\sha512.js": "1b90fae85bb88280ddc0603be4c9ff9a", |
| | | "dxmodules\\crypto-es\\tripledes.js": "90b881b6a598aab6861b2537c147b3f7", |
| | | "dxmodules\\crypto-es\\x64-core.js": "9cb085fad93878dd85edaaa37aa1e4b5", |
| | | "dxmodules\\dxAudio.js": "13780dfd75bbf177bf1f242196f671df", |
| | | "dxmodules\\dxBase64.js": "7cb517ecd99830dde0ec13a501e831ea", |
| | | "dxmodules\\dxCamera.js": "2e74003e95eb396effb2426fc5db9e04", |
| | | "dxmodules\\dxCapcal.js": "c56a3ef1feda15e9da6e39d8f0fdb528", |
| | | "dxmodules\\dxChannel.js": "f6939b18d179587910904dc37a3b88e6", |
| | | "dxmodules\\dxCommon.js": "7face5a0721bd302d666b12c30a17166", |
| | | "dxmodules\\dxCommonUtils.js": "9d408cedb29cce9838c10ae5d1a8c2aa", |
| | | "dxmodules\\dxConfig.js": "24072559b3cb1ec5c206cb358eaaaaae", |
| | | "dxmodules\\dxDisplay.js": "5c80ee7de62e3f7b08eed6e3e0a8b3c1", |
| | | "dxmodules\\dxDriver.js": "1e27304f7ecc691ac66293cd065e6a14", |
| | | "dxmodules\\dxEventBus.js": "075ac9f2d465c92a9446ea07a6e2bfe6", |
| | | "dxmodules\\dxFacial.js": "08f40369fd06cb3f5f69cd035d4ecab2", |
| | | "dxmodules\\dxFacialBarcode.js": "67508897203cf7382f4bb20c4044dc17", |
| | | "dxmodules\\dxFingerMz.js": "4e2d6794d3a5c38dfcf80f24b4d9f8e6", |
| | | "dxmodules\\dxFingerZaz.js": "47463d6c6ee81f2373df95fe3638ab9c", |
| | | "dxmodules\\dxGpio.js": "30c34469e2dc8d80026fc5eac5bfd1f7", |
| | | "dxmodules\\dxGpioKey.js": "3877f16ccf0987cd491adbf2f8f97f2e", |
| | | "dxmodules\\dxHttp.js": "fa75a0a2951399fb5af7618d7ab4c6f1", |
| | | "dxmodules\\dxHttpClient.js": "0f81691b2405d87e8fa230e1223f7b78", |
| | | "dxmodules\\dxHttpServer.js": "bd66e578dcbe66934548c2a52aa56ab0", |
| | | "dxmodules\\dxLogger.js": "be5516b1419e1e6c98947196cd4c5df1", |
| | | "dxmodules\\dxMap.js": "61c9b76b7e05e4e8bebeccd1dfaaa963", |
| | | "dxmodules\\dxMqttClient.js": "d18248384c1ecee412c1f1ba86c233ac", |
| | | "dxmodules\\dxNetwork.js": "e377baf713245bf54012d56ea15b48d2", |
| | | "dxmodules\\dxNfc.js": "feb5bc21d4b13ab9736de1941290312d", |
| | | "dxmodules\\dxNfcCard.js": "689161d840c1ee82107e55b3e43da5c3", |
| | | "dxmodules\\dxNtp.js": "54a83064faa67f8f4991e1da56a3caf4", |
| | | "dxmodules\\dxOs.js": "8171120055734e75dd6c878862ae965a", |
| | | "dxmodules\\dxOta.js": "a4bf84aaead7298c5da10161644f2b1f", |
| | | "dxmodules\\dxPwm.js": "d8238b43ef7c0d77a33108290394e12c", |
| | | "dxmodules\\dxQrRule.js": "bfa9e2b4725c4fa358a2988f63c67210", |
| | | "dxmodules\\dxSqliteDB.js": "4762a29fb74d837d43d1d19415f77536", |
| | | "dxmodules\\dxStd.js": "322e8885cd0c7d2d9137b47fec8c8b00", |
| | | "dxmodules\\dxTimeZones.js": "c05c66e1fc1dfea0aca722f148190148", |
| | | "dxmodules\\dxUart.js": "0cb032a9f73a894b601ff7fef1c648e7", |
| | | "dxmodules\\dxVgBle.js": "348e4999a1c77d85bfc962c6fbdcc742", |
| | | "dxmodules\\dxWatchdog.js": "4833387ea9787b18a8c75a4ffc57b35e", |
| | | "dxmodules\\dxWorkerPool.js": "77ec46afea15eac3ff99c41fb23f43ff", |
| | | "dxmodules\\libasound.so.2": "c2cf01ef989d7e237b1d6fbc7e8dd864", |
| | | "dxmodules\\libatopology.so.2": "f8ea786abf596b37cf4546aa451a6c46", |
| | | "dxmodules\\libpaho-mqtt3cs.so.1": "87713197d248b22ee3dffe89f166d472", |
| | | "dxmodules\\libvbar-b-dxgpio.so": "ca009351ab7d9719a71cd6105e9acba6", |
| | | "dxmodules\\libvbar-b-dxpwm.so": "6d90f8d1171b16aa583a0c7fcc4f43a1", |
| | | "dxmodules\\libvbar-drv-audio_gain.so": "2eec6e720acaee6c4328cb75f5ae11d1", |
| | | "dxmodules\\libvbar-drv-capcal.so": "6236c6a52401d47047b4f34ad55f7e3d", |
| | | "dxmodules\\libvbar-drv-capturer.so": "92a4e62761f88eaaa185782f790d0e43", |
| | | "dxmodules\\libvbar-drv-display.so": "29349e3c7335720975018beb02401b79", |
| | | "dxmodules\\libvbar-drv-face.so": "ed17b2951e8a72aced9a144bd90e3e89", |
| | | "dxmodules\\libvbar-drv-gpio.so": "3f0abbaee2f972c4ed88fb0a6964e532", |
| | | "dxmodules\\libvbar-drv-memory.so": "0ed48486e154f24d6681a0195a7525ad", |
| | | "dxmodules\\libvbar-drv-pwm.so": "975d6cbb5529c3ddd2514653b4fbe4af", |
| | | "dxmodules\\libvbar-drv-soc.so": "73e4b6657af4bcff0affaacf55702096", |
| | | "dxmodules\\libvbar-drv-tts.so": "1b3893d2efb58a1ffbfb0fa42915e3c7", |
| | | "dxmodules\\libvbar-drv-watchdog.so": "6226d1373d012eadeab2d0b895dd4367", |
| | | "dxmodules\\libvbar-m-audio.so": "000a366ffd92abe7dfe0b8b656b7b8a9", |
| | | "dxmodules\\libvbar-m-capturer.so": "8f0b6383db39494904294c3f60c5f013", |
| | | "dxmodules\\libvbar-m-channel.so": "bcb6746b5325793eca68a29b63aa1217", |
| | | "dxmodules\\libvbar-m-common.so": "b3821e6a3cb54a3afb3029ab1a7e68d6", |
| | | "dxmodules\\libvbar-m-dxaudio.so": "3d4f148f8293a48e03d64320e511520b", |
| | | "dxmodules\\libvbar-m-dxchannel.so": "3ba10035946cff6fbdffac07ef9df9cc", |
| | | "dxmodules\\libvbar-m-dxcommon.so": "538dec5814f2e8f030813cd88bb0703f", |
| | | "dxmodules\\libvbar-m-dxcommonutils.so": "c72011e82a558a4e84819645700ec879", |
| | | "dxmodules\\libvbar-m-dxdisplay.so": "4de71b250645bcf8e63da84015976196", |
| | | "dxmodules\\libvbar-m-dxfacial.so": "a401e8e0460a881d748bba0cf235a5a9", |
| | | "dxmodules\\libvbar-m-dxhttpclient.so": "9d2ce48027e5afcb1e85b5703a5f1f53", |
| | | "dxmodules\\libvbar-m-dxhttpserver.so": "7238d45c439402b79b696067b3eb2ec8", |
| | | "dxmodules\\libvbar-m-dxkey.so": "e9efc4894bcd538c2a59d048ca57c70a", |
| | | "dxmodules\\libvbar-m-dxmap.so": "d692e8e4ed4b1198f0a7f2f3eefd7865", |
| | | "dxmodules\\libvbar-m-dxmqttclient.so": "9b7e75398a0f3d2bf138deead9221c46", |
| | | "dxmodules\\libvbar-m-dxnetwork.so": "e4d4f8b955b9f871cf913607f0dd406a", |
| | | "dxmodules\\libvbar-m-dxnfccard.so": "d7f14dddded1ffd89475f18a092c8530", |
| | | "dxmodules\\libvbar-m-dxos.so": "b46dd08ab1769f5c246c284f83311294", |
| | | "dxmodules\\libvbar-m-dxsqlitedb.so": "7581e5d8a56f6d9c23885e4ceb57e4a2", |
| | | "dxmodules\\libvbar-m-dxuart.so": "e59a58bddafa0d7fa8d13387feb59946", |
| | | "dxmodules\\libvbar-m-dxwatchdog.so": "9854b627923ad943b2b34250ba717505", |
| | | "dxmodules\\libvbar-m-eid.so": "a4d1b2fa880f6d67e805dfca07f26523", |
| | | "dxmodules\\libvbar-m-key.so": "a51d6ce68a66e21865a47cf5a350ce80", |
| | | "dxmodules\\libvbar-m-net.so": "e058b3e454d27044d6544dbfe13a3254", |
| | | "dxmodules\\libvbar-p-nfc.so": "1b3af2b46962720f8f13a7c275576049", |
| | | "dxmodules\\libzbar.so": "dc72c4323c8b5616037b8ebf32740665", |
| | | "dxmodules\\vbar_version": "ecaec8f34eac0b8b086a1638030427bc", |
| | | "dxmodules\\vgUartWorker.js": "fc3e9e0051836d5063c0eecf555d9521", |
| | | "dxmodules\\zoneinfo\\Africa\\Abidjan": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Accra": "6cb97bef390f7c65022c2e8c7eec45e0", |
| | | "dxmodules\\zoneinfo\\Africa\\Addis_Ababa": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Algiers": "3342407b34291d264175caaf37813938", |
| | | "dxmodules\\zoneinfo\\Africa\\Asmara": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Asmera": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Bamako": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Bangui": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Banjul": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Bissau": "af82ce73e5877a3dfd5c9dc93e869fa9", |
| | | "dxmodules\\zoneinfo\\Africa\\Blantyre": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Brazzaville": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Bujumbura": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Cairo": "b9bb9d8c3cddc72252f4aa2082af4213", |
| | | "dxmodules\\zoneinfo\\Africa\\Casablanca": "565d702c341dd4239a7e76208653c18c", |
| | | "dxmodules\\zoneinfo\\Africa\\Ceuta": "5c2bf01f3f9fadcfa9a188e594f232e9", |
| | | "dxmodules\\zoneinfo\\Africa\\Conakry": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Dakar": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Dar_es_Salaam": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Djibouti": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Douala": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\El_Aaiun": "b5acb6aaf433bd0dfe09d90fcc30c7e3", |
| | | "dxmodules\\zoneinfo\\Africa\\Freetown": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Gaborone": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Harare": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Johannesburg": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\Africa\\Juba": "659ed8d529baf6f5043db708c1d17bee", |
| | | "dxmodules\\zoneinfo\\Africa\\Kampala": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Khartoum": "021e36c906192435e0cb9c09440173a3", |
| | | "dxmodules\\zoneinfo\\Africa\\Kigali": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Kinshasa": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Lagos": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Libreville": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Lome": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Luanda": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Lubumbashi": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Lusaka": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Malabo": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Maputo": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\Africa\\Maseru": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\Africa\\Mbabane": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\Africa\\Mogadishu": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Monrovia": "896a875aafa39c10b614c9803d1f2673", |
| | | "dxmodules\\zoneinfo\\Africa\\Nairobi": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Africa\\Ndjamena": "a0aad5ca661653e362b8afc808dc85c1", |
| | | "dxmodules\\zoneinfo\\Africa\\Niamey": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Nouakchott": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Ouagadougou": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Porto-Novo": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\Africa\\Sao_Tome": "06142521165cb91ddc40c1d9000c7038", |
| | | "dxmodules\\zoneinfo\\Africa\\Timbuktu": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Africa\\Tripoli": "edec79f292e5b8c0d32b521af1f118bd", |
| | | "dxmodules\\zoneinfo\\Africa\\Tunis": "4f1b4fe95a2512916e20c6f6e26d8e3c", |
| | | "dxmodules\\zoneinfo\\Africa\\Windhoek": "6e9276508be4c6bfa224b9dddfefa61e", |
| | | "dxmodules\\zoneinfo\\America\\Adak": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\America\\Anchorage": "596428a3a840d568656088bd48e608f1", |
| | | "dxmodules\\zoneinfo\\America\\Anguilla": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Antigua": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Araguaina": "f41ab2d0a7a5b7fa0e3d3ac456b6bc97", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Catamarca": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\ComodRivadavia": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\La_Rioja": "00095a6391dda3fdca483ec5847abf2b", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Rio_Gallegos": "b97bc475f57e6b72c5ef969ed629e144", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Salta": "ed7e059362f3ae6381c2390798b0d524", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\San_Juan": "7c35305a9821e159720fae50b96790ca", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\San_Luis": "3e91f210d3eedf4543a4b716a5ba504c", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Tucuman": "b58092fe8d0461c10f5c3153ad9ed653", |
| | | "dxmodules\\zoneinfo\\America\\Argentina\\Ushuaia": "b1d065d0cd8358933796fe3f034d799a", |
| | | "dxmodules\\zoneinfo\\America\\Aruba": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\America\\Asuncion": "09a3f0569913d138c4f5d8c0c97c055c", |
| | | "dxmodules\\zoneinfo\\America\\Atikokan": "6b028d3f8073ba06f9467133f6a1a0dd", |
| | | "dxmodules\\zoneinfo\\America\\Atka": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\America\\Bahia": "2f5dd75c9ee116e4ca290849dfff7a9f", |
| | | "dxmodules\\zoneinfo\\America\\Bahia_Banderas": "6d24d30bc671042918ba397a15e6114c", |
| | | "dxmodules\\zoneinfo\\America\\Barbados": "92550378b8952475d3bffe20b1168820", |
| | | "dxmodules\\zoneinfo\\America\\Belem": "432beed5d93041f2b551051332d7d72e", |
| | | "dxmodules\\zoneinfo\\America\\Belize": "da3145d79cba5f541dd261434e449173", |
| | | "dxmodules\\zoneinfo\\America\\Blanc-Sablon": "4169ae15c5a1477cfe281fa7702bcc14", |
| | | "dxmodules\\zoneinfo\\America\\Boa_Vista": "a98b8a6d614366047943d78bc1896acb", |
| | | "dxmodules\\zoneinfo\\America\\Bogota": "cb5574ae9b01614c9e8c082039fe8147", |
| | | "dxmodules\\zoneinfo\\America\\Boise": "45dce4d7ef2491d2450d16565f878b02", |
| | | "dxmodules\\zoneinfo\\America\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49", |
| | | "dxmodules\\zoneinfo\\America\\Cambridge_Bay": "048d33fc74c19008a5a440b8b226cb45", |
| | | "dxmodules\\zoneinfo\\America\\Campo_Grande": "6e2912b5b855c5e6d39eeb1bcf19aea5", |
| | | "dxmodules\\zoneinfo\\America\\Cancun": "a2fe4da50cfb1afe8a46d6f55b805afa", |
| | | "dxmodules\\zoneinfo\\America\\Caracas": "a5bf9cdb87d451a4aabad61d4ce91a2b", |
| | | "dxmodules\\zoneinfo\\America\\Catamarca": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\America\\Cayenne": "e9f3bdd863a3cf2127077a21e918b057", |
| | | "dxmodules\\zoneinfo\\America\\Cayman": "843b6eadcdd7838269e2195df886ebf1", |
| | | "dxmodules\\zoneinfo\\America\\Chicago": "d0f076c9f390e7d8a933cc7cc1ad2e90", |
| | | "dxmodules\\zoneinfo\\America\\Chihuahua": "75c741bb811f4ee563ce05eb976e53a1", |
| | | "dxmodules\\zoneinfo\\America\\Coral_Harbour": "6b028d3f8073ba06f9467133f6a1a0dd", |
| | | "dxmodules\\zoneinfo\\America\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\America\\Costa_Rica": "2dec281340a45276b0799a3bec48b76b", |
| | | "dxmodules\\zoneinfo\\America\\Creston": "dbf874c388dc236612025d145b46d868", |
| | | "dxmodules\\zoneinfo\\America\\Cuiaba": "71d500778aa9de635b9438695cf8b61e", |
| | | "dxmodules\\zoneinfo\\America\\Curacao": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\America\\Danmarkshavn": "20e68f0a941140b269efb3af346b1e34", |
| | | "dxmodules\\zoneinfo\\America\\Dawson": "9c8e92765ad27141e3a56f6a31599c99", |
| | | "dxmodules\\zoneinfo\\America\\Dawson_Creek": "f7955656cccdf253d996deb5bb4176ef", |
| | | "dxmodules\\zoneinfo\\America\\Denver": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\America\\Detroit": "ae3ba6ed8738ceda9eef109c6c586736", |
| | | "dxmodules\\zoneinfo\\America\\Dominica": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Edmonton": "1f23503189b8ce70677b2dcbb4a57e8c", |
| | | "dxmodules\\zoneinfo\\America\\Eirunepe": "236e0fa8dd250599b2146a7a203a6ae4", |
| | | "dxmodules\\zoneinfo\\America\\El_Salvador": "b77c5f52b45573ae0f5673ac0ca1b086", |
| | | "dxmodules\\zoneinfo\\America\\Ensenada": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\America\\Fortaleza": "2e202e859552b09ad60cdc408de47c94", |
| | | "dxmodules\\zoneinfo\\America\\Fort_Nelson": "8853bd10553d7ca5eb5f0b9c7af5a047", |
| | | "dxmodules\\zoneinfo\\America\\Fort_Wayne": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\America\\Glace_Bay": "6ba1b7da532cefb6e32d083377b71303", |
| | | "dxmodules\\zoneinfo\\America\\Godthab": "4a1f3fd710057cfeaf3e7ac964a18466", |
| | | "dxmodules\\zoneinfo\\America\\Goose_Bay": "18a9d1af32911f30273fabcc694d9654", |
| | | "dxmodules\\zoneinfo\\America\\Grand_Turk": "539dcee68a715238ef8aa5642a9b5214", |
| | | "dxmodules\\zoneinfo\\America\\Grenada": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Guadeloupe": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Guatemala": "097638f469fdba70e9637561cffefd91", |
| | | "dxmodules\\zoneinfo\\America\\Guayaquil": "bbe67886e74ffd7d1ed09a3481b5120c", |
| | | "dxmodules\\zoneinfo\\America\\Guyana": "7fb63c484765baf41049bd41cfca0184", |
| | | "dxmodules\\zoneinfo\\America\\Halifax": "820f35f23d49a527ffe813e2d96c5da7", |
| | | "dxmodules\\zoneinfo\\America\\Havana": "1877fc45317e144ea206ddc622cebba2", |
| | | "dxmodules\\zoneinfo\\America\\Hermosillo": "7bdce7a211e50eff3b5b8de21a46d581", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Knox": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Marengo": "541539f004b1b1722ac96e897d06ac45", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Petersburg": "82b5d3f05f88ac02cb5a4c3fb08fa191", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Tell_City": "dfe557585c608ee9e34e9b75fbe72617", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Vevay": "d0f3d93603268abdfeb402bbe0c3c0b3", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Vincennes": "d13258dc61c8a747a914396a56e4218c", |
| | | "dxmodules\\zoneinfo\\America\\Indiana\\Winamac": "e6b915ae1c01b71fd7b42b00b4664029", |
| | | "dxmodules\\zoneinfo\\America\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\America\\Inuvik": "4ea2c19a83f810220c7302c9914e4ee4", |
| | | "dxmodules\\zoneinfo\\America\\Iqaluit": "4142e0b137ac6cf3fdad0fce11560ca1", |
| | | "dxmodules\\zoneinfo\\America\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af", |
| | | "dxmodules\\zoneinfo\\America\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11", |
| | | "dxmodules\\zoneinfo\\America\\Juneau": "6276c692ca4f68dcb846d7e918ee23dd", |
| | | "dxmodules\\zoneinfo\\America\\Kentucky\\Louisville": "99545115e4f688d7f573d38d667194d9", |
| | | "dxmodules\\zoneinfo\\America\\Kentucky\\Monticello": "4041c24d41fbbd407e4d398824225d50", |
| | | "dxmodules\\zoneinfo\\America\\Knox_IN": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\America\\Kralendijk": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\America\\La_Paz": "962d2f2486d3c16a6095390156e322b3", |
| | | "dxmodules\\zoneinfo\\America\\Lima": "cc24c83127c28793afc54e43fe5766e4", |
| | | "dxmodules\\zoneinfo\\America\\Los_Angeles": "9323ff44ce205ce1a1bad7e2dca39939", |
| | | "dxmodules\\zoneinfo\\America\\Louisville": "99545115e4f688d7f573d38d667194d9", |
| | | "dxmodules\\zoneinfo\\America\\Lower_Princes": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\America\\Maceio": "378a3e07cabc7773b6078025e9981793", |
| | | "dxmodules\\zoneinfo\\America\\Managua": "4667d4aa7d530f1f61f5b116258eb84d", |
| | | "dxmodules\\zoneinfo\\America\\Manaus": "585a0b598d406e6c0d710182bbdba35e", |
| | | "dxmodules\\zoneinfo\\America\\Marigot": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Martinique": "ecdf79bbd2c17670a4637d06b01d7819", |
| | | "dxmodules\\zoneinfo\\America\\Matamoros": "9ba17635ae8f44fa50c4565328433383", |
| | | "dxmodules\\zoneinfo\\America\\Mazatlan": "2a157b818df8ab296baf6de38cd7d32b", |
| | | "dxmodules\\zoneinfo\\America\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870", |
| | | "dxmodules\\zoneinfo\\America\\Menominee": "c720185d11deb83ad58b22b118830261", |
| | | "dxmodules\\zoneinfo\\America\\Merida": "91ebe16317802987c2cd9c567b6e4c2a", |
| | | "dxmodules\\zoneinfo\\America\\Metlakatla": "02b06c27e6b6de8398ac263055a2d280", |
| | | "dxmodules\\zoneinfo\\America\\Mexico_City": "cff58c6976849e1e8f94d4288b07b9d2", |
| | | "dxmodules\\zoneinfo\\America\\Miquelon": "ac08a2e10dea976318846a7f7b254f26", |
| | | "dxmodules\\zoneinfo\\America\\Moncton": "2fa9e016bc7e55f51d036a158a40e0e9", |
| | | "dxmodules\\zoneinfo\\America\\Monterrey": "f77b22ac5e4f995ef8d4839835a54faa", |
| | | "dxmodules\\zoneinfo\\America\\Montevideo": "51fb8d4c68e90f30d5eb1dd503bf202e", |
| | | "dxmodules\\zoneinfo\\America\\Montreal": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\America\\Montserrat": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Nassau": "1444a5132c9a26f350ebe705760215c7", |
| | | "dxmodules\\zoneinfo\\America\\New_York": "e4ca381035a34b7a852184cc0dd89baa", |
| | | "dxmodules\\zoneinfo\\America\\Nipigon": "365984faa12e0762dac780bf71204633", |
| | | "dxmodules\\zoneinfo\\America\\Nome": "f9cb8bbe99e6143a75b2797ddf94f234", |
| | | "dxmodules\\zoneinfo\\America\\Noronha": "a8562cc7d0e4555968ad7744dceb9d43", |
| | | "dxmodules\\zoneinfo\\America\\North_Dakota\\Beulah": "59406487459534f8844f828b8356d083", |
| | | "dxmodules\\zoneinfo\\America\\North_Dakota\\Center": "6964f42dc925648abaa448f18b330d46", |
| | | "dxmodules\\zoneinfo\\America\\North_Dakota\\New_Salem": "c14a42a9b8d8571354c8ced6fa931eac", |
| | | "dxmodules\\zoneinfo\\America\\Nuuk": "4a1f3fd710057cfeaf3e7ac964a18466", |
| | | "dxmodules\\zoneinfo\\America\\Ojinaga": "95e6bee1cb146689410010d58e6ee974", |
| | | "dxmodules\\zoneinfo\\America\\Panama": "843b6eadcdd7838269e2195df886ebf1", |
| | | "dxmodules\\zoneinfo\\America\\Pangnirtung": "b71f8c6f5a9b289c981af0cdbf80f7e1", |
| | | "dxmodules\\zoneinfo\\America\\Paramaribo": "2d11461cf62c48496eb9a866b3eb1712", |
| | | "dxmodules\\zoneinfo\\America\\Phoenix": "c697bb02e057325a74547912f631a3a7", |
| | | "dxmodules\\zoneinfo\\America\\Port-au-Prince": "27e4cb1b082cd694df8c1b2f27838f85", |
| | | "dxmodules\\zoneinfo\\America\\Porto_Acre": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\America\\Porto_Velho": "63160b0eb1d694ae0f97644160eea68a", |
| | | "dxmodules\\zoneinfo\\America\\Port_of_Spain": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Puerto_Rico": "b3feb20144b4070d5eff32dab8c8a160", |
| | | "dxmodules\\zoneinfo\\America\\Punta_Arenas": "9c43769cae1008f7fd054e807960a9cd", |
| | | "dxmodules\\zoneinfo\\America\\Rainy_River": "4bdb5a197d174ac4834b4e738340fdf6", |
| | | "dxmodules\\zoneinfo\\America\\Rankin_Inlet": "902bc59be5586a60cf0c67188027f7c4", |
| | | "dxmodules\\zoneinfo\\America\\Recife": "a9b9203d577c57c1cbf0873327336ac1", |
| | | "dxmodules\\zoneinfo\\America\\Regina": "cec6491b350dfbdb74732df745eb37d3", |
| | | "dxmodules\\zoneinfo\\America\\Resolute": "e272bb16aa765ea5439726dde6f283eb", |
| | | "dxmodules\\zoneinfo\\America\\Rio_Branco": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\America\\Rosario": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\America\\Santarem": "31689ae81ac7aea65cc5784da4560e73", |
| | | "dxmodules\\zoneinfo\\America\\Santa_Isabel": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\America\\Santiago": "b8db6707d0c4f0dfc7a12be81d35df8f", |
| | | "dxmodules\\zoneinfo\\America\\Santo_Domingo": "7edb49f18d76f116c5578c3dcd279ade", |
| | | "dxmodules\\zoneinfo\\America\\Sao_Paulo": "339ff8dbd88e39f59b2fd4ee57b1fdb1", |
| | | "dxmodules\\zoneinfo\\America\\Scoresbysund": "1a5f6775efbfe9befc36df0a3d19c594", |
| | | "dxmodules\\zoneinfo\\America\\Shiprock": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\America\\Sitka": "efa4e4969d3d0423dc3429a756921244", |
| | | "dxmodules\\zoneinfo\\America\\St_Barthelemy": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\St_Johns": "79d938b80bf215c8e13d2cb4727343d8", |
| | | "dxmodules\\zoneinfo\\America\\St_Kitts": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\St_Lucia": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\St_Thomas": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\St_Vincent": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Swift_Current": "c74726e554d359f38a26870282725f04", |
| | | "dxmodules\\zoneinfo\\America\\Tegucigalpa": "963e88d190d129470f37774310dd20e4", |
| | | "dxmodules\\zoneinfo\\America\\Thule": "32b5bb9f1f25d306246bd96a0ef317c4", |
| | | "dxmodules\\zoneinfo\\America\\Thunder_Bay": "aa82e0d2a447d3610f4c2eea10c2a7b8", |
| | | "dxmodules\\zoneinfo\\America\\Tijuana": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\America\\Toronto": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\America\\Tortola": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Vancouver": "9d48c60fed12ae8a6f5b139bf0b254b5", |
| | | "dxmodules\\zoneinfo\\America\\Virgin": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\America\\Whitehorse": "3b82b92569a6900dadc0aa62c7cb6f36", |
| | | "dxmodules\\zoneinfo\\America\\Winnipeg": "f0683580a6116b3c744cb6b3d63aa0b1", |
| | | "dxmodules\\zoneinfo\\America\\Yakutat": "ee0f462df87e663c328908c5e81260d0", |
| | | "dxmodules\\zoneinfo\\America\\Yellowknife": "b5087ae9a8ccc013470ebf44bc635281", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Casey": "f6d44d9ea6501a60287aeff26715bef0", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Davis": "80a08215623fd38f21aa72861fdf54cd", |
| | | "dxmodules\\zoneinfo\\Antarctica\\DumontDUrville": "e3f2c24ea8bfb0c5bea7a209cfd1baae", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Macquarie": "7c8809733d07903666654c0e67aeaec5", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Mawson": "d285e96947e86928c647ab2b2cf185b5", |
| | | "dxmodules\\zoneinfo\\Antarctica\\McMurdo": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Palmer": "3a6a847fb145840a4941337c2ae86d96", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Rothera": "70e1309683f8a4afa2f0d752bf97b46c", |
| | | "dxmodules\\zoneinfo\\Antarctica\\South_Pole": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Syowa": "553ede0b9071e1364892b1ed27a7f1a6", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Troll": "f13b257391af38577970477597e9d499", |
| | | "dxmodules\\zoneinfo\\Antarctica\\Vostok": "4bb37b331311a0867117d218adf10610", |
| | | "dxmodules\\zoneinfo\\Arctic\\Longyearbyen": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\Asia\\Aden": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\Asia\\Almaty": "938c35fa2fdc23ae382ad9b2278c6f58", |
| | | "dxmodules\\zoneinfo\\Asia\\Amman": "63694da35da6a976fb37a62debd191a4", |
| | | "dxmodules\\zoneinfo\\Asia\\Anadyr": "5648ae758f6447668653221263b5ea9d", |
| | | "dxmodules\\zoneinfo\\Asia\\Aqtau": "d020e6bedcd22c98f021e7c1c3ed8ee4", |
| | | "dxmodules\\zoneinfo\\Asia\\Aqtobe": "486c6c79d56174ee29d05fc6efd9e18e", |
| | | "dxmodules\\zoneinfo\\Asia\\Ashgabat": "235b16a54519989a51679188703ca5ac", |
| | | "dxmodules\\zoneinfo\\Asia\\Ashkhabad": "235b16a54519989a51679188703ca5ac", |
| | | "dxmodules\\zoneinfo\\Asia\\Atyrau": "5fbe4e89da1f20229c0c3747017557c0", |
| | | "dxmodules\\zoneinfo\\Asia\\Baghdad": "af9423b28aad58ffc1790d29244309b8", |
| | | "dxmodules\\zoneinfo\\Asia\\Bahrain": "fc5a2c1c087d56e4b7323259ab62bef6", |
| | | "dxmodules\\zoneinfo\\Asia\\Baku": "27e366b2523ae3dfd1e648ecdf54bc15", |
| | | "dxmodules\\zoneinfo\\Asia\\Bangkok": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\Asia\\Barnaul": "cfefaae119b421f5b3c990ef4948ebf7", |
| | | "dxmodules\\zoneinfo\\Asia\\Beirut": "785117e925db8afec6b0c761163b002c", |
| | | "dxmodules\\zoneinfo\\Asia\\Bishkek": "5dec7f8d19f19560c2fd59b16f2a2214", |
| | | "dxmodules\\zoneinfo\\Asia\\Brunei": "3db4e51993e234a73f7054160abf663d", |
| | | "dxmodules\\zoneinfo\\Asia\\Calcutta": "569f373970581e6488a24b5c70326d49", |
| | | "dxmodules\\zoneinfo\\Asia\\Chita": "6b2c484a3c93d7523cd09ec0d13b53fe", |
| | | "dxmodules\\zoneinfo\\Asia\\Choibalsan": "8ca46182ff4884d5b45c3c41e777783a", |
| | | "dxmodules\\zoneinfo\\Asia\\Chongqing": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\Asia\\Chungking": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\Asia\\Colombo": "12c255c649eaa1ade0387c30596825d9", |
| | | "dxmodules\\zoneinfo\\Asia\\Dacca": "ea255e2dada4541d25ad34139c18419f", |
| | | "dxmodules\\zoneinfo\\Asia\\Damascus": "07b6153d721b5d7d93d78f2591201ffa", |
| | | "dxmodules\\zoneinfo\\Asia\\Dhaka": "ea255e2dada4541d25ad34139c18419f", |
| | | "dxmodules\\zoneinfo\\Asia\\Dili": "5c7fb0d932343cc330df273a5bb9308b", |
| | | "dxmodules\\zoneinfo\\Asia\\Dubai": "e17583385b056a775970e7bcd9a6b7dd", |
| | | "dxmodules\\zoneinfo\\Asia\\Dushanbe": "29a7b7661ea6575cd7f8ba1435b78f1d", |
| | | "dxmodules\\zoneinfo\\Asia\\Famagusta": "14a69e4234b2f2c02a3d3a46d0ecffbb", |
| | | "dxmodules\\zoneinfo\\Asia\\Gaza": "798a2fa999dfbd3d557b0afeedc99562", |
| | | "dxmodules\\zoneinfo\\Asia\\Harbin": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\Asia\\Hebron": "f600ca83e00a4c2d046dbd5ae0461018", |
| | | "dxmodules\\zoneinfo\\Asia\\Hong_Kong": "1f5267f14578c917d94c972e46fc8e0e", |
| | | "dxmodules\\zoneinfo\\Asia\\Hovd": "585f478cf864b0065bd07587e6b1e41f", |
| | | "dxmodules\\zoneinfo\\Asia\\Ho_Chi_Minh": "104047aa22a3824e08e4fffeccc80d19", |
| | | "dxmodules\\zoneinfo\\Asia\\Irkutsk": "8a84642c58ed64282884014698df2f7d", |
| | | "dxmodules\\zoneinfo\\Asia\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\Asia\\Jakarta": "c280819a288b0aea09db4fd1fd017546", |
| | | "dxmodules\\zoneinfo\\Asia\\Jayapura": "75c2120efce23b61989c6a15635d115f", |
| | | "dxmodules\\zoneinfo\\Asia\\Jerusalem": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\Asia\\Kabul": "47a295d1de026d2e443c132316ed4533", |
| | | "dxmodules\\zoneinfo\\Asia\\Kamchatka": "da5950adc8bcdb823cff01b81d2d1ec9", |
| | | "dxmodules\\zoneinfo\\Asia\\Karachi": "b1afc0a7ce4118813cdc8679e8b20d8a", |
| | | "dxmodules\\zoneinfo\\Asia\\Kashgar": "a43f32e98fa40e6601db5cca019a01a8", |
| | | "dxmodules\\zoneinfo\\Asia\\Kathmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1", |
| | | "dxmodules\\zoneinfo\\Asia\\Katmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1", |
| | | "dxmodules\\zoneinfo\\Asia\\Khandyga": "d8845dc2bfed88c1aef353c99c332d8e", |
| | | "dxmodules\\zoneinfo\\Asia\\Kolkata": "569f373970581e6488a24b5c70326d49", |
| | | "dxmodules\\zoneinfo\\Asia\\Krasnoyarsk": "6459a2dc5df86eecb3d8d881e285fbc5", |
| | | "dxmodules\\zoneinfo\\Asia\\Kuala_Lumpur": "8a0970a2f6db03aa6317757fe59d24e5", |
| | | "dxmodules\\zoneinfo\\Asia\\Kuching": "941bf864c5cd1bcbcba5bf386815338d", |
| | | "dxmodules\\zoneinfo\\Asia\\Kuwait": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\Asia\\Macao": "f61abab83b519b307988b2c9e1c13037", |
| | | "dxmodules\\zoneinfo\\Asia\\Macau": "f61abab83b519b307988b2c9e1c13037", |
| | | "dxmodules\\zoneinfo\\Asia\\Magadan": "7d44faf13ac5b3facbd83ff3857a0e1e", |
| | | "dxmodules\\zoneinfo\\Asia\\Makassar": "13cba3c3bb605214bf3464922974ca13", |
| | | "dxmodules\\zoneinfo\\Asia\\Manila": "7edfd09b1ebe5e5a152a03a7a705f5bc", |
| | | "dxmodules\\zoneinfo\\Asia\\Muscat": "e17583385b056a775970e7bcd9a6b7dd", |
| | | "dxmodules\\zoneinfo\\Asia\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a", |
| | | "dxmodules\\zoneinfo\\Asia\\Novokuznetsk": "d5f8acb7b4e7d664a04dd154980eda1f", |
| | | "dxmodules\\zoneinfo\\Asia\\Novosibirsk": "b6434f1e22bf4098c2a8c5371dc301fe", |
| | | "dxmodules\\zoneinfo\\Asia\\Omsk": "e789f5c5cce168d524f5a8c2486b62ba", |
| | | "dxmodules\\zoneinfo\\Asia\\Oral": "2586cc76cb792e5a3e56f5c130892c93", |
| | | "dxmodules\\zoneinfo\\Asia\\Phnom_Penh": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\Asia\\Pontianak": "75dbcd818e883badda4d6df52f07c9ae", |
| | | "dxmodules\\zoneinfo\\Asia\\Pyongyang": "55ccc2dfaf651c7452baf53f3c0bcaa1", |
| | | "dxmodules\\zoneinfo\\Asia\\Qatar": "fc5a2c1c087d56e4b7323259ab62bef6", |
| | | "dxmodules\\zoneinfo\\Asia\\Qostanay": "6f2759a853ade2f4c50fddc156e833c6", |
| | | "dxmodules\\zoneinfo\\Asia\\Qyzylorda": "2794eeaae5075fae6c902660beae2141", |
| | | "dxmodules\\zoneinfo\\Asia\\Rangoon": "facd5e2823e744613e5d83384b53b17f", |
| | | "dxmodules\\zoneinfo\\Asia\\Riyadh": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\Asia\\Saigon": "104047aa22a3824e08e4fffeccc80d19", |
| | | "dxmodules\\zoneinfo\\Asia\\Sakhalin": "d065dcba4d1f2f8df4862ea639caf3f3", |
| | | "dxmodules\\zoneinfo\\Asia\\Samarkand": "7c0752cecdf1b32c7618128577045bcc", |
| | | "dxmodules\\zoneinfo\\Asia\\Seoul": "f7a6e371bd709b3c2f64ce6f67f39f29", |
| | | "dxmodules\\zoneinfo\\Asia\\Shanghai": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\Asia\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3", |
| | | "dxmodules\\zoneinfo\\Asia\\Srednekolymsk": "9e7e46bbc5dad40e5f90e797d941d22e", |
| | | "dxmodules\\zoneinfo\\Asia\\Taipei": "2e67467e3c050e8b3a4022eb9e20300e", |
| | | "dxmodules\\zoneinfo\\Asia\\Tashkent": "3e47dbc84c7895e2cb890776d3ad119b", |
| | | "dxmodules\\zoneinfo\\Asia\\Tbilisi": "da70a44f47a6a309eff8c9302fecf559", |
| | | "dxmodules\\zoneinfo\\Asia\\Tehran": "d2cb514595346f1168c2f1167409ec7c", |
| | | "dxmodules\\zoneinfo\\Asia\\Tel_Aviv": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\Asia\\Thimbu": "97be2e1f7789978b407476a8094d5ee1", |
| | | "dxmodules\\zoneinfo\\Asia\\Thimphu": "97be2e1f7789978b407476a8094d5ee1", |
| | | "dxmodules\\zoneinfo\\Asia\\Tokyo": "478afb8b1f182b2ff53caa2e6cc8ffd9", |
| | | "dxmodules\\zoneinfo\\Asia\\Tomsk": "903e9bdc80298a4433a48219a071d4af", |
| | | "dxmodules\\zoneinfo\\Asia\\Ujung_Pandang": "13cba3c3bb605214bf3464922974ca13", |
| | | "dxmodules\\zoneinfo\\Asia\\Ulaanbaatar": "3f0446e3735c9dd93089eeae31a37c1b", |
| | | "dxmodules\\zoneinfo\\Asia\\Ulan_Bator": "3f0446e3735c9dd93089eeae31a37c1b", |
| | | "dxmodules\\zoneinfo\\Asia\\Urumqi": "a43f32e98fa40e6601db5cca019a01a8", |
| | | "dxmodules\\zoneinfo\\Asia\\Ust-Nera": "4d04e65ff5d8c7b407d6cb8dedbe33a4", |
| | | "dxmodules\\zoneinfo\\Asia\\Vientiane": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\Asia\\Vladivostok": "cecab70411f0df191ef4a2cb747bdb08", |
| | | "dxmodules\\zoneinfo\\Asia\\Yakutsk": "bfef1f6f86fa7080259fd26f7668bc84", |
| | | "dxmodules\\zoneinfo\\Asia\\Yangon": "facd5e2823e744613e5d83384b53b17f", |
| | | "dxmodules\\zoneinfo\\Asia\\Yekaterinburg": "807931acd2f4fa27806b8208de988391", |
| | | "dxmodules\\zoneinfo\\Asia\\Yerevan": "e196b792aab3b785a957682c74f574e7", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Azores": "5433c796c8a770b6b06fe812ae08527f", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Bermuda": "659000f311b0ab5c90442cb81278c62c", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Canary": "167a786aa74ba2a9dd68c470746aa0ac", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Cape_Verde": "b3795953b76fb3cc553fdbb4d825cb93", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Faeroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Faroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Jan_Mayen": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Madeira": "2e4a8509560836b8341ec2e612627005", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Reykjavik": "d5e2f791bed996743c667784bb8c52ea", |
| | | "dxmodules\\zoneinfo\\Atlantic\\South_Georgia": "f0b2aeeddf3200b6a5839d86f35879e6", |
| | | "dxmodules\\zoneinfo\\Atlantic\\Stanley": "5a5247cc12a456fee6716540c14e55ad", |
| | | "dxmodules\\zoneinfo\\Atlantic\\St_Helena": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\Australia\\ACT": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\Australia\\Adelaide": "a3ec822dc0c8fd04e431b3316d1166ca", |
| | | "dxmodules\\zoneinfo\\Australia\\Brisbane": "0c8a54dfc42c9a987fff25d5d72096fa", |
| | | "dxmodules\\zoneinfo\\Australia\\Broken_Hill": "c0a218c9fe25b535b4a1a6b70dad3af2", |
| | | "dxmodules\\zoneinfo\\Australia\\Canberra": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\Australia\\Currie": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\Australia\\Darwin": "cbb2b15b2c2034c2584f801cec184e2b", |
| | | "dxmodules\\zoneinfo\\Australia\\Eucla": "1459b57ff3474bbe12013908f4bed8aa", |
| | | "dxmodules\\zoneinfo\\Australia\\Hobart": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\Australia\\LHI": "b664b61c1949c1beea8838facf6c1d8b", |
| | | "dxmodules\\zoneinfo\\Australia\\Lindeman": "4d125f1a5ec84cf6f62607152dedf324", |
| | | "dxmodules\\zoneinfo\\Australia\\Lord_Howe": "b664b61c1949c1beea8838facf6c1d8b", |
| | | "dxmodules\\zoneinfo\\Australia\\Melbourne": "5f06e3a482d43ee4018736ac792b1129", |
| | | "dxmodules\\zoneinfo\\Australia\\North": "cbb2b15b2c2034c2584f801cec184e2b", |
| | | "dxmodules\\zoneinfo\\Australia\\NSW": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\Australia\\Perth": "a54a9120fddca3a9bb951ac9d8bce260", |
| | | "dxmodules\\zoneinfo\\Australia\\Queensland": "0c8a54dfc42c9a987fff25d5d72096fa", |
| | | "dxmodules\\zoneinfo\\Australia\\South": "a3ec822dc0c8fd04e431b3316d1166ca", |
| | | "dxmodules\\zoneinfo\\Australia\\Sydney": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\Australia\\Tasmania": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\Australia\\Victoria": "5f06e3a482d43ee4018736ac792b1129", |
| | | "dxmodules\\zoneinfo\\Australia\\West": "a54a9120fddca3a9bb951ac9d8bce260", |
| | | "dxmodules\\zoneinfo\\Australia\\Yancowinna": "c0a218c9fe25b535b4a1a6b70dad3af2", |
| | | "dxmodules\\zoneinfo\\Brazil\\Acre": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\Brazil\\DeNoronha": "a8562cc7d0e4555968ad7744dceb9d43", |
| | | "dxmodules\\zoneinfo\\Brazil\\East": "339ff8dbd88e39f59b2fd4ee57b1fdb1", |
| | | "dxmodules\\zoneinfo\\Brazil\\West": "585a0b598d406e6c0d710182bbdba35e", |
| | | "dxmodules\\zoneinfo\\Canada\\Atlantic": "820f35f23d49a527ffe813e2d96c5da7", |
| | | "dxmodules\\zoneinfo\\Canada\\Central": "f0683580a6116b3c744cb6b3d63aa0b1", |
| | | "dxmodules\\zoneinfo\\Canada\\Eastern": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\Canada\\Mountain": "1f23503189b8ce70677b2dcbb4a57e8c", |
| | | "dxmodules\\zoneinfo\\Canada\\Newfoundland": "79d938b80bf215c8e13d2cb4727343d8", |
| | | "dxmodules\\zoneinfo\\Canada\\Pacific": "9d48c60fed12ae8a6f5b139bf0b254b5", |
| | | "dxmodules\\zoneinfo\\Canada\\Saskatchewan": "cec6491b350dfbdb74732df745eb37d3", |
| | | "dxmodules\\zoneinfo\\Canada\\Yukon": "3b82b92569a6900dadc0aa62c7cb6f36", |
| | | "dxmodules\\zoneinfo\\CET": "3f166816639388adb3d3567e28ef2145", |
| | | "dxmodules\\zoneinfo\\Chile\\Continental": "b8db6707d0c4f0dfc7a12be81d35df8f", |
| | | "dxmodules\\zoneinfo\\Chile\\EasterIsland": "ea76f04afd1b377b869cd7532b35457c", |
| | | "dxmodules\\zoneinfo\\CST6CDT": "8396c3e49c717f9ba736b4d4d1b24b8b", |
| | | "dxmodules\\zoneinfo\\Cuba": "1877fc45317e144ea206ddc622cebba2", |
| | | "dxmodules\\zoneinfo\\EET": "16b84f2a83840fd4132c2e3fbff3b758", |
| | | "dxmodules\\zoneinfo\\Egypt": "b9bb9d8c3cddc72252f4aa2082af4213", |
| | | "dxmodules\\zoneinfo\\Eire": "0e226ce4b36682f2c9c2fa1146809778", |
| | | "dxmodules\\zoneinfo\\EST": "d0f150b6acc4dc78b8ada8abb1079af6", |
| | | "dxmodules\\zoneinfo\\EST5EDT": "e7a28a1315bcd4deedaaac6d1c3cd3e2", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+1": "169210c55520d3a8efc1362a5d89e402", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+10": "03d40b4007e96680e56f10372148cf51", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+11": "bb030b7fea0da0987217737e22a9cbe0", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+12": "66046646734491458066327a04705b0c", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+2": "0a97351084a016afb88b8b698ea922d8", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+3": "73897f3686a7bca3e2719cfa59f83b6b", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+4": "e943df1168ea3d597ec62c8933a11a9c", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+5": "a9d53018097b6bcca5e6a4e55211e80b", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+6": "0a8c24c796c1473250ff564fce59e937", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+7": "d87007923e671b8b78552d613299ac8a", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+8": "e99240e190c8a4ccf3cc0a26618fb09b", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT+9": "e77b0b4911d483289610c4efcd599d7d", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-1": "a3c457b6cc2c3be7f34da00d84ec229e", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-10": "8ed77c9096196e97be5f0807bf939bac", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-11": "dcdc4caf8194fa9d29ceccdc225a5048", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-12": "fe87b6111ce93c3d10fe152ca715a715", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-13": "0fd6f7e68d38e1cef98efdc6ecedae80", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-14": "155f8eb5a5dd22c81eef6986c8c5317c", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-2": "a9eafb629b4070ca0ff8f99631390031", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-3": "b73ddab7b5ca9128a8b2925fad5b11f0", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-4": "0c08dc6b2974b3207bf6293544a236b0", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-5": "57ca1133eeeb09c7c30c04850d49d4e5", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-6": "642170284ddc2575f5e077d7ea33dcdc", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-7": "2f4d1ba17adf0c86acb4cc6258f8a0cb", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-8": "f4d3b2b664698da9268d3f244fec9232", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT-9": "02963228a1537cc2c8bdf22e99178893", |
| | | "dxmodules\\zoneinfo\\Etc\\GMT0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Etc\\Greenwich": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Etc\\UCT": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\Etc\\Universal": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\Etc\\UTC": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\Etc\\Zulu": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\Europe\\Amsterdam": "e3b0d618da0bd60d894183dd0d53923e", |
| | | "dxmodules\\zoneinfo\\Europe\\Andorra": "8bfff3a580b4b0db3dff30d1d7385ac4", |
| | | "dxmodules\\zoneinfo\\Europe\\Astrakhan": "ba197918d51925f1e0b771923ce3a19f", |
| | | "dxmodules\\zoneinfo\\Europe\\Athens": "75d641576f8d4376045ba8f16db4063a", |
| | | "dxmodules\\zoneinfo\\Europe\\Belfast": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\Europe\\Belgrade": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\Berlin": "4790e83465681cefbf852aed265354bf", |
| | | "dxmodules\\zoneinfo\\Europe\\Bratislava": "eab2cea5cb5bf0374f6bf891b9102844", |
| | | "dxmodules\\zoneinfo\\Europe\\Brussels": "3d5d93412e485bac12e0587239835fd9", |
| | | "dxmodules\\zoneinfo\\Europe\\Bucharest": "751205baadb94c5f41dadbcc97ab23db", |
| | | "dxmodules\\zoneinfo\\Europe\\Budapest": "f76d3a5131d6910f5c2a34fbe35c265e", |
| | | "dxmodules\\zoneinfo\\Europe\\Busingen": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\Europe\\Chisinau": "717476d2fe0213c40e31f52573c05356", |
| | | "dxmodules\\zoneinfo\\Europe\\Copenhagen": "96039e70388d843950bcbef21328bba6", |
| | | "dxmodules\\zoneinfo\\Europe\\Dublin": "0e226ce4b36682f2c9c2fa1146809778", |
| | | "dxmodules\\zoneinfo\\Europe\\Gibraltar": "77fe14fec44142c1435dcc4eac003df4", |
| | | "dxmodules\\zoneinfo\\Europe\\Guernsey": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\Europe\\Helsinki": "3eaa8467ffb21b15bd75200ff2c0a3db", |
| | | "dxmodules\\zoneinfo\\Europe\\Isle_of_Man": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\Europe\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\Europe\\Jersey": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\Europe\\Kaliningrad": "7dc8e4aecf6dcf214b52938e289c9831", |
| | | "dxmodules\\zoneinfo\\Europe\\Kiev": "f957769855be8b9d5983e51c033975d8", |
| | | "dxmodules\\zoneinfo\\Europe\\Kirov": "6467d1d15049cb0015bbd56c92b18814", |
| | | "dxmodules\\zoneinfo\\Europe\\Lisbon": "b9ba38decf09fe0728f81ebeabf29cfe", |
| | | "dxmodules\\zoneinfo\\Europe\\Ljubljana": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\London": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\Europe\\Luxembourg": "3242615a805f051357309a89874633f3", |
| | | "dxmodules\\zoneinfo\\Europe\\Madrid": "3ecb0fe1a9207bc3f77e793315ce0e5d", |
| | | "dxmodules\\zoneinfo\\Europe\\Malta": "b6e707a0d755cfd038a7c4ecc44845e7", |
| | | "dxmodules\\zoneinfo\\Europe\\Mariehamn": "3eaa8467ffb21b15bd75200ff2c0a3db", |
| | | "dxmodules\\zoneinfo\\Europe\\Minsk": "07aeb33b58212d75e92b8eb157cc1624", |
| | | "dxmodules\\zoneinfo\\Europe\\Monaco": "89271b78b389e6180385b96e7af94e7a", |
| | | "dxmodules\\zoneinfo\\Europe\\Moscow": "223bbf37352a9d4807919132f360535e", |
| | | "dxmodules\\zoneinfo\\Europe\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a", |
| | | "dxmodules\\zoneinfo\\Europe\\Oslo": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\Europe\\Paris": "fe22373ca65df6ba6b254f5c4304fae8", |
| | | "dxmodules\\zoneinfo\\Europe\\Podgorica": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\Prague": "eab2cea5cb5bf0374f6bf891b9102844", |
| | | "dxmodules\\zoneinfo\\Europe\\Riga": "b4541699f68b4aba0daa45df63e596a4", |
| | | "dxmodules\\zoneinfo\\Europe\\Rome": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\Europe\\Samara": "d390934cf2dc01f033ffda93394c85d7", |
| | | "dxmodules\\zoneinfo\\Europe\\San_Marino": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\Europe\\Sarajevo": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\Saratov": "756b361dc39b978b78eaf6df78a7ad0e", |
| | | "dxmodules\\zoneinfo\\Europe\\Simferopol": "9b2ddc8ca9d5c792d09f37ca58104afa", |
| | | "dxmodules\\zoneinfo\\Europe\\Skopje": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\Sofia": "68e6be692f44b3ed696fd2e6ef806927", |
| | | "dxmodules\\zoneinfo\\Europe\\Stockholm": "1b9ed89af7331c6141249d181b42c621", |
| | | "dxmodules\\zoneinfo\\Europe\\Tallinn": "46abec9f16a148333139ff5b0b6d1115", |
| | | "dxmodules\\zoneinfo\\Europe\\Tirane": "d5977bad592e33b2e4058a242d735927", |
| | | "dxmodules\\zoneinfo\\Europe\\Tiraspol": "717476d2fe0213c40e31f52573c05356", |
| | | "dxmodules\\zoneinfo\\Europe\\Ulyanovsk": "ff8f50dd006548eb8751802c600f2299", |
| | | "dxmodules\\zoneinfo\\Europe\\Uzhgorod": "0b4761ce9ee17b7b8bfb0d12063803c6", |
| | | "dxmodules\\zoneinfo\\Europe\\Vaduz": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\Europe\\Vatican": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\Europe\\Vienna": "cb0f39744833718fbd602c54e0425157", |
| | | "dxmodules\\zoneinfo\\Europe\\Vilnius": "524d360c5369c1abcb59e8140b59acda", |
| | | "dxmodules\\zoneinfo\\Europe\\Volgograd": "442a047745c83ebebc180c67f6798fc2", |
| | | "dxmodules\\zoneinfo\\Europe\\Warsaw": "2ed881ef7e09c844c009673ded84c798", |
| | | "dxmodules\\zoneinfo\\Europe\\Zagreb": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\Europe\\Zaporozhye": "69430a5e3e93bd0ed6e2e604ddf6e903", |
| | | "dxmodules\\zoneinfo\\Europe\\Zurich": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\GB": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\GB-Eire": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\GMT": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\GMT+0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\GMT-0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\GMT0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Greenwich": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\Hongkong": "1f5267f14578c917d94c972e46fc8e0e", |
| | | "dxmodules\\zoneinfo\\HST": "fd4ae9e0296519fb47b4b036ea4af025", |
| | | "dxmodules\\zoneinfo\\Iceland": "d5e2f791bed996743c667784bb8c52ea", |
| | | "dxmodules\\zoneinfo\\Indian\\Antananarivo": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Indian\\Chagos": "dfb323eb6037596036669f4b4505544c", |
| | | "dxmodules\\zoneinfo\\Indian\\Christmas": "02b16169f8f47de904f3f05cb7f72583", |
| | | "dxmodules\\zoneinfo\\Indian\\Cocos": "d9ffcdd40666dcb76225bdfb4654c0cf", |
| | | "dxmodules\\zoneinfo\\Indian\\Comoro": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Indian\\Kerguelen": "749273edab499ed254e32606a9e5579e", |
| | | "dxmodules\\zoneinfo\\Indian\\Mahe": "0df488f823d924b336f01d53d270af73", |
| | | "dxmodules\\zoneinfo\\Indian\\Maldives": "89a066bf0512071db2a9eb425df46341", |
| | | "dxmodules\\zoneinfo\\Indian\\Mauritius": "8f06c0fc457b6a12c0bbc4946e2dfb05", |
| | | "dxmodules\\zoneinfo\\Indian\\Mayotte": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\Indian\\Reunion": "817b0a2e45ae9c1e566499a4b068295e", |
| | | "dxmodules\\zoneinfo\\Iran": "d2cb514595346f1168c2f1167409ec7c", |
| | | "dxmodules\\zoneinfo\\iso3166.tab": "22b35b3817db585e12c4e2db934c9680", |
| | | "dxmodules\\zoneinfo\\Israel": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af", |
| | | "dxmodules\\zoneinfo\\Japan": "478afb8b1f182b2ff53caa2e6cc8ffd9", |
| | | "dxmodules\\zoneinfo\\Kwajalein": "6d9261ff9442c0cf69446e362202d691", |
| | | "dxmodules\\zoneinfo\\leapseconds": "cf361cfd45c2547a044f48855d7e5d5c", |
| | | "dxmodules\\zoneinfo\\Libya": "edec79f292e5b8c0d32b521af1f118bd", |
| | | "dxmodules\\zoneinfo\\MET": "3b07c8cc8c1fed960246da4e3791a73c", |
| | | "dxmodules\\zoneinfo\\Mexico\\BajaNorte": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\Mexico\\BajaSur": "2a157b818df8ab296baf6de38cd7d32b", |
| | | "dxmodules\\zoneinfo\\Mexico\\General": "cff58c6976849e1e8f94d4288b07b9d2", |
| | | "dxmodules\\zoneinfo\\MST": "04da8453f31d6971b7fa4f3f8fb26654", |
| | | "dxmodules\\zoneinfo\\MST7MDT": "76be6718eb3cf4ac468387b5d13ffafb", |
| | | "dxmodules\\zoneinfo\\Navajo": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\NZ": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\NZ-CHAT": "0e76ddb8bb10f4b8f2ee092f731b6452", |
| | | "dxmodules\\zoneinfo\\Pacific\\Apia": "6b2ba3b8fc50b635cdc0c1f117243439", |
| | | "dxmodules\\zoneinfo\\Pacific\\Auckland": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\Pacific\\Bougainville": "e2da4052206976c32cd533f22f0bcf15", |
| | | "dxmodules\\zoneinfo\\Pacific\\Chatham": "0e76ddb8bb10f4b8f2ee092f731b6452", |
| | | "dxmodules\\zoneinfo\\Pacific\\Chuuk": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\Pacific\\Easter": "ea76f04afd1b377b869cd7532b35457c", |
| | | "dxmodules\\zoneinfo\\Pacific\\Efate": "25c51b2838decef2f9d90c15e4ef7d3c", |
| | | "dxmodules\\zoneinfo\\Pacific\\Enderbury": "6356a41b8b79885979b2b6613abecb73", |
| | | "dxmodules\\zoneinfo\\Pacific\\Fakaofo": "de7a32503bd8fdc5baec11e6b9aad69b", |
| | | "dxmodules\\zoneinfo\\Pacific\\Fiji": "7133b1eaf825848a26c6fe35f2601908", |
| | | "dxmodules\\zoneinfo\\Pacific\\Funafuti": "eb33daa3195c75c1a5b54b14fe461b73", |
| | | "dxmodules\\zoneinfo\\Pacific\\Galapagos": "684faae885b8ab403c2a54b9f1eecea9", |
| | | "dxmodules\\zoneinfo\\Pacific\\Gambier": "921dd1aee0026d9b376f293ce4f246bc", |
| | | "dxmodules\\zoneinfo\\Pacific\\Guadalcanal": "1de7b39a3bcdce97e8c93d336157dd8b", |
| | | "dxmodules\\zoneinfo\\Pacific\\Guam": "af8e7d6ffe7865cc595b49479e53d408", |
| | | "dxmodules\\zoneinfo\\Pacific\\Honolulu": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\Pacific\\Johnston": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\Pacific\\Kiritimati": "f5876d683bfa2f0339c3c048224e430f", |
| | | "dxmodules\\zoneinfo\\Pacific\\Kosrae": "ef22d34dcb3734017a59ecc62ab84713", |
| | | "dxmodules\\zoneinfo\\Pacific\\Kwajalein": "6d9261ff9442c0cf69446e362202d691", |
| | | "dxmodules\\zoneinfo\\Pacific\\Majuro": "86a054fd15bfbd9fe15156ba7f4155fd", |
| | | "dxmodules\\zoneinfo\\Pacific\\Marquesas": "e05efeb2e72d3a51e6019499841b509c", |
| | | "dxmodules\\zoneinfo\\Pacific\\Midway": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\Pacific\\Nauru": "4f7dd62a8207d60009300c99c1773846", |
| | | "dxmodules\\zoneinfo\\Pacific\\Niue": "2d69ed1a3e4496ecd16c94846675a0f3", |
| | | "dxmodules\\zoneinfo\\Pacific\\Norfolk": "0ba7dc541ce5ad91b2d0aa81589ee205", |
| | | "dxmodules\\zoneinfo\\Pacific\\Noumea": "48f634aa56c4cfee3f6afd37b28b66b2", |
| | | "dxmodules\\zoneinfo\\Pacific\\Pago_Pago": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\Pacific\\Palau": "3ffa839dec8323e475526d5cd38fa82a", |
| | | "dxmodules\\zoneinfo\\Pacific\\Pitcairn": "42e5aa28598d96efb16eb6734f31fda6", |
| | | "dxmodules\\zoneinfo\\Pacific\\Pohnpei": "45f293ec35daa27a60c7e0c90b58012d", |
| | | "dxmodules\\zoneinfo\\Pacific\\Ponape": "45f293ec35daa27a60c7e0c90b58012d", |
| | | "dxmodules\\zoneinfo\\Pacific\\Port_Moresby": "c43a5f332114d2a9cd1d6c9f259c71f3", |
| | | "dxmodules\\zoneinfo\\Pacific\\Rarotonga": "770947b4fd41633dc1d9cecc1ee972d2", |
| | | "dxmodules\\zoneinfo\\Pacific\\Saipan": "af8e7d6ffe7865cc595b49479e53d408", |
| | | "dxmodules\\zoneinfo\\Pacific\\Samoa": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\Pacific\\Tahiti": "cdbc49403d1d7684e83fdfc258106885", |
| | | "dxmodules\\zoneinfo\\Pacific\\Tarawa": "b2564fba66250ab89502eec6d72c0c5e", |
| | | "dxmodules\\zoneinfo\\Pacific\\Tongatapu": "db7a5ceed05b395c4660be082a4377da", |
| | | "dxmodules\\zoneinfo\\Pacific\\Truk": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\Pacific\\Wake": "5763840e0d743d0555d9f0813404da80", |
| | | "dxmodules\\zoneinfo\\Pacific\\Wallis": "36b100715cbee093d7c6056eaf60aeeb", |
| | | "dxmodules\\zoneinfo\\Pacific\\Yap": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\Poland": "2ed881ef7e09c844c009673ded84c798", |
| | | "dxmodules\\zoneinfo\\Portugal": "b9ba38decf09fe0728f81ebeabf29cfe", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Abidjan": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Accra": "6cb97bef390f7c65022c2e8c7eec45e0", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Addis_Ababa": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Algiers": "3342407b34291d264175caaf37813938", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Asmara": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Asmera": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Bamako": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Bangui": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Banjul": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Bissau": "af82ce73e5877a3dfd5c9dc93e869fa9", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Blantyre": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Brazzaville": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Bujumbura": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Cairo": "b9bb9d8c3cddc72252f4aa2082af4213", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Casablanca": "565d702c341dd4239a7e76208653c18c", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Ceuta": "5c2bf01f3f9fadcfa9a188e594f232e9", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Conakry": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Dakar": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Dar_es_Salaam": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Djibouti": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Douala": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\El_Aaiun": "b5acb6aaf433bd0dfe09d90fcc30c7e3", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Freetown": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Gaborone": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Harare": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Johannesburg": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Juba": "659ed8d529baf6f5043db708c1d17bee", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Kampala": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Khartoum": "021e36c906192435e0cb9c09440173a3", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Kigali": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Kinshasa": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Lagos": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Libreville": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Lome": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Luanda": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Lubumbashi": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Lusaka": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Malabo": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Maputo": "b5f4fb3c09aa7751a710e6fd5dd15d95", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Maseru": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Mbabane": "cee12167324950cf0d21256df7848887", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Mogadishu": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Monrovia": "896a875aafa39c10b614c9803d1f2673", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Nairobi": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Ndjamena": "a0aad5ca661653e362b8afc808dc85c1", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Niamey": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Nouakchott": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Ouagadougou": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Porto-Novo": "cbf77594f31a10b4e5a6d635638f8aa6", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Sao_Tome": "06142521165cb91ddc40c1d9000c7038", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Timbuktu": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Tripoli": "edec79f292e5b8c0d32b521af1f118bd", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Tunis": "4f1b4fe95a2512916e20c6f6e26d8e3c", |
| | | "dxmodules\\zoneinfo\\posix\\Africa\\Windhoek": "6e9276508be4c6bfa224b9dddfefa61e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Adak": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Anchorage": "596428a3a840d568656088bd48e608f1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Anguilla": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Antigua": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Araguaina": "f41ab2d0a7a5b7fa0e3d3ac456b6bc97", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Catamarca": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\ComodRivadavia": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\La_Rioja": "00095a6391dda3fdca483ec5847abf2b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Rio_Gallegos": "b97bc475f57e6b72c5ef969ed629e144", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Salta": "ed7e059362f3ae6381c2390798b0d524", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\San_Juan": "7c35305a9821e159720fae50b96790ca", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\San_Luis": "3e91f210d3eedf4543a4b716a5ba504c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Tucuman": "b58092fe8d0461c10f5c3153ad9ed653", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Ushuaia": "b1d065d0cd8358933796fe3f034d799a", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Aruba": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Asuncion": "09a3f0569913d138c4f5d8c0c97c055c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Atikokan": "6b028d3f8073ba06f9467133f6a1a0dd", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Atka": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Bahia": "2f5dd75c9ee116e4ca290849dfff7a9f", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Bahia_Banderas": "6d24d30bc671042918ba397a15e6114c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Barbados": "92550378b8952475d3bffe20b1168820", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Belem": "432beed5d93041f2b551051332d7d72e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Belize": "da3145d79cba5f541dd261434e449173", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Blanc-Sablon": "4169ae15c5a1477cfe281fa7702bcc14", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Boa_Vista": "a98b8a6d614366047943d78bc1896acb", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Bogota": "cb5574ae9b01614c9e8c082039fe8147", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Boise": "45dce4d7ef2491d2450d16565f878b02", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cambridge_Bay": "048d33fc74c19008a5a440b8b226cb45", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Campo_Grande": "6e2912b5b855c5e6d39eeb1bcf19aea5", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cancun": "a2fe4da50cfb1afe8a46d6f55b805afa", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Caracas": "a5bf9cdb87d451a4aabad61d4ce91a2b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Catamarca": "ba971af9e1d8a0c07587f35626684928", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cayenne": "e9f3bdd863a3cf2127077a21e918b057", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cayman": "843b6eadcdd7838269e2195df886ebf1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Chicago": "d0f076c9f390e7d8a933cc7cc1ad2e90", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Chihuahua": "75c741bb811f4ee563ce05eb976e53a1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Coral_Harbour": "6b028d3f8073ba06f9467133f6a1a0dd", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Costa_Rica": "2dec281340a45276b0799a3bec48b76b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Creston": "dbf874c388dc236612025d145b46d868", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Cuiaba": "71d500778aa9de635b9438695cf8b61e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Curacao": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Danmarkshavn": "20e68f0a941140b269efb3af346b1e34", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Dawson": "9c8e92765ad27141e3a56f6a31599c99", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Dawson_Creek": "f7955656cccdf253d996deb5bb4176ef", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Denver": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Detroit": "ae3ba6ed8738ceda9eef109c6c586736", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Dominica": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Edmonton": "1f23503189b8ce70677b2dcbb4a57e8c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Eirunepe": "236e0fa8dd250599b2146a7a203a6ae4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\El_Salvador": "b77c5f52b45573ae0f5673ac0ca1b086", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Ensenada": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Fortaleza": "2e202e859552b09ad60cdc408de47c94", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Fort_Nelson": "8853bd10553d7ca5eb5f0b9c7af5a047", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Fort_Wayne": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Glace_Bay": "6ba1b7da532cefb6e32d083377b71303", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Godthab": "4a1f3fd710057cfeaf3e7ac964a18466", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Goose_Bay": "18a9d1af32911f30273fabcc694d9654", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Grand_Turk": "539dcee68a715238ef8aa5642a9b5214", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Grenada": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Guadeloupe": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Guatemala": "097638f469fdba70e9637561cffefd91", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Guayaquil": "bbe67886e74ffd7d1ed09a3481b5120c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Guyana": "7fb63c484765baf41049bd41cfca0184", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Halifax": "820f35f23d49a527ffe813e2d96c5da7", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Havana": "1877fc45317e144ea206ddc622cebba2", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Hermosillo": "7bdce7a211e50eff3b5b8de21a46d581", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Knox": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Marengo": "541539f004b1b1722ac96e897d06ac45", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Petersburg": "82b5d3f05f88ac02cb5a4c3fb08fa191", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Tell_City": "dfe557585c608ee9e34e9b75fbe72617", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Vevay": "d0f3d93603268abdfeb402bbe0c3c0b3", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Vincennes": "d13258dc61c8a747a914396a56e4218c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Winamac": "e6b915ae1c01b71fd7b42b00b4664029", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Inuvik": "4ea2c19a83f810220c7302c9914e4ee4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Iqaluit": "4142e0b137ac6cf3fdad0fce11560ca1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Juneau": "6276c692ca4f68dcb846d7e918ee23dd", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Kentucky\\Louisville": "99545115e4f688d7f573d38d667194d9", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Kentucky\\Monticello": "4041c24d41fbbd407e4d398824225d50", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Knox_IN": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Kralendijk": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\La_Paz": "962d2f2486d3c16a6095390156e322b3", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Lima": "cc24c83127c28793afc54e43fe5766e4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Los_Angeles": "9323ff44ce205ce1a1bad7e2dca39939", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Louisville": "99545115e4f688d7f573d38d667194d9", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Lower_Princes": "ec6b184bca638f7aabed9c8bca9aa84c", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Maceio": "378a3e07cabc7773b6078025e9981793", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Managua": "4667d4aa7d530f1f61f5b116258eb84d", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Manaus": "585a0b598d406e6c0d710182bbdba35e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Marigot": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Martinique": "ecdf79bbd2c17670a4637d06b01d7819", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Matamoros": "9ba17635ae8f44fa50c4565328433383", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Mazatlan": "2a157b818df8ab296baf6de38cd7d32b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Menominee": "c720185d11deb83ad58b22b118830261", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Merida": "91ebe16317802987c2cd9c567b6e4c2a", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Metlakatla": "02b06c27e6b6de8398ac263055a2d280", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Mexico_City": "cff58c6976849e1e8f94d4288b07b9d2", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Miquelon": "ac08a2e10dea976318846a7f7b254f26", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Moncton": "2fa9e016bc7e55f51d036a158a40e0e9", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Monterrey": "f77b22ac5e4f995ef8d4839835a54faa", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Montevideo": "51fb8d4c68e90f30d5eb1dd503bf202e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Montreal": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Montserrat": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Nassau": "1444a5132c9a26f350ebe705760215c7", |
| | | "dxmodules\\zoneinfo\\posix\\America\\New_York": "e4ca381035a34b7a852184cc0dd89baa", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Nipigon": "365984faa12e0762dac780bf71204633", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Nome": "f9cb8bbe99e6143a75b2797ddf94f234", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Noronha": "a8562cc7d0e4555968ad7744dceb9d43", |
| | | "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\Beulah": "59406487459534f8844f828b8356d083", |
| | | "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\Center": "6964f42dc925648abaa448f18b330d46", |
| | | "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\New_Salem": "c14a42a9b8d8571354c8ced6fa931eac", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Nuuk": "4a1f3fd710057cfeaf3e7ac964a18466", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Ojinaga": "95e6bee1cb146689410010d58e6ee974", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Panama": "843b6eadcdd7838269e2195df886ebf1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Pangnirtung": "b71f8c6f5a9b289c981af0cdbf80f7e1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Paramaribo": "2d11461cf62c48496eb9a866b3eb1712", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Phoenix": "c697bb02e057325a74547912f631a3a7", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Port-au-Prince": "27e4cb1b082cd694df8c1b2f27838f85", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Porto_Acre": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Porto_Velho": "63160b0eb1d694ae0f97644160eea68a", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Port_of_Spain": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Puerto_Rico": "b3feb20144b4070d5eff32dab8c8a160", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Punta_Arenas": "9c43769cae1008f7fd054e807960a9cd", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Rainy_River": "4bdb5a197d174ac4834b4e738340fdf6", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Rankin_Inlet": "902bc59be5586a60cf0c67188027f7c4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Recife": "a9b9203d577c57c1cbf0873327336ac1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Regina": "cec6491b350dfbdb74732df745eb37d3", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Resolute": "e272bb16aa765ea5439726dde6f283eb", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Rio_Branco": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Rosario": "7b404b9cb52ed64b6fdecd3a623f828b", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Santarem": "31689ae81ac7aea65cc5784da4560e73", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Santa_Isabel": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Santiago": "b8db6707d0c4f0dfc7a12be81d35df8f", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Santo_Domingo": "7edb49f18d76f116c5578c3dcd279ade", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Sao_Paulo": "339ff8dbd88e39f59b2fd4ee57b1fdb1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Scoresbysund": "1a5f6775efbfe9befc36df0a3d19c594", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Shiprock": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Sitka": "efa4e4969d3d0423dc3429a756921244", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Barthelemy": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Johns": "79d938b80bf215c8e13d2cb4727343d8", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Kitts": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Lucia": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Thomas": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\St_Vincent": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Swift_Current": "c74726e554d359f38a26870282725f04", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Tegucigalpa": "963e88d190d129470f37774310dd20e4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Thule": "32b5bb9f1f25d306246bd96a0ef317c4", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Thunder_Bay": "aa82e0d2a447d3610f4c2eea10c2a7b8", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Tijuana": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Toronto": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Tortola": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Vancouver": "9d48c60fed12ae8a6f5b139bf0b254b5", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Virgin": "6764b4898d885ffe98315abf798540ec", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Whitehorse": "3b82b92569a6900dadc0aa62c7cb6f36", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Winnipeg": "f0683580a6116b3c744cb6b3d63aa0b1", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Yakutat": "ee0f462df87e663c328908c5e81260d0", |
| | | "dxmodules\\zoneinfo\\posix\\America\\Yellowknife": "b5087ae9a8ccc013470ebf44bc635281", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Casey": "f6d44d9ea6501a60287aeff26715bef0", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Davis": "80a08215623fd38f21aa72861fdf54cd", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\DumontDUrville": "e3f2c24ea8bfb0c5bea7a209cfd1baae", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Macquarie": "7c8809733d07903666654c0e67aeaec5", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Mawson": "d285e96947e86928c647ab2b2cf185b5", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\McMurdo": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Palmer": "3a6a847fb145840a4941337c2ae86d96", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Rothera": "70e1309683f8a4afa2f0d752bf97b46c", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\South_Pole": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Syowa": "553ede0b9071e1364892b1ed27a7f1a6", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Troll": "f13b257391af38577970477597e9d499", |
| | | "dxmodules\\zoneinfo\\posix\\Antarctica\\Vostok": "4bb37b331311a0867117d218adf10610", |
| | | "dxmodules\\zoneinfo\\posix\\Arctic\\Longyearbyen": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Aden": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Almaty": "938c35fa2fdc23ae382ad9b2278c6f58", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Amman": "63694da35da6a976fb37a62debd191a4", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Anadyr": "5648ae758f6447668653221263b5ea9d", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Aqtau": "d020e6bedcd22c98f021e7c1c3ed8ee4", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Aqtobe": "486c6c79d56174ee29d05fc6efd9e18e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ashgabat": "235b16a54519989a51679188703ca5ac", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ashkhabad": "235b16a54519989a51679188703ca5ac", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Atyrau": "5fbe4e89da1f20229c0c3747017557c0", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Baghdad": "af9423b28aad58ffc1790d29244309b8", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Bahrain": "fc5a2c1c087d56e4b7323259ab62bef6", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Baku": "27e366b2523ae3dfd1e648ecdf54bc15", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Bangkok": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Barnaul": "cfefaae119b421f5b3c990ef4948ebf7", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Beirut": "785117e925db8afec6b0c761163b002c", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Bishkek": "5dec7f8d19f19560c2fd59b16f2a2214", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Brunei": "3db4e51993e234a73f7054160abf663d", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Calcutta": "569f373970581e6488a24b5c70326d49", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Chita": "6b2c484a3c93d7523cd09ec0d13b53fe", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Choibalsan": "8ca46182ff4884d5b45c3c41e777783a", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Chongqing": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Chungking": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Colombo": "12c255c649eaa1ade0387c30596825d9", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Dacca": "ea255e2dada4541d25ad34139c18419f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Damascus": "07b6153d721b5d7d93d78f2591201ffa", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Dhaka": "ea255e2dada4541d25ad34139c18419f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Dili": "5c7fb0d932343cc330df273a5bb9308b", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Dubai": "e17583385b056a775970e7bcd9a6b7dd", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Dushanbe": "29a7b7661ea6575cd7f8ba1435b78f1d", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Famagusta": "14a69e4234b2f2c02a3d3a46d0ecffbb", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Gaza": "798a2fa999dfbd3d557b0afeedc99562", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Harbin": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Hebron": "f600ca83e00a4c2d046dbd5ae0461018", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Hong_Kong": "1f5267f14578c917d94c972e46fc8e0e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Hovd": "585f478cf864b0065bd07587e6b1e41f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ho_Chi_Minh": "104047aa22a3824e08e4fffeccc80d19", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Irkutsk": "8a84642c58ed64282884014698df2f7d", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Jakarta": "c280819a288b0aea09db4fd1fd017546", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Jayapura": "75c2120efce23b61989c6a15635d115f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Jerusalem": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kabul": "47a295d1de026d2e443c132316ed4533", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kamchatka": "da5950adc8bcdb823cff01b81d2d1ec9", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Karachi": "b1afc0a7ce4118813cdc8679e8b20d8a", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kashgar": "a43f32e98fa40e6601db5cca019a01a8", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kathmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Katmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Khandyga": "d8845dc2bfed88c1aef353c99c332d8e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kolkata": "569f373970581e6488a24b5c70326d49", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Krasnoyarsk": "6459a2dc5df86eecb3d8d881e285fbc5", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kuala_Lumpur": "8a0970a2f6db03aa6317757fe59d24e5", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kuching": "941bf864c5cd1bcbcba5bf386815338d", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Kuwait": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Macao": "f61abab83b519b307988b2c9e1c13037", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Macau": "f61abab83b519b307988b2c9e1c13037", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Magadan": "7d44faf13ac5b3facbd83ff3857a0e1e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Makassar": "13cba3c3bb605214bf3464922974ca13", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Manila": "7edfd09b1ebe5e5a152a03a7a705f5bc", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Muscat": "e17583385b056a775970e7bcd9a6b7dd", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Novokuznetsk": "d5f8acb7b4e7d664a04dd154980eda1f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Novosibirsk": "b6434f1e22bf4098c2a8c5371dc301fe", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Omsk": "e789f5c5cce168d524f5a8c2486b62ba", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Oral": "2586cc76cb792e5a3e56f5c130892c93", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Phnom_Penh": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Pontianak": "75dbcd818e883badda4d6df52f07c9ae", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Pyongyang": "55ccc2dfaf651c7452baf53f3c0bcaa1", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Qatar": "fc5a2c1c087d56e4b7323259ab62bef6", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Qostanay": "6f2759a853ade2f4c50fddc156e833c6", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Qyzylorda": "2794eeaae5075fae6c902660beae2141", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Rangoon": "facd5e2823e744613e5d83384b53b17f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Riyadh": "129654b1aa89b1c15adfb645ecf0909f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Saigon": "104047aa22a3824e08e4fffeccc80d19", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Sakhalin": "d065dcba4d1f2f8df4862ea639caf3f3", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Samarkand": "7c0752cecdf1b32c7618128577045bcc", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Seoul": "f7a6e371bd709b3c2f64ce6f67f39f29", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Shanghai": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Srednekolymsk": "9e7e46bbc5dad40e5f90e797d941d22e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Taipei": "2e67467e3c050e8b3a4022eb9e20300e", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tashkent": "3e47dbc84c7895e2cb890776d3ad119b", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tbilisi": "da70a44f47a6a309eff8c9302fecf559", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tehran": "d2cb514595346f1168c2f1167409ec7c", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tel_Aviv": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Thimbu": "97be2e1f7789978b407476a8094d5ee1", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Thimphu": "97be2e1f7789978b407476a8094d5ee1", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tokyo": "478afb8b1f182b2ff53caa2e6cc8ffd9", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Tomsk": "903e9bdc80298a4433a48219a071d4af", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ujung_Pandang": "13cba3c3bb605214bf3464922974ca13", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ulaanbaatar": "3f0446e3735c9dd93089eeae31a37c1b", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ulan_Bator": "3f0446e3735c9dd93089eeae31a37c1b", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Urumqi": "a43f32e98fa40e6601db5cca019a01a8", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Ust-Nera": "4d04e65ff5d8c7b407d6cb8dedbe33a4", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Vientiane": "a8fc525118cfe44167208f386928b338", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Vladivostok": "cecab70411f0df191ef4a2cb747bdb08", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Yakutsk": "bfef1f6f86fa7080259fd26f7668bc84", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Yangon": "facd5e2823e744613e5d83384b53b17f", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Yekaterinburg": "807931acd2f4fa27806b8208de988391", |
| | | "dxmodules\\zoneinfo\\posix\\Asia\\Yerevan": "e196b792aab3b785a957682c74f574e7", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Azores": "5433c796c8a770b6b06fe812ae08527f", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Bermuda": "659000f311b0ab5c90442cb81278c62c", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Canary": "167a786aa74ba2a9dd68c470746aa0ac", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Cape_Verde": "b3795953b76fb3cc553fdbb4d825cb93", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Faeroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Faroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Jan_Mayen": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Madeira": "2e4a8509560836b8341ec2e612627005", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Reykjavik": "d5e2f791bed996743c667784bb8c52ea", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\South_Georgia": "f0b2aeeddf3200b6a5839d86f35879e6", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\Stanley": "5a5247cc12a456fee6716540c14e55ad", |
| | | "dxmodules\\zoneinfo\\posix\\Atlantic\\St_Helena": "74c6fb9ae4ea68d0012c1f6ad42b5848", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\ACT": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Adelaide": "a3ec822dc0c8fd04e431b3316d1166ca", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Brisbane": "0c8a54dfc42c9a987fff25d5d72096fa", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Broken_Hill": "c0a218c9fe25b535b4a1a6b70dad3af2", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Canberra": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Currie": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Darwin": "cbb2b15b2c2034c2584f801cec184e2b", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Eucla": "1459b57ff3474bbe12013908f4bed8aa", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Hobart": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\LHI": "b664b61c1949c1beea8838facf6c1d8b", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Lindeman": "4d125f1a5ec84cf6f62607152dedf324", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Lord_Howe": "b664b61c1949c1beea8838facf6c1d8b", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Melbourne": "5f06e3a482d43ee4018736ac792b1129", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\North": "cbb2b15b2c2034c2584f801cec184e2b", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\NSW": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Perth": "a54a9120fddca3a9bb951ac9d8bce260", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Queensland": "0c8a54dfc42c9a987fff25d5d72096fa", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\South": "a3ec822dc0c8fd04e431b3316d1166ca", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Sydney": "b5966da18e9c1c7f416acf99aa06eee6", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Tasmania": "4f9453d5757b8d950509849eca148f75", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Victoria": "5f06e3a482d43ee4018736ac792b1129", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\West": "a54a9120fddca3a9bb951ac9d8bce260", |
| | | "dxmodules\\zoneinfo\\posix\\Australia\\Yancowinna": "c0a218c9fe25b535b4a1a6b70dad3af2", |
| | | "dxmodules\\zoneinfo\\posix\\Brazil\\Acre": "2dd6a364634c61cacdefec7874cea115", |
| | | "dxmodules\\zoneinfo\\posix\\Brazil\\DeNoronha": "a8562cc7d0e4555968ad7744dceb9d43", |
| | | "dxmodules\\zoneinfo\\posix\\Brazil\\East": "339ff8dbd88e39f59b2fd4ee57b1fdb1", |
| | | "dxmodules\\zoneinfo\\posix\\Brazil\\West": "585a0b598d406e6c0d710182bbdba35e", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Atlantic": "820f35f23d49a527ffe813e2d96c5da7", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Central": "f0683580a6116b3c744cb6b3d63aa0b1", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Eastern": "cac1d4298f3576d2d10e9fa1c0da3b54", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Mountain": "1f23503189b8ce70677b2dcbb4a57e8c", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Newfoundland": "79d938b80bf215c8e13d2cb4727343d8", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Pacific": "9d48c60fed12ae8a6f5b139bf0b254b5", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Saskatchewan": "cec6491b350dfbdb74732df745eb37d3", |
| | | "dxmodules\\zoneinfo\\posix\\Canada\\Yukon": "3b82b92569a6900dadc0aa62c7cb6f36", |
| | | "dxmodules\\zoneinfo\\posix\\CET": "3f166816639388adb3d3567e28ef2145", |
| | | "dxmodules\\zoneinfo\\posix\\Chile\\Continental": "b8db6707d0c4f0dfc7a12be81d35df8f", |
| | | "dxmodules\\zoneinfo\\posix\\Chile\\EasterIsland": "ea76f04afd1b377b869cd7532b35457c", |
| | | "dxmodules\\zoneinfo\\posix\\CST6CDT": "8396c3e49c717f9ba736b4d4d1b24b8b", |
| | | "dxmodules\\zoneinfo\\posix\\Cuba": "1877fc45317e144ea206ddc622cebba2", |
| | | "dxmodules\\zoneinfo\\posix\\EET": "16b84f2a83840fd4132c2e3fbff3b758", |
| | | "dxmodules\\zoneinfo\\posix\\Egypt": "b9bb9d8c3cddc72252f4aa2082af4213", |
| | | "dxmodules\\zoneinfo\\posix\\Eire": "0e226ce4b36682f2c9c2fa1146809778", |
| | | "dxmodules\\zoneinfo\\posix\\EST": "d0f150b6acc4dc78b8ada8abb1079af6", |
| | | "dxmodules\\zoneinfo\\posix\\EST5EDT": "e7a28a1315bcd4deedaaac6d1c3cd3e2", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+1": "169210c55520d3a8efc1362a5d89e402", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+10": "03d40b4007e96680e56f10372148cf51", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+11": "bb030b7fea0da0987217737e22a9cbe0", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+12": "66046646734491458066327a04705b0c", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+2": "0a97351084a016afb88b8b698ea922d8", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+3": "73897f3686a7bca3e2719cfa59f83b6b", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+4": "e943df1168ea3d597ec62c8933a11a9c", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+5": "a9d53018097b6bcca5e6a4e55211e80b", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+6": "0a8c24c796c1473250ff564fce59e937", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+7": "d87007923e671b8b78552d613299ac8a", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+8": "e99240e190c8a4ccf3cc0a26618fb09b", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT+9": "e77b0b4911d483289610c4efcd599d7d", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-1": "a3c457b6cc2c3be7f34da00d84ec229e", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-10": "8ed77c9096196e97be5f0807bf939bac", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-11": "dcdc4caf8194fa9d29ceccdc225a5048", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-12": "fe87b6111ce93c3d10fe152ca715a715", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-13": "0fd6f7e68d38e1cef98efdc6ecedae80", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-14": "155f8eb5a5dd22c81eef6986c8c5317c", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-2": "a9eafb629b4070ca0ff8f99631390031", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-3": "b73ddab7b5ca9128a8b2925fad5b11f0", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-4": "0c08dc6b2974b3207bf6293544a236b0", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-5": "57ca1133eeeb09c7c30c04850d49d4e5", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-6": "642170284ddc2575f5e077d7ea33dcdc", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-7": "2f4d1ba17adf0c86acb4cc6258f8a0cb", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-8": "f4d3b2b664698da9268d3f244fec9232", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT-9": "02963228a1537cc2c8bdf22e99178893", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\GMT0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\Greenwich": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\UCT": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\Universal": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\UTC": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\Etc\\Zulu": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Amsterdam": "e3b0d618da0bd60d894183dd0d53923e", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Andorra": "8bfff3a580b4b0db3dff30d1d7385ac4", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Astrakhan": "ba197918d51925f1e0b771923ce3a19f", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Athens": "75d641576f8d4376045ba8f16db4063a", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Belfast": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Belgrade": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Berlin": "4790e83465681cefbf852aed265354bf", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Bratislava": "eab2cea5cb5bf0374f6bf891b9102844", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Brussels": "3d5d93412e485bac12e0587239835fd9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Bucharest": "751205baadb94c5f41dadbcc97ab23db", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Budapest": "f76d3a5131d6910f5c2a34fbe35c265e", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Busingen": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Chisinau": "717476d2fe0213c40e31f52573c05356", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Copenhagen": "96039e70388d843950bcbef21328bba6", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Dublin": "0e226ce4b36682f2c9c2fa1146809778", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Gibraltar": "77fe14fec44142c1435dcc4eac003df4", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Guernsey": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Helsinki": "3eaa8467ffb21b15bd75200ff2c0a3db", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Isle_of_Man": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Jersey": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Kaliningrad": "7dc8e4aecf6dcf214b52938e289c9831", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Kiev": "f957769855be8b9d5983e51c033975d8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Kirov": "6467d1d15049cb0015bbd56c92b18814", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Lisbon": "b9ba38decf09fe0728f81ebeabf29cfe", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Ljubljana": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\London": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Luxembourg": "3242615a805f051357309a89874633f3", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Madrid": "3ecb0fe1a9207bc3f77e793315ce0e5d", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Malta": "b6e707a0d755cfd038a7c4ecc44845e7", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Mariehamn": "3eaa8467ffb21b15bd75200ff2c0a3db", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Minsk": "07aeb33b58212d75e92b8eb157cc1624", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Monaco": "89271b78b389e6180385b96e7af94e7a", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Moscow": "223bbf37352a9d4807919132f360535e", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Oslo": "bf4f10e6703e5142a7c4d23dc4cd7ef0", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Paris": "fe22373ca65df6ba6b254f5c4304fae8", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Podgorica": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Prague": "eab2cea5cb5bf0374f6bf891b9102844", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Riga": "b4541699f68b4aba0daa45df63e596a4", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Rome": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Samara": "d390934cf2dc01f033ffda93394c85d7", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\San_Marino": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Sarajevo": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Saratov": "756b361dc39b978b78eaf6df78a7ad0e", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Simferopol": "9b2ddc8ca9d5c792d09f37ca58104afa", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Skopje": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Sofia": "68e6be692f44b3ed696fd2e6ef806927", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Stockholm": "1b9ed89af7331c6141249d181b42c621", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Tallinn": "46abec9f16a148333139ff5b0b6d1115", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Tirane": "d5977bad592e33b2e4058a242d735927", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Tiraspol": "717476d2fe0213c40e31f52573c05356", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Ulyanovsk": "ff8f50dd006548eb8751802c600f2299", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Uzhgorod": "0b4761ce9ee17b7b8bfb0d12063803c6", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Vaduz": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Vatican": "1c1a2a92e0bacf58566a499c272371a6", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Vienna": "cb0f39744833718fbd602c54e0425157", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Vilnius": "524d360c5369c1abcb59e8140b59acda", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Volgograd": "442a047745c83ebebc180c67f6798fc2", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Warsaw": "2ed881ef7e09c844c009673ded84c798", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Zagreb": "226ad0c2724b4674d6a9206a43661ff9", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Zaporozhye": "69430a5e3e93bd0ed6e2e604ddf6e903", |
| | | "dxmodules\\zoneinfo\\posix\\Europe\\Zurich": "b54a7b1f6e77f2fbdccce79bb64fb32d", |
| | | "dxmodules\\zoneinfo\\posix\\GB": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\GB-Eire": "410c65079e6d14f4eedf50c19bd073f8", |
| | | "dxmodules\\zoneinfo\\posix\\GMT": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\GMT+0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\GMT-0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\GMT0": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Greenwich": "fcccbcf95c718cf2fdee557763e460be", |
| | | "dxmodules\\zoneinfo\\posix\\Hongkong": "1f5267f14578c917d94c972e46fc8e0e", |
| | | "dxmodules\\zoneinfo\\posix\\HST": "fd4ae9e0296519fb47b4b036ea4af025", |
| | | "dxmodules\\zoneinfo\\posix\\Iceland": "d5e2f791bed996743c667784bb8c52ea", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Antananarivo": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Chagos": "dfb323eb6037596036669f4b4505544c", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Christmas": "02b16169f8f47de904f3f05cb7f72583", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Cocos": "d9ffcdd40666dcb76225bdfb4654c0cf", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Comoro": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Kerguelen": "749273edab499ed254e32606a9e5579e", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Mahe": "0df488f823d924b336f01d53d270af73", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Maldives": "89a066bf0512071db2a9eb425df46341", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Mauritius": "8f06c0fc457b6a12c0bbc4946e2dfb05", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Mayotte": "d25adca22556aa3ce379975a2c017ddf", |
| | | "dxmodules\\zoneinfo\\posix\\Indian\\Reunion": "817b0a2e45ae9c1e566499a4b068295e", |
| | | "dxmodules\\zoneinfo\\posix\\Iran": "d2cb514595346f1168c2f1167409ec7c", |
| | | "dxmodules\\zoneinfo\\posix\\Israel": "9976080898f0f1603a45672ff90e0795", |
| | | "dxmodules\\zoneinfo\\posix\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af", |
| | | "dxmodules\\zoneinfo\\posix\\Japan": "478afb8b1f182b2ff53caa2e6cc8ffd9", |
| | | "dxmodules\\zoneinfo\\posix\\Kwajalein": "6d9261ff9442c0cf69446e362202d691", |
| | | "dxmodules\\zoneinfo\\posix\\Libya": "edec79f292e5b8c0d32b521af1f118bd", |
| | | "dxmodules\\zoneinfo\\posix\\MET": "3b07c8cc8c1fed960246da4e3791a73c", |
| | | "dxmodules\\zoneinfo\\posix\\Mexico\\BajaNorte": "f62f2b82ca05aafdbf7df7dca812df80", |
| | | "dxmodules\\zoneinfo\\posix\\Mexico\\BajaSur": "2a157b818df8ab296baf6de38cd7d32b", |
| | | "dxmodules\\zoneinfo\\posix\\Mexico\\General": "cff58c6976849e1e8f94d4288b07b9d2", |
| | | "dxmodules\\zoneinfo\\posix\\MST": "04da8453f31d6971b7fa4f3f8fb26654", |
| | | "dxmodules\\zoneinfo\\posix\\MST7MDT": "76be6718eb3cf4ac468387b5d13ffafb", |
| | | "dxmodules\\zoneinfo\\posix\\Navajo": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\posix\\NZ": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\posix\\NZ-CHAT": "0e76ddb8bb10f4b8f2ee092f731b6452", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Apia": "6b2ba3b8fc50b635cdc0c1f117243439", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Auckland": "2bcf2f33917bed5122c58a4f208066a9", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Bougainville": "e2da4052206976c32cd533f22f0bcf15", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Chatham": "0e76ddb8bb10f4b8f2ee092f731b6452", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Chuuk": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Easter": "ea76f04afd1b377b869cd7532b35457c", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Efate": "25c51b2838decef2f9d90c15e4ef7d3c", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Enderbury": "6356a41b8b79885979b2b6613abecb73", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Fakaofo": "de7a32503bd8fdc5baec11e6b9aad69b", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Fiji": "7133b1eaf825848a26c6fe35f2601908", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Funafuti": "eb33daa3195c75c1a5b54b14fe461b73", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Galapagos": "684faae885b8ab403c2a54b9f1eecea9", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Gambier": "921dd1aee0026d9b376f293ce4f246bc", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Guadalcanal": "1de7b39a3bcdce97e8c93d336157dd8b", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Guam": "af8e7d6ffe7865cc595b49479e53d408", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Honolulu": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Johnston": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Kiritimati": "f5876d683bfa2f0339c3c048224e430f", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Kosrae": "ef22d34dcb3734017a59ecc62ab84713", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Kwajalein": "6d9261ff9442c0cf69446e362202d691", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Majuro": "86a054fd15bfbd9fe15156ba7f4155fd", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Marquesas": "e05efeb2e72d3a51e6019499841b509c", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Midway": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Nauru": "4f7dd62a8207d60009300c99c1773846", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Niue": "2d69ed1a3e4496ecd16c94846675a0f3", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Norfolk": "0ba7dc541ce5ad91b2d0aa81589ee205", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Noumea": "48f634aa56c4cfee3f6afd37b28b66b2", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Pago_Pago": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Palau": "3ffa839dec8323e475526d5cd38fa82a", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Pitcairn": "42e5aa28598d96efb16eb6734f31fda6", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Pohnpei": "45f293ec35daa27a60c7e0c90b58012d", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Ponape": "45f293ec35daa27a60c7e0c90b58012d", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Port_Moresby": "c43a5f332114d2a9cd1d6c9f259c71f3", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Rarotonga": "770947b4fd41633dc1d9cecc1ee972d2", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Saipan": "af8e7d6ffe7865cc595b49479e53d408", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Samoa": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Tahiti": "cdbc49403d1d7684e83fdfc258106885", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Tarawa": "b2564fba66250ab89502eec6d72c0c5e", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Tongatapu": "db7a5ceed05b395c4660be082a4377da", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Truk": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Wake": "5763840e0d743d0555d9f0813404da80", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Wallis": "36b100715cbee093d7c6056eaf60aeeb", |
| | | "dxmodules\\zoneinfo\\posix\\Pacific\\Yap": "dcfd7e5eb42ee9d9f462407ae6603d95", |
| | | "dxmodules\\zoneinfo\\posix\\Poland": "2ed881ef7e09c844c009673ded84c798", |
| | | "dxmodules\\zoneinfo\\posix\\Portugal": "b9ba38decf09fe0728f81ebeabf29cfe", |
| | | "dxmodules\\zoneinfo\\posix\\PRC": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\posix\\PST8PDT": "c9452f6b9e08d83c6815c38600798964", |
| | | "dxmodules\\zoneinfo\\posix\\ROC": "2e67467e3c050e8b3a4022eb9e20300e", |
| | | "dxmodules\\zoneinfo\\posix\\ROK": "f7a6e371bd709b3c2f64ce6f67f39f29", |
| | | "dxmodules\\zoneinfo\\posix\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3", |
| | | "dxmodules\\zoneinfo\\posix\\Turkey": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\posix\\UCT": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\Universal": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Alaska": "596428a3a840d568656088bd48e608f1", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Aleutian": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Arizona": "c697bb02e057325a74547912f631a3a7", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Central": "d0f076c9f390e7d8a933cc7cc1ad2e90", |
| | | "dxmodules\\zoneinfo\\posix\\US\\East-Indiana": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Eastern": "e4ca381035a34b7a852184cc0dd89baa", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Hawaii": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Indiana-Starke": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Michigan": "ae3ba6ed8738ceda9eef109c6c586736", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Mountain": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Pacific": "9323ff44ce205ce1a1bad7e2dca39939", |
| | | "dxmodules\\zoneinfo\\posix\\US\\Samoa": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\posix\\UTC": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posix\\W-SU": "223bbf37352a9d4807919132f360535e", |
| | | "dxmodules\\zoneinfo\\posix\\WET": "92388453e62ec1a69fbf12685ad247c7", |
| | | "dxmodules\\zoneinfo\\posix\\Zulu": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\posixrules": "e4ca381035a34b7a852184cc0dd89baa", |
| | | "dxmodules\\zoneinfo\\PRC": "8e579768533a9aff0c73ab48a41be20f", |
| | | "dxmodules\\zoneinfo\\PST8PDT": "c9452f6b9e08d83c6815c38600798964", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Abidjan": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Accra": "255520b3cb5f796d992bd52bdc839d56", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Addis_Ababa": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Algiers": "dc7f41bae1e1b345035837c6906d2f1c", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Asmara": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Asmera": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Bamako": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Bangui": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Banjul": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Bissau": "f9a1ce1e51007b314f4dbb27844724c7", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Blantyre": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Brazzaville": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Bujumbura": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Cairo": "c0216212a93d68f21decbbc1f0675104", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Casablanca": "ce60e1f9ec1b5a9b18c628d3dc8a0cc4", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Ceuta": "92a85bb65bee16f54ff4f05b7a335dd2", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Conakry": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Dakar": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Dar_es_Salaam": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Djibouti": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Douala": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\El_Aaiun": "f10771f58dd1f28f45157eda123196e1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Freetown": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Gaborone": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Harare": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Johannesburg": "5280e94d5521939f68b5550d5f6c24d6", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Juba": "894503e89177c5ac997b405e476f0b90", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Kampala": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Khartoum": "30901eba0d53204dc8eaa9c9299893f8", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Kigali": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Kinshasa": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Lagos": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Libreville": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Lome": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Luanda": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Lubumbashi": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Lusaka": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Malabo": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Maputo": "1c10fa1b37a4a62fc7dc0f8f2ba461ae", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Maseru": "5280e94d5521939f68b5550d5f6c24d6", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Mbabane": "5280e94d5521939f68b5550d5f6c24d6", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Mogadishu": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Monrovia": "86cab61bd646f40aa46cd5c1ee80a2fc", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Nairobi": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Ndjamena": "eab0671bca010ceb9da03005e6fc6880", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Niamey": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Nouakchott": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Ouagadougou": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Porto-Novo": "fdd731ea652a9ed57cf66dd46690842e", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Sao_Tome": "1793151a4454db88070f6caf62c2d45f", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Timbuktu": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Tripoli": "140c8538c93832c7c7ae0e40d592dd33", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Tunis": "38ccd67fb776c5af2edf8e925c10f956", |
| | | "dxmodules\\zoneinfo\\right\\Africa\\Windhoek": "760491921188579dd193bb89f2650a38", |
| | | "dxmodules\\zoneinfo\\right\\America\\Adak": "282e70d388dfd3923238b8ca86244246", |
| | | "dxmodules\\zoneinfo\\right\\America\\Anchorage": "be6e5ef83221831fd57a032e03246920", |
| | | "dxmodules\\zoneinfo\\right\\America\\Anguilla": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Antigua": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Araguaina": "4c90a3a30f8a255daccba781fa8b119e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Buenos_Aires": "7f85ebd305bc1f7a173caf79f56e77aa", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Catamarca": "e4215654b35cc84b7de145a99ba2a8d4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\ComodRivadavia": "e4215654b35cc84b7de145a99ba2a8d4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Cordoba": "790e6c0ccdc0a17b0087bb7301434648", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Jujuy": "068eec3da9e503286b7c90c971573616", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\La_Rioja": "71958e1b5b3be0f35981845e14efef81", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Mendoza": "b95d8152904b0fdf042c6f5167ff90ab", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Rio_Gallegos": "629f976661deb50db7be073b3855b1f7", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Salta": "af0b9512b0dcc379b6f8ba6ddd7d369d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\San_Juan": "f2fb8b1669d16992662ec824a2e14cb2", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\San_Luis": "08bbc43d6dabe797db33e439d7bce790", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Tucuman": "36d861157f9c70e9dda84b82a34a3ea0", |
| | | "dxmodules\\zoneinfo\\right\\America\\Argentina\\Ushuaia": "c75191b4db13d1b265b118754debe666", |
| | | "dxmodules\\zoneinfo\\right\\America\\Aruba": "a3dd71a0d51b6cd76218b8d299ba7a93", |
| | | "dxmodules\\zoneinfo\\right\\America\\Asuncion": "33de989fafc47189f03da27c62698373", |
| | | "dxmodules\\zoneinfo\\right\\America\\Atikokan": "b73584d3158e258d8c2b8a43795e2fc9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Atka": "282e70d388dfd3923238b8ca86244246", |
| | | "dxmodules\\zoneinfo\\right\\America\\Bahia": "e4e5ec529a25a5e1c5d0de9080e0b80c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Bahia_Banderas": "c4d9dbbd094173ced5c98e67415078d2", |
| | | "dxmodules\\zoneinfo\\right\\America\\Barbados": "167070d16fcfd7709c995c5f08804df9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Belem": "3ffce1c62895f47fac4097dea33c0100", |
| | | "dxmodules\\zoneinfo\\right\\America\\Belize": "a6f600d246de9f362ce80412e50e703c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Blanc-Sablon": "2637c152f56e58d0978deab40e3fb7af", |
| | | "dxmodules\\zoneinfo\\right\\America\\Boa_Vista": "a2142636ddbbf1a9ef329cd6187f3a7f", |
| | | "dxmodules\\zoneinfo\\right\\America\\Bogota": "da0ff1f7f9dd392ffa9939ab4548bce9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Boise": "ece4d700b42901dd8e70c2ae78feafe8", |
| | | "dxmodules\\zoneinfo\\right\\America\\Buenos_Aires": "7f85ebd305bc1f7a173caf79f56e77aa", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cambridge_Bay": "5ba6299259dca6c49bd37d55b0a23547", |
| | | "dxmodules\\zoneinfo\\right\\America\\Campo_Grande": "ee14c0299e6e91649c3629942385173f", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cancun": "63af9c5ca1e21df45291d378868bfcf3", |
| | | "dxmodules\\zoneinfo\\right\\America\\Caracas": "9f18da7625c6014ac20d61dadce08109", |
| | | "dxmodules\\zoneinfo\\right\\America\\Catamarca": "e4215654b35cc84b7de145a99ba2a8d4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cayenne": "9f8f2cb60fe8096e11d2ade69bf11a35", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cayman": "dbb2a11343300a2c631a6c4b7a3cafac", |
| | | "dxmodules\\zoneinfo\\right\\America\\Chicago": "9e0de2483877c5197b136801aa179825", |
| | | "dxmodules\\zoneinfo\\right\\America\\Chihuahua": "33a79cc0ff099fde13feeb3853c3a751", |
| | | "dxmodules\\zoneinfo\\right\\America\\Coral_Harbour": "b73584d3158e258d8c2b8a43795e2fc9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cordoba": "790e6c0ccdc0a17b0087bb7301434648", |
| | | "dxmodules\\zoneinfo\\right\\America\\Costa_Rica": "36385e27a28e5a44cc3e0379cc203d33", |
| | | "dxmodules\\zoneinfo\\right\\America\\Creston": "28eecb163abd15d8373177be150d09c8", |
| | | "dxmodules\\zoneinfo\\right\\America\\Cuiaba": "9cbde1280ec1e7841e72f6480f3a9e25", |
| | | "dxmodules\\zoneinfo\\right\\America\\Curacao": "a3dd71a0d51b6cd76218b8d299ba7a93", |
| | | "dxmodules\\zoneinfo\\right\\America\\Danmarkshavn": "1790826b85dedc3851db28dd0e220497", |
| | | "dxmodules\\zoneinfo\\right\\America\\Dawson": "c1f9e0a66ac60a0adb572b8dbb15c6fd", |
| | | "dxmodules\\zoneinfo\\right\\America\\Dawson_Creek": "91bdb9ec7c7faaa5f5fcea3d32ef5816", |
| | | "dxmodules\\zoneinfo\\right\\America\\Denver": "a04f44b808f1e82a194885aa0528e6ce", |
| | | "dxmodules\\zoneinfo\\right\\America\\Detroit": "c7e43a31c24443dcc5a10b94194d77b9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Dominica": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Edmonton": "8a4c9e63fdbeaf36632157a97751f2a6", |
| | | "dxmodules\\zoneinfo\\right\\America\\Eirunepe": "302b93102906666bd37f06475e830e5f", |
| | | "dxmodules\\zoneinfo\\right\\America\\El_Salvador": "0e5b3b1aee31e8b3764c85507d67ca05", |
| | | "dxmodules\\zoneinfo\\right\\America\\Ensenada": "4a5aba6b91f6832078382d3f52fd391d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Fortaleza": "7b3782d2bdd4ffe39f16e901227dbf52", |
| | | "dxmodules\\zoneinfo\\right\\America\\Fort_Nelson": "97edfbbc575258ef1141d09612c03f29", |
| | | "dxmodules\\zoneinfo\\right\\America\\Fort_Wayne": "aee84cbeb49b67cf69ab388c16ee8bdb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Glace_Bay": "619356a2105ad4806faf3e0e6bb55de4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Godthab": "610a757eed1026677433258d80198461", |
| | | "dxmodules\\zoneinfo\\right\\America\\Goose_Bay": "321d549f59669036366d42f88a64fbcb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Grand_Turk": "97a0ab9ba0d288e45eef032be8e2e3f2", |
| | | "dxmodules\\zoneinfo\\right\\America\\Grenada": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Guadeloupe": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Guatemala": "fcf1a91ff1bd3861f6bafee15b34bb29", |
| | | "dxmodules\\zoneinfo\\right\\America\\Guayaquil": "821825cf4a6e5d691de018004a5b6cc2", |
| | | "dxmodules\\zoneinfo\\right\\America\\Guyana": "8c4403bcd4ab8dd738cac26d695e06d9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Halifax": "cf585454a2b0677c20dac5e7da2f1220", |
| | | "dxmodules\\zoneinfo\\right\\America\\Havana": "c84c293edbe480ea115abcdf96f1c499", |
| | | "dxmodules\\zoneinfo\\right\\America\\Hermosillo": "0d7e7c94e0f93d6a3d0f7828923f71a7", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Indianapolis": "aee84cbeb49b67cf69ab388c16ee8bdb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Knox": "a4c0cd6601d2974d0d4d331285637042", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Marengo": "5d9df0d965feb22a56a929b7613c9f03", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Petersburg": "743c8227b7bd283ce0433e18d5a2f353", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Tell_City": "4ba7cc16e819553cef1801ac62588f26", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Vevay": "394e9f77e455be15e967a99801c73d63", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Vincennes": "db6628fda4b1727179f7612321616526", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indiana\\Winamac": "d9776c230a2fbe0821766ab8f9eeb92d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Indianapolis": "aee84cbeb49b67cf69ab388c16ee8bdb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Inuvik": "4610d997061651f8c1d87590ce6c6d48", |
| | | "dxmodules\\zoneinfo\\right\\America\\Iqaluit": "54608782aaa5eea3bc3f826c194f86da", |
| | | "dxmodules\\zoneinfo\\right\\America\\Jamaica": "bdf8b2720941180acbbd1404c63f5451", |
| | | "dxmodules\\zoneinfo\\right\\America\\Jujuy": "068eec3da9e503286b7c90c971573616", |
| | | "dxmodules\\zoneinfo\\right\\America\\Juneau": "cf88eba298e22fda671fa79332f5b433", |
| | | "dxmodules\\zoneinfo\\right\\America\\Kentucky\\Louisville": "97e994707ab30ad515214f8be3f51b54", |
| | | "dxmodules\\zoneinfo\\right\\America\\Kentucky\\Monticello": "8853e2c10605fab7539dc797b7909ab9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Knox_IN": "a4c0cd6601d2974d0d4d331285637042", |
| | | "dxmodules\\zoneinfo\\right\\America\\Kralendijk": "a3dd71a0d51b6cd76218b8d299ba7a93", |
| | | "dxmodules\\zoneinfo\\right\\America\\La_Paz": "a51b556e863e357dc307e9dd60c8c1bd", |
| | | "dxmodules\\zoneinfo\\right\\America\\Lima": "6d54c069c8dd341c783de76e7559ec9d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Los_Angeles": "24885c31a23d629863272538b997f87f", |
| | | "dxmodules\\zoneinfo\\right\\America\\Louisville": "97e994707ab30ad515214f8be3f51b54", |
| | | "dxmodules\\zoneinfo\\right\\America\\Lower_Princes": "a3dd71a0d51b6cd76218b8d299ba7a93", |
| | | "dxmodules\\zoneinfo\\right\\America\\Maceio": "6e90d06bd13956adada999198e8b03b1", |
| | | "dxmodules\\zoneinfo\\right\\America\\Managua": "78f94cdc6037f2664b8bcdc2f76beceb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Manaus": "362317d9e24808cca7dfd43119fba293", |
| | | "dxmodules\\zoneinfo\\right\\America\\Marigot": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Martinique": "08b0afa4a3679ec32bd97dd42a2d5e65", |
| | | "dxmodules\\zoneinfo\\right\\America\\Matamoros": "00b0a1fee9df01734ec34c14112254d3", |
| | | "dxmodules\\zoneinfo\\right\\America\\Mazatlan": "c366dd821b732f958ecc81707eecc297", |
| | | "dxmodules\\zoneinfo\\right\\America\\Mendoza": "b95d8152904b0fdf042c6f5167ff90ab", |
| | | "dxmodules\\zoneinfo\\right\\America\\Menominee": "312103138547f25d87854e7335909792", |
| | | "dxmodules\\zoneinfo\\right\\America\\Merida": "a55e8a1f3630c03f89edadaf4680ec25", |
| | | "dxmodules\\zoneinfo\\right\\America\\Metlakatla": "d342ef14d6184402e7b8ef06e05e7a0e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Mexico_City": "9a5c52d9e60891e2b51c17610e75d11f", |
| | | "dxmodules\\zoneinfo\\right\\America\\Miquelon": "2db4fc96974a34db4e86c2c8501400da", |
| | | "dxmodules\\zoneinfo\\right\\America\\Moncton": "fe0d305f26fb8f81d5cb95fa80d4e4bc", |
| | | "dxmodules\\zoneinfo\\right\\America\\Monterrey": "d1560b82e96ac594927f7652ca277d16", |
| | | "dxmodules\\zoneinfo\\right\\America\\Montevideo": "a7be914a9c0d90f855fd6f5555788996", |
| | | "dxmodules\\zoneinfo\\right\\America\\Montreal": "541dd79e6726de72a7b31476c8d9a8ff", |
| | | "dxmodules\\zoneinfo\\right\\America\\Montserrat": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Nassau": "73ec388017abd0e22f37d88a0b8e8a97", |
| | | "dxmodules\\zoneinfo\\right\\America\\New_York": "7b602715824f47ba6028f0075b3ea7dc", |
| | | "dxmodules\\zoneinfo\\right\\America\\Nipigon": "152d6acbfae9d604319acc2947000c9e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Nome": "ff654dddf7473e79e85d1109a433036d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Noronha": "72b7085c49fead430e7a2dd06590b224", |
| | | "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\Beulah": "7dae7b69dfbde952510327d4049133f9", |
| | | "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\Center": "3df021012c8eb85b4a732df260ca46fc", |
| | | "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\New_Salem": "d85974b0e5491f9676676010d6b8a5eb", |
| | | "dxmodules\\zoneinfo\\right\\America\\Nuuk": "610a757eed1026677433258d80198461", |
| | | "dxmodules\\zoneinfo\\right\\America\\Ojinaga": "9c60152b7b11563719f61bb0f52e9e9e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Panama": "dbb2a11343300a2c631a6c4b7a3cafac", |
| | | "dxmodules\\zoneinfo\\right\\America\\Pangnirtung": "8409ed8281ca17daf9c87560426b7c02", |
| | | "dxmodules\\zoneinfo\\right\\America\\Paramaribo": "c3b09c0d420c43da423799e52b93f6e4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Phoenix": "5adc29642d304ff453993c2b4395505d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Port-au-Prince": "8df9214442b5652478760d8ea7af38b7", |
| | | "dxmodules\\zoneinfo\\right\\America\\Porto_Acre": "30bb03697d8aba618afd831bfc83a9a3", |
| | | "dxmodules\\zoneinfo\\right\\America\\Porto_Velho": "34a694f0e37d4fc37e9ac49e37a5de1c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Port_of_Spain": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Puerto_Rico": "f03c81ed80547f70a80a01c94dc85ab9", |
| | | "dxmodules\\zoneinfo\\right\\America\\Punta_Arenas": "f70175b387bb3327bbec390a86d21455", |
| | | "dxmodules\\zoneinfo\\right\\America\\Rainy_River": "23dbcf1cd24e67cc24648c25eb298ba0", |
| | | "dxmodules\\zoneinfo\\right\\America\\Rankin_Inlet": "d6a6ce35fb5ca3d134fe3d7ce1b7468b", |
| | | "dxmodules\\zoneinfo\\right\\America\\Recife": "07264d0df9168584cd65dca59efdcd0b", |
| | | "dxmodules\\zoneinfo\\right\\America\\Regina": "49b33e71c4d5d99090e25929482b9820", |
| | | "dxmodules\\zoneinfo\\right\\America\\Resolute": "37e1fe49d7b779172f4193f908fa02b5", |
| | | "dxmodules\\zoneinfo\\right\\America\\Rio_Branco": "30bb03697d8aba618afd831bfc83a9a3", |
| | | "dxmodules\\zoneinfo\\right\\America\\Rosario": "790e6c0ccdc0a17b0087bb7301434648", |
| | | "dxmodules\\zoneinfo\\right\\America\\Santarem": "9baa062bb495b0f959fdfd859e262d40", |
| | | "dxmodules\\zoneinfo\\right\\America\\Santa_Isabel": "4a5aba6b91f6832078382d3f52fd391d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Santiago": "b77df3a65e22297b42228afa2929584f", |
| | | "dxmodules\\zoneinfo\\right\\America\\Santo_Domingo": "059582246c0bb5af0c12326bfcf86019", |
| | | "dxmodules\\zoneinfo\\right\\America\\Sao_Paulo": "81339e51f13782b28042f92786116ee3", |
| | | "dxmodules\\zoneinfo\\right\\America\\Scoresbysund": "e26dc30e3bfb3562a24a9267cff7c283", |
| | | "dxmodules\\zoneinfo\\right\\America\\Shiprock": "a04f44b808f1e82a194885aa0528e6ce", |
| | | "dxmodules\\zoneinfo\\right\\America\\Sitka": "c1a683fe328612597c6da3179763ee4c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Barthelemy": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Johns": "5f670ecdff8ed7f414f51b4ff0c3300c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Kitts": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Lucia": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Thomas": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\St_Vincent": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Swift_Current": "ec2feb211b495fb642849e26cfa1fac4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Tegucigalpa": "dfd6bb815ab1c7c942efd30bd72220d4", |
| | | "dxmodules\\zoneinfo\\right\\America\\Thule": "4b1a8f5b8395dbee7ff1977cb5500e48", |
| | | "dxmodules\\zoneinfo\\right\\America\\Thunder_Bay": "5f3b82b19c7ca9e8144b64d1e595c475", |
| | | "dxmodules\\zoneinfo\\right\\America\\Tijuana": "4a5aba6b91f6832078382d3f52fd391d", |
| | | "dxmodules\\zoneinfo\\right\\America\\Toronto": "541dd79e6726de72a7b31476c8d9a8ff", |
| | | "dxmodules\\zoneinfo\\right\\America\\Tortola": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Vancouver": "813c4030632e8d4b89dfeea68deca975", |
| | | "dxmodules\\zoneinfo\\right\\America\\Virgin": "33c17627a9963f70271c9a193e9eb32c", |
| | | "dxmodules\\zoneinfo\\right\\America\\Whitehorse": "8751f4da107a273bcc9060790bd9460b", |
| | | "dxmodules\\zoneinfo\\right\\America\\Winnipeg": "387856cd57cd5f8898ad0e66acbbf27e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Yakutat": "729d277e238d7320e9c505e0e2f6cb7e", |
| | | "dxmodules\\zoneinfo\\right\\America\\Yellowknife": "1ad33e12252975f4a164863f7b347834", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Casey": "3b466e0683793f6433a74e7c79b00782", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Davis": "eaf9670244da968a46f0042f98250702", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\DumontDUrville": "6e986536bd542e2209819737c97e847d", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Macquarie": "bc2f8c209b76c37bc97baafe71d49c4c", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Mawson": "7829c411c82e902894831e718e8790f1", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\McMurdo": "82b0518985a7fc92949ed0f6f26ff413", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Palmer": "8c3e3369c7685369c36fdd5eb3eaed96", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Rothera": "b0ee319a72f04eaa17795ba5e57a908b", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\South_Pole": "82b0518985a7fc92949ed0f6f26ff413", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Syowa": "1da7fe0d4a3413fc84ab4b2769090608", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Troll": "a335c40b4c451315ca42c3e54c1905d8", |
| | | "dxmodules\\zoneinfo\\right\\Antarctica\\Vostok": "0cafcb51dca9ed5d72d03f4aed483489", |
| | | "dxmodules\\zoneinfo\\right\\Arctic\\Longyearbyen": "e4dc442993a2b2784b8b7dbd7160eec4", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Aden": "9c257d575e96015f3fbed54d87f8bc50", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Almaty": "1810c448a8354615683abca84d527bfe", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Amman": "ee2c93bf5727fd8420f2b749d7428efb", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Anadyr": "a9cc54432e82d7032c7def8468a089d0", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Aqtau": "e2007ee6f3e74a8019391ac1f0aec4dc", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Aqtobe": "663580fb15202c6df3d9b9bf5ebf522f", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ashgabat": "4eacdff5fe2196cd19a342d8b39b0ca8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ashkhabad": "4eacdff5fe2196cd19a342d8b39b0ca8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Atyrau": "c7ff154fd4ea56ecf3bfc0b934c5cd22", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Baghdad": "bb9b7e0ac51f666dfa71ab3a1a6fca45", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Bahrain": "435d4f3daf5c15caa49fbe664a2c1684", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Baku": "1652d1e2640b9106a8fb3523ab7112ae", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Bangkok": "eaa810414de8de8a06c0eb1c700afd0a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Barnaul": "4d4df10cbd37b44eb42b9d19eb4f7c33", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Beirut": "784e4b8ee1013ead6843993b38bf7dcf", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Bishkek": "576e721428ae8b35565251b8580322fc", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Brunei": "c88f7e5336c048f58831ca0e922cb883", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Calcutta": "2e0eb1e900fb8859c72a5d9412f95dba", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Chita": "67f7e1fbed85796b3f266f642742c1aa", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Choibalsan": "f95f3247720172902bd68d5b559efbf7", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Chongqing": "06fb988f003b033771d03ba8888480b1", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Chungking": "06fb988f003b033771d03ba8888480b1", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Colombo": "0e141adc9705e2bb75c8cc2635adbd95", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Dacca": "e35ecddcb5d5139a9200291f723231a8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Damascus": "1f2c159804ad4460e814c7e4e06a1c81", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Dhaka": "e35ecddcb5d5139a9200291f723231a8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Dili": "2ff451580ef93c763ea5d159420f5d11", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Dubai": "72e2ef10fde1f8fcabbc5a21d5d9a856", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Dushanbe": "6c0f6914cb140fbd7601bb4ce5da1d50", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Famagusta": "cf108cc298788103758b0132fba32a57", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Gaza": "9d26fe2afd426828d5da3c22b5bfdd83", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Harbin": "06fb988f003b033771d03ba8888480b1", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Hebron": "06834d169792c0c58cd69baaee42e92c", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Hong_Kong": "ac812a20a17a6221694038b62ac77ff0", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Hovd": "b0fcc3ae79e32a173e4db193a76ccc0e", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ho_Chi_Minh": "7420517dd4ad95118f1e7d88e2430163", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Irkutsk": "db926d9012302148e205b89a6e449967", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Istanbul": "3f72cd0fb7e26b0dc8d7833327f035db", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Jakarta": "3c216e1d6bed7b8b4d3f5295a10f02ac", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Jayapura": "7e3faf3974a4a2f1a6172bc80c4e91df", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Jerusalem": "6fa25ac8d4a8f5e7c03de4434c5cc6b8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kabul": "0cacb17b331b880fea6a3c03a056c024", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kamchatka": "307d5eec76955cf8ae4c87b1ae514387", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Karachi": "4038cb8adc007467f1297aa72557863f", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kashgar": "5ce95bd9a706925bc86863eb692c862c", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kathmandu": "c4549d6c756ada9f9dbfce26ea69a210", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Katmandu": "c4549d6c756ada9f9dbfce26ea69a210", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Khandyga": "78c9936524b6cae7bf4335cd38e4d09b", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kolkata": "2e0eb1e900fb8859c72a5d9412f95dba", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Krasnoyarsk": "dd9dc5be8bfe0fcf767c0d1006b694c3", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kuala_Lumpur": "fce33beb3d31d52349a77dc45114937a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kuching": "f3da8074fccd8144590e2533384313cf", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Kuwait": "9c257d575e96015f3fbed54d87f8bc50", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Macao": "dd42c3ea58c64c46070051f16626a0b0", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Macau": "dd42c3ea58c64c46070051f16626a0b0", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Magadan": "74537315aad0bc57f1dbbc77f838c193", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Makassar": "20db83c594a3c11f74ab275542d59aa4", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Manila": "f8c658820eb89da38eda688ddfc48606", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Muscat": "72e2ef10fde1f8fcabbc5a21d5d9a856", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Nicosia": "2f833febb7eee0222af785894a47d5a8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Novokuznetsk": "0aba150238505be93a22b0b4ddf47312", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Novosibirsk": "7040261c320043d7f3122b2604635284", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Omsk": "040c540fb238f31ea69249b753ef0ef7", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Oral": "0fda7755065f5eaa92c21eb716aa56b5", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Phnom_Penh": "eaa810414de8de8a06c0eb1c700afd0a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Pontianak": "55fb83fe4f7872c919ce934a0b70a651", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Pyongyang": "cb4953e8661526fba1d6ed8f738e895f", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Qatar": "435d4f3daf5c15caa49fbe664a2c1684", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Qostanay": "34cfcbb0d35f54e00b2784c11fabf5a2", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Qyzylorda": "d0b30771ffbee9e46794adbfe8acc33c", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Rangoon": "4ab2c8e9530b82eff44f4a64776faa99", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Riyadh": "9c257d575e96015f3fbed54d87f8bc50", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Saigon": "7420517dd4ad95118f1e7d88e2430163", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Sakhalin": "5da56bcd444fcef1275c92aabd8cb8e6", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Samarkand": "e72a66455d6dc27dce4e3f3a1a5e7177", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Seoul": "e73238fa6c85ea037bf4dcc235113fe9", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Shanghai": "06fb988f003b033771d03ba8888480b1", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Singapore": "72be432785863c8a11d83d6f3849f6a1", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Srednekolymsk": "2b062b872cebf7f3a35de885144a46a8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Taipei": "8f3da0ea2509c2fe35c6bb244f84d2e2", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tashkent": "88e80b0efe0b23c657d37e68ff5c3ecf", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tbilisi": "351bbf0c6e2e8d38f5eec8c04aa4d6d3", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tehran": "c3a0c2539fccc3d3f8081b4218c0eb20", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tel_Aviv": "6fa25ac8d4a8f5e7c03de4434c5cc6b8", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Thimbu": "e18d256eca7ba79605a1fe408157624a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Thimphu": "e18d256eca7ba79605a1fe408157624a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tokyo": "e40de6c7fb9ce735aeff885394a727d2", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Tomsk": "d5844b6b75a8c2bfa61c735627349854", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ujung_Pandang": "20db83c594a3c11f74ab275542d59aa4", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ulaanbaatar": "ffe40602251f6104563a95d5a6201755", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ulan_Bator": "ffe40602251f6104563a95d5a6201755", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Urumqi": "5ce95bd9a706925bc86863eb692c862c", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Ust-Nera": "3052b62f431959f55e69a42da2a4367f", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Vientiane": "eaa810414de8de8a06c0eb1c700afd0a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Vladivostok": "3a665f9e10006d046da39a389e2d4de6", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Yakutsk": "909fefe03904758645a9e688099adb74", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Yangon": "4ab2c8e9530b82eff44f4a64776faa99", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Yekaterinburg": "17b849bae102efb9cb3f1761a951528a", |
| | | "dxmodules\\zoneinfo\\right\\Asia\\Yerevan": "8c67b19d3e6eb4b74d85bce71832e379", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Azores": "6782096c0c0016381184311eccf7e79b", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Bermuda": "cd84da3d7c53c2facfad094b6a63a6a1", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Canary": "59557b15427f688dd2f6730c1461aa94", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Cape_Verde": "a51b284fc44efbbacabd8edf369b3937", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Faeroe": "91920c175797f2fee4628b758df58d61", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Faroe": "91920c175797f2fee4628b758df58d61", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Jan_Mayen": "e4dc442993a2b2784b8b7dbd7160eec4", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Madeira": "4259292f99911b4275ed87264edb7666", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Reykjavik": "4cbcb014d0b6e243af59821c0c384948", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\South_Georgia": "94b903dd1e41634f0a57917c82c4a86e", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\Stanley": "cd95a853a4b676c8afb1b7f003d525b5", |
| | | "dxmodules\\zoneinfo\\right\\Atlantic\\St_Helena": "2ece5b26b492408992aab88850fbd816", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\ACT": "cb021aa4d7a0d3d4717a896c093cd59c", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Adelaide": "3bd3b9a49709c2662be4cb2b14a61387", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Brisbane": "b63c9e16e5df9ee561be859ebfab9e4f", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Broken_Hill": "25dcfe77e4c8bc1baa8d54ac88daa98d", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Canberra": "cb021aa4d7a0d3d4717a896c093cd59c", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Currie": "1b2240d848becc1dfcbee0dbcfa17bdf", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Darwin": "abd6799885314c1d86458b5164642ac1", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Eucla": "1a12dadcc17e599cb35bde71a032dc55", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Hobart": "1b2240d848becc1dfcbee0dbcfa17bdf", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\LHI": "74cd4736a6c2c6c92bf73d1125384b5d", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Lindeman": "1ad460f55e6a27574ecb7292ecff49b3", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Lord_Howe": "74cd4736a6c2c6c92bf73d1125384b5d", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Melbourne": "110415758f3860609f5fb34978117b2f", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\North": "abd6799885314c1d86458b5164642ac1", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\NSW": "cb021aa4d7a0d3d4717a896c093cd59c", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Perth": "80cea3a163beeb09331e60663144ca34", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Queensland": "b63c9e16e5df9ee561be859ebfab9e4f", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\South": "3bd3b9a49709c2662be4cb2b14a61387", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Sydney": "cb021aa4d7a0d3d4717a896c093cd59c", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Tasmania": "1b2240d848becc1dfcbee0dbcfa17bdf", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Victoria": "110415758f3860609f5fb34978117b2f", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\West": "80cea3a163beeb09331e60663144ca34", |
| | | "dxmodules\\zoneinfo\\right\\Australia\\Yancowinna": "25dcfe77e4c8bc1baa8d54ac88daa98d", |
| | | "dxmodules\\zoneinfo\\right\\Brazil\\Acre": "30bb03697d8aba618afd831bfc83a9a3", |
| | | "dxmodules\\zoneinfo\\right\\Brazil\\DeNoronha": "72b7085c49fead430e7a2dd06590b224", |
| | | "dxmodules\\zoneinfo\\right\\Brazil\\East": "81339e51f13782b28042f92786116ee3", |
| | | "dxmodules\\zoneinfo\\right\\Brazil\\West": "362317d9e24808cca7dfd43119fba293", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Atlantic": "cf585454a2b0677c20dac5e7da2f1220", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Central": "387856cd57cd5f8898ad0e66acbbf27e", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Eastern": "541dd79e6726de72a7b31476c8d9a8ff", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Mountain": "8a4c9e63fdbeaf36632157a97751f2a6", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Newfoundland": "5f670ecdff8ed7f414f51b4ff0c3300c", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Pacific": "813c4030632e8d4b89dfeea68deca975", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Saskatchewan": "49b33e71c4d5d99090e25929482b9820", |
| | | "dxmodules\\zoneinfo\\right\\Canada\\Yukon": "8751f4da107a273bcc9060790bd9460b", |
| | | "dxmodules\\zoneinfo\\right\\CET": "326f99da17d68d4cfee53cf8d0aa7204", |
| | | "dxmodules\\zoneinfo\\right\\Chile\\Continental": "b77df3a65e22297b42228afa2929584f", |
| | | "dxmodules\\zoneinfo\\right\\Chile\\EasterIsland": "4dfc6403a5adf1616fb68203f03bf30e", |
| | | "dxmodules\\zoneinfo\\right\\CST6CDT": "169a8197b636d243e7c004a8e7fba824", |
| | | "dxmodules\\zoneinfo\\right\\Cuba": "c84c293edbe480ea115abcdf96f1c499", |
| | | "dxmodules\\zoneinfo\\right\\EET": "6816fac705bb26c7b7255b2783f0a970", |
| | | "dxmodules\\zoneinfo\\right\\Egypt": "c0216212a93d68f21decbbc1f0675104", |
| | | "dxmodules\\zoneinfo\\right\\Eire": "fa14bdeed6096bf8faebc5fedc011cdc", |
| | | "dxmodules\\zoneinfo\\right\\EST": "1888b614cef3c1a33820f2ea2b3b7b3f", |
| | | "dxmodules\\zoneinfo\\right\\EST5EDT": "dddda24b1babea1d79989f4e38faae26", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+1": "44ac89638b691ebce09448dad59e536e", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+10": "b42c0dab5f49eb25e21920c0b22f54a2", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+11": "5dcac640065e3fb5b799e2c0a6df1d2f", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+12": "4fae182c01b8355025d83b4acbfada68", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+2": "8a6d714494a35f050b117b592b40bcd8", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+3": "733b613bf354c20c0d3b3465435c9cc9", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+4": "088c840877ba64a21a9edc90ef942671", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+5": "04aefa0c42f095280b700db4d1a30d6e", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+6": "8ceb55f06163274ace7c942c0199ff90", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+7": "172c592ca91950907dd7b1924c4f3d06", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+8": "05ba396e91ef7b3445aff2aaf23ede98", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT+9": "819b92c43b3741d65b3676cc0f5d33a2", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-1": "c79b1c43563ac924fe564ee658820b57", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-10": "b4a6988ab9c89ada1e5593dff9eeabf4", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-11": "5fa302adca1e4c397c7a860211e864b8", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-12": "c250ec4b2d85f3696b182af7f7dc7fb1", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-13": "d275f6c033dec2c0babfbd3ac01655f6", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-14": "ce6effbe9cc3a96f6d196aff4fb71af9", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-2": "cf76c5d0e5c517917500a34c8771ddab", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-3": "2f737a03e95cd1a3cf6a35eb25d33b0c", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-4": "5a6b49c6fdcb2144d7e0cd7388e7838c", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-5": "ab06ee74ab85a30e8adf0b69de519c82", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-6": "0510dc5e9d0b6b6ec42190d5d3ea6cdb", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-7": "f78c916860aca5b070021182c4779d18", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-8": "00b5994c24a396764b490ae18ab9a599", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT-9": "936c9e724d32db15be2477ea4b408b1d", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\GMT0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\Greenwich": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\UCT": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\Universal": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\UTC": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\Etc\\Zulu": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Amsterdam": "9c9b6e69b6805f0c4dbe28b68e8c3376", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Andorra": "8f9ed78972f8047376bbcca787297bba", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Astrakhan": "144a16fbf22ba65c2aec4a868c93f1f8", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Athens": "9cfb86a10147b0d4add4e9c81a524dc1", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Belfast": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Belgrade": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Berlin": "5d9f8ec5a71ff774a799eb7a6fbde2bb", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Bratislava": "8cca872478ba5c4443e357a3eb155afd", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Brussels": "feffc38f8d6d4951f1a5bcfe3512b54a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Bucharest": "ea1e49ce1f0883770bdd67baac18be47", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Budapest": "0ef953b4cdd6aa5fc6c05c806ef855a8", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Busingen": "1e716194b428d38f654955cc74308f66", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Chisinau": "1a8a06d7addd111a3c3a6062cb62890d", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Copenhagen": "85ff23778461ff94dc34930a683397c9", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Dublin": "fa14bdeed6096bf8faebc5fedc011cdc", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Gibraltar": "1e5adb0d08c0e55ceef8aee44c7d6d24", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Guernsey": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Helsinki": "5449e97f865215aad28e8ea273482016", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Isle_of_Man": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Istanbul": "3f72cd0fb7e26b0dc8d7833327f035db", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Jersey": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Kaliningrad": "829ea9e23f1ccfc7760bb26ba9b544d4", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Kiev": "b1849500983d6e866fe6a9559ed6799c", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Kirov": "ec7954a2d2c6b2f071d4ceefe04ef8c1", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Lisbon": "4ad34a3a04aee31ee75cbbbe2d1bd17c", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Ljubljana": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\London": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Luxembourg": "7bbbe6a6b7b9cb4bf346284de85a3309", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Madrid": "5b1ddafe484b5a19b108489dc08c18b2", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Malta": "69f5e652e0a30cfabd18421114661a61", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Mariehamn": "5449e97f865215aad28e8ea273482016", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Minsk": "aceeb3176221fa68458c66484343958b", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Monaco": "6e5200d2c0717b4a4b36ad0373581e5e", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Moscow": "1a3b8b78c50ba48197e1d2fa2f3b4b23", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Nicosia": "2f833febb7eee0222af785894a47d5a8", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Oslo": "e4dc442993a2b2784b8b7dbd7160eec4", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Paris": "303279bb72826189bcfeb2c8aa98c66f", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Podgorica": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Prague": "8cca872478ba5c4443e357a3eb155afd", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Riga": "76bf464b939efe723c1ccf72873e44e3", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Rome": "e540b9cb4bf053e9d8511725272cdf5b", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Samara": "37128ba2e90a9999239fd86519a62eb0", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\San_Marino": "e540b9cb4bf053e9d8511725272cdf5b", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Sarajevo": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Saratov": "e4f53774f2ef10a94be981221b099ac6", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Simferopol": "c8a8d124342e44f3eefc263f59a5dd48", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Skopje": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Sofia": "458a54a31208222a2c5445708bae28e0", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Stockholm": "80f1f38ebf4384271a53183343a66975", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Tallinn": "df5ddb83f7e5387846f5841f0518d0c5", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Tirane": "2b5278f6502eb243455557a3a211282a", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Tiraspol": "1a8a06d7addd111a3c3a6062cb62890d", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Ulyanovsk": "cee2b943281f2225c621bf96786fd7a7", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Uzhgorod": "10025f95c80284615561b410964fb264", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Vaduz": "1e716194b428d38f654955cc74308f66", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Vatican": "e540b9cb4bf053e9d8511725272cdf5b", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Vienna": "955182f26f6aea388d4a583df74adaa7", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Vilnius": "d28049e44c7514397233af6e474430ad", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Volgograd": "f39a8e18a68ed983e5422cdd92247936", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Warsaw": "2e719e7f3a3f27ae2fe160a8a71c5adc", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Zagreb": "f7968fe2a968e13508724ac3e05c3990", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Zaporozhye": "5146398eb6c7013f023928bdf865dd69", |
| | | "dxmodules\\zoneinfo\\right\\Europe\\Zurich": "1e716194b428d38f654955cc74308f66", |
| | | "dxmodules\\zoneinfo\\right\\GB": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\GB-Eire": "6276eb5b4b1e8a15b9d09b22d7d6b50a", |
| | | "dxmodules\\zoneinfo\\right\\GMT": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\GMT+0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\GMT-0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\GMT0": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Greenwich": "35f72054ad6662aeee550ec58dc4a586", |
| | | "dxmodules\\zoneinfo\\right\\Hongkong": "ac812a20a17a6221694038b62ac77ff0", |
| | | "dxmodules\\zoneinfo\\right\\HST": "704400f39808fde5ab87bcca534c957d", |
| | | "dxmodules\\zoneinfo\\right\\Iceland": "4cbcb014d0b6e243af59821c0c384948", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Antananarivo": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Chagos": "a4d08c5e820b85cb1caa8ef9eb22813f", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Christmas": "f0970ef1981829970d8acbf71af3172f", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Cocos": "6c238b2fd09e4630a6df4b1b463d4c73", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Comoro": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Kerguelen": "a70e3e41f1c77f539ae8395fff564397", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Mahe": "3564352984fa37e355be931b944efee9", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Maldives": "1528d9c478ca032641e3c6a7e258f49f", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Mauritius": "8f0a9bacf3a5f672a9f012772b77b17e", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Mayotte": "abc9b7d75108f4008fe6d6343789d4f1", |
| | | "dxmodules\\zoneinfo\\right\\Indian\\Reunion": "054a3a19a8120a110f71d23ca04307ca", |
| | | "dxmodules\\zoneinfo\\right\\Iran": "c3a0c2539fccc3d3f8081b4218c0eb20", |
| | | "dxmodules\\zoneinfo\\right\\Israel": "6fa25ac8d4a8f5e7c03de4434c5cc6b8", |
| | | "dxmodules\\zoneinfo\\right\\Jamaica": "bdf8b2720941180acbbd1404c63f5451", |
| | | "dxmodules\\zoneinfo\\right\\Japan": "e40de6c7fb9ce735aeff885394a727d2", |
| | | "dxmodules\\zoneinfo\\right\\Kwajalein": "11e6875e86cf9f056be3f6dc4b5f9945", |
| | | "dxmodules\\zoneinfo\\right\\Libya": "140c8538c93832c7c7ae0e40d592dd33", |
| | | "dxmodules\\zoneinfo\\right\\MET": "553ea71b74d03c717e719edafac08447", |
| | | "dxmodules\\zoneinfo\\right\\Mexico\\BajaNorte": "4a5aba6b91f6832078382d3f52fd391d", |
| | | "dxmodules\\zoneinfo\\right\\Mexico\\BajaSur": "c366dd821b732f958ecc81707eecc297", |
| | | "dxmodules\\zoneinfo\\right\\Mexico\\General": "9a5c52d9e60891e2b51c17610e75d11f", |
| | | "dxmodules\\zoneinfo\\right\\MST": "eb8570ce4a109cb5f39ae339449435a2", |
| | | "dxmodules\\zoneinfo\\right\\MST7MDT": "0ac5e09fecc392c1825926ea3addb2dd", |
| | | "dxmodules\\zoneinfo\\right\\Navajo": "a04f44b808f1e82a194885aa0528e6ce", |
| | | "dxmodules\\zoneinfo\\right\\NZ": "82b0518985a7fc92949ed0f6f26ff413", |
| | | "dxmodules\\zoneinfo\\right\\NZ-CHAT": "037f7cdaa548a8bb0ed6f906972c87f6", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Apia": "87dd16cbe46e5afc0171dd29e0961fe9", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Auckland": "82b0518985a7fc92949ed0f6f26ff413", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Bougainville": "43d1bca50fc4b42c880e2e1d3b6745e4", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Chatham": "037f7cdaa548a8bb0ed6f906972c87f6", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Chuuk": "90ac2179ed963cbd44f031d797ab5cea", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Easter": "4dfc6403a5adf1616fb68203f03bf30e", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Efate": "18abb66b7aa9eca73e343cac55d66f24", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Enderbury": "87bf251369c2dfc68c7738e0b82d54ba", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Fakaofo": "231d2a10cf0411401a431366984e2a06", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Fiji": "9860735dadf3f3d4c9e464e595525cc8", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Funafuti": "a68d87ac4ad319e17b93f08249728242", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Galapagos": "890a615f425dbba4064293c1a946c7c2", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Gambier": "10b8f639b1500971337f57d49f6a6253", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Guadalcanal": "4d90ac24eb4f59d4c6a6bd58d779cc91", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Guam": "e2a0ac2f20ee3bb3c4324676115aff33", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Honolulu": "8388fd415f4c8a2a30a7357da5c8b7a5", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Johnston": "8388fd415f4c8a2a30a7357da5c8b7a5", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Kiritimati": "5b9795133f270e2aba9484f1f71bb049", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Kosrae": "fa011f144e058aa5184d6b53a15061f1", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Kwajalein": "11e6875e86cf9f056be3f6dc4b5f9945", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Majuro": "2a91ede5e92cb49bb3f0f387e84c8ddf", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Marquesas": "34a88ad280b7cb93e02d617121337d4b", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Midway": "77931d9a150d72054deaf73ea1af39dc", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Nauru": "49b4493e5dc16b8b96db9097b40684be", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Niue": "2cdf947862d9d3529e2a8a9e34cc3a72", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Norfolk": "c8c9b74862de9c5b6a922ceea4a518ec", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Noumea": "0511ee78de0dd4d2e5e1ad2486d4d15a", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Pago_Pago": "77931d9a150d72054deaf73ea1af39dc", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Palau": "7c8e4928f42b47884c73837fc95b91c4", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Pitcairn": "a75b2a9013f723970ceae201335f736f", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Pohnpei": "47b2894646c6d9e8773ed8720d851121", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Ponape": "47b2894646c6d9e8773ed8720d851121", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Port_Moresby": "470ebd903539f82cb2fed9ab0f960ee4", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Rarotonga": "45029b877e70bd0df13b50ab015d49fc", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Saipan": "e2a0ac2f20ee3bb3c4324676115aff33", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Samoa": "77931d9a150d72054deaf73ea1af39dc", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Tahiti": "6ea49c35b2399f4a8f36d5a5a5377bb9", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Tarawa": "d31390f2de53b92e266ba9d8e5b94398", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Tongatapu": "74dfc4d2ae719db55b2afdb6710a3d51", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Truk": "90ac2179ed963cbd44f031d797ab5cea", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Wake": "a3e7ed5df57910e74754f6236266417d", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Wallis": "4cffb736eadc485f07015943ad212f7b", |
| | | "dxmodules\\zoneinfo\\right\\Pacific\\Yap": "90ac2179ed963cbd44f031d797ab5cea", |
| | | "dxmodules\\zoneinfo\\right\\Poland": "2e719e7f3a3f27ae2fe160a8a71c5adc", |
| | | "dxmodules\\zoneinfo\\right\\Portugal": "4ad34a3a04aee31ee75cbbbe2d1bd17c", |
| | | "dxmodules\\zoneinfo\\right\\PRC": "06fb988f003b033771d03ba8888480b1", |
| | | "dxmodules\\zoneinfo\\right\\PST8PDT": "78287f21c770bec0e27c5d2031b24786", |
| | | "dxmodules\\zoneinfo\\right\\ROC": "8f3da0ea2509c2fe35c6bb244f84d2e2", |
| | | "dxmodules\\zoneinfo\\right\\ROK": "e73238fa6c85ea037bf4dcc235113fe9", |
| | | "dxmodules\\zoneinfo\\right\\Singapore": "72be432785863c8a11d83d6f3849f6a1", |
| | | "dxmodules\\zoneinfo\\right\\Turkey": "3f72cd0fb7e26b0dc8d7833327f035db", |
| | | "dxmodules\\zoneinfo\\right\\UCT": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\Universal": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\US\\Alaska": "be6e5ef83221831fd57a032e03246920", |
| | | "dxmodules\\zoneinfo\\right\\US\\Aleutian": "282e70d388dfd3923238b8ca86244246", |
| | | "dxmodules\\zoneinfo\\right\\US\\Arizona": "5adc29642d304ff453993c2b4395505d", |
| | | "dxmodules\\zoneinfo\\right\\US\\Central": "9e0de2483877c5197b136801aa179825", |
| | | "dxmodules\\zoneinfo\\right\\US\\East-Indiana": "aee84cbeb49b67cf69ab388c16ee8bdb", |
| | | "dxmodules\\zoneinfo\\right\\US\\Eastern": "7b602715824f47ba6028f0075b3ea7dc", |
| | | "dxmodules\\zoneinfo\\right\\US\\Hawaii": "8388fd415f4c8a2a30a7357da5c8b7a5", |
| | | "dxmodules\\zoneinfo\\right\\US\\Indiana-Starke": "a4c0cd6601d2974d0d4d331285637042", |
| | | "dxmodules\\zoneinfo\\right\\US\\Michigan": "c7e43a31c24443dcc5a10b94194d77b9", |
| | | "dxmodules\\zoneinfo\\right\\US\\Mountain": "a04f44b808f1e82a194885aa0528e6ce", |
| | | "dxmodules\\zoneinfo\\right\\US\\Pacific": "24885c31a23d629863272538b997f87f", |
| | | "dxmodules\\zoneinfo\\right\\US\\Samoa": "77931d9a150d72054deaf73ea1af39dc", |
| | | "dxmodules\\zoneinfo\\right\\UTC": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\right\\W-SU": "1a3b8b78c50ba48197e1d2fa2f3b4b23", |
| | | "dxmodules\\zoneinfo\\right\\WET": "17c38eb83369fc8dc351e115cd619911", |
| | | "dxmodules\\zoneinfo\\right\\Zulu": "da8c158569d2320293ec1bdb8197b372", |
| | | "dxmodules\\zoneinfo\\ROC": "2e67467e3c050e8b3a4022eb9e20300e", |
| | | "dxmodules\\zoneinfo\\ROK": "f7a6e371bd709b3c2f64ce6f67f39f29", |
| | | "dxmodules\\zoneinfo\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3", |
| | | "dxmodules\\zoneinfo\\Turkey": "e69bdcf9a164fd9a0bc8684663b79219", |
| | | "dxmodules\\zoneinfo\\tzdata.zi": "4c99a0629d76991746913273d2467669", |
| | | "dxmodules\\zoneinfo\\UCT": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\Universal": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\US\\Alaska": "596428a3a840d568656088bd48e608f1", |
| | | "dxmodules\\zoneinfo\\US\\Aleutian": "ad0f12068a0f5376059b7e84df8f0c31", |
| | | "dxmodules\\zoneinfo\\US\\Arizona": "c697bb02e057325a74547912f631a3a7", |
| | | "dxmodules\\zoneinfo\\US\\Central": "d0f076c9f390e7d8a933cc7cc1ad2e90", |
| | | "dxmodules\\zoneinfo\\US\\East-Indiana": "660e305e3bb438c0ae8819055ed9352f", |
| | | "dxmodules\\zoneinfo\\US\\Eastern": "e4ca381035a34b7a852184cc0dd89baa", |
| | | "dxmodules\\zoneinfo\\US\\Hawaii": "d6e1b69b9769f6f79b38da0ba1cd6442", |
| | | "dxmodules\\zoneinfo\\US\\Indiana-Starke": "408adad4b7daacbef77099ba24b1c535", |
| | | "dxmodules\\zoneinfo\\US\\Michigan": "ae3ba6ed8738ceda9eef109c6c586736", |
| | | "dxmodules\\zoneinfo\\US\\Mountain": "02b73b0cf0d96e2f75cae56b178bf58e", |
| | | "dxmodules\\zoneinfo\\US\\Pacific": "9323ff44ce205ce1a1bad7e2dca39939", |
| | | "dxmodules\\zoneinfo\\US\\Samoa": "01c22dcbd90c92cf6076c67523d5da54", |
| | | "dxmodules\\zoneinfo\\UTC": "c79354b8dbee09e62bbc3fb544853283", |
| | | "dxmodules\\zoneinfo\\W-SU": "223bbf37352a9d4807919132f360535e", |
| | | "dxmodules\\zoneinfo\\WET": "92388453e62ec1a69fbf12685ad247c7", |
| | | "dxmodules\\zoneinfo\\zone.tab": "02dddc33edc3a0eeb783555dc2ce1156", |
| | | "dxmodules\\zoneinfo\\zone1970.tab": "2b7b091f4b1c41d6384b254f55654299", |
| | | "dxmodules\\zoneinfo\\Zulu": "c79354b8dbee09e62bbc3fb544853283", |
| | | "README_CN.md": "bbcb5da83f48849dbfe5388e965c2b99", |
| | | "resource\\CN\\wav\\access_f.wav": "f951f3cc1f03aaa794231413fd4efcc6", |
| | | "resource\\CN\\wav\\access_s.wav": "6d1b31bdcaaa13ba719e3223b55d5235", |
| | | "resource\\CN\\wav\\btn11.wav": "a623797305d7b0e6b8cb6b2ab3d43591", |
| | | "resource\\CN\\wav\\btn12.wav": "26bbfc3eed36211713dca9afb423e168", |
| | | "resource\\CN\\wav\\btn13.wav": "67d6fe32693cb2e7653c2ff2141ce873", |
| | | "resource\\CN\\wav\\btn21.wav": "53071472fce6128fdd2ed304e4d78406", |
| | | "resource\\CN\\wav\\btn22.wav": "e35c87d370695099d3b6d7f512496395", |
| | | "resource\\CN\\wav\\btn23.wav": "f25db5592331f1e6deb67beecb3c1131", |
| | | "resource\\CN\\wav\\btn31.wav": "054a4f36ebda08fadca3162d955560bf", |
| | | "resource\\CN\\wav\\btn32.wav": "64eb5fef123eafd7b52108ebcd6bace9", |
| | | "resource\\CN\\wav\\btn33.wav": "67d6fe32693cb2e7653c2ff2141ce873", |
| | | "resource\\CN\\wav\\calibration_s.wav": "d2ff1f1f4a40bf4166130dc079939079", |
| | | "resource\\CN\\wav\\control_f.wav": "4dbaca7e4d227a720620b846544b469a", |
| | | "resource\\CN\\wav\\door_close.wav": "325ca8082f8e9fceb2c7eeeb78d8645b", |
| | | "resource\\CN\\wav\\door_open.wav": "f3b5291fc8babaffd32107198cdd5afa", |
| | | "resource\\CN\\wav\\emergency.wav": "a1855c22f3ef2f69d5c84d3a2852ae1f", |
| | | "resource\\CN\\wav\\emergency_f.wav": "946ac86e74b849ad8f1bec3615cf9b39", |
| | | "resource\\CN\\wav\\emergency_s.wav": "a717e3417891ff306225ac075ba28082", |
| | | "resource\\CN\\wav\\failed.wav": "891194e741b0bc8f6332f78eb607cc85", |
| | | "resource\\CN\\wav\\light_close.wav": "b1ac09e91ac4ce3825614ad1654a3f58", |
| | | "resource\\CN\\wav\\light_open.wav": "16b7b6b8c6eb469645a15e4a54a3e014", |
| | | "resource\\CN\\wav\\network.wav": "7bbc6d740918a20acfb5ef75df685bdb", |
| | | "resource\\CN\\wav\\read.wav": "c83edd035dc15f7a716644319e849215", |
| | | "resource\\CN\\wav\\recg_f.wav": "5cd4d88db4e3f8332b9e73fe05222c83", |
| | | "resource\\CN\\wav\\recg_s.wav": "4afadeb018b08518d5d3dd1cfc5e0d64", |
| | | "resource\\CN\\wav\\recognition.wav": "da00dd97d1e8ca0ed20dc43eb4daafc8", |
| | | "resource\\CN\\wav\\recognition_s.wav": "df9916d6fe3d285894668e63d1aeeb1d", |
| | | "resource\\CN\\wav\\register.wav": "a91d6ebb846dc834816a954168da1352", |
| | | "resource\\CN\\wav\\stranger.wav": "2e6690d7ddcd3609ca3e6d6717b61a9c", |
| | | "resource\\CN\\wav\\user2.wav": "868a9b15aac20b62457f98c955f4e5e0", |
| | | "resource\\CN\\wav\\user2_s.wav": "98904054df059be8cd69e08c302317e7", |
| | | "resource\\CN\\wav\\verify.wav": "2bc2b96e0ca05052985fda98fb552ef9", |
| | | "resource\\CN\\wav\\verify_10x_f.wav": "bf26ce11bbd801f5efeff8c9250f219f", |
| | | "resource\\CN\\wav\\verify_10x_s.wav": "2d04b22277844d9c35e08e4e2c67c11c", |
| | | "resource\\CN\\wav\\verify_200_f.wav": "393036b5fc28a3c04580593d59e26e7e", |
| | | "resource\\CN\\wav\\verify_200_s.wav": "585267371d37f3f45e3826ec7dcafbd3", |
| | | "resource\\CN\\wav\\verify_300_f.wav": "e44977e8b6dcac8adbf304894afd24e0", |
| | | "resource\\CN\\wav\\verify_300_s.wav": "d8e23a91e4999b2d77454aab824bd611", |
| | | "resource\\CN\\wav\\verify_400_f.wav": "05752c8c9c2bf4334943999842529d8b", |
| | | "resource\\CN\\wav\\verify_400_s.wav": "740a63ffe907dda0f2d0e14cb9a83f74", |
| | | "resource\\EN\\wav\\calibration_s.wav": "b5497547d9e7e6fb5b28ee307b27752b", |
| | | "resource\\EN\\wav\\network.wav": "1e8ccfd03ca83976fefdba1edcf1b194", |
| | | "resource\\EN\\wav\\read.wav": "8c1f6ee62c7bf74db5ecab28d3988eeb", |
| | | "resource\\EN\\wav\\recg_f.wav": "e303563b867dd6eaebac18679ca760df", |
| | | "resource\\EN\\wav\\recg_s.wav": "183a843b668aa919311a6d352af80f35", |
| | | "resource\\EN\\wav\\recognition.wav": "1c9e06bc338c49c120aa101b1fac8de0", |
| | | "resource\\EN\\wav\\recognition_s.wav": "f887f2b1615121bbe815fef7f64d3b92", |
| | | "resource\\EN\\wav\\register.wav": "de5d0048f840243fdd1392c09d9ac164", |
| | | "resource\\EN\\wav\\stranger.wav": "31775350903916827fdec25b9c65dd94", |
| | | "resource\\EN\\wav\\verify.wav": "2e77ec2c754e1dea329988d4e462aa2f", |
| | | "resource\\EN\\wav\\verify_10x_f.wav": "7ccc23490436b9f1de32200230953a62", |
| | | "resource\\EN\\wav\\verify_10x_s.wav": "0630e0410fca3c7fd7e701c69e8ea4bc", |
| | | "resource\\EN\\wav\\verify_200_f.wav": "64ce473b0f560cc1613469ab94197ce6", |
| | | "resource\\EN\\wav\\verify_200_s.wav": "e3d28c408cc3bef5461620c75b15abdf", |
| | | "resource\\EN\\wav\\verify_300_f.wav": "7fa0d7bf85d040b72a89cfb9e2f06bcf", |
| | | "resource\\EN\\wav\\verify_300_s.wav": "3e69fd763477d6cc30543d838f33d718", |
| | | "resource\\EN\\wav\\verify_400_f.wav": "d074b8f6e4e968b6d1984b123ed4d387", |
| | | "resource\\EN\\wav\\verify_400_s.wav": "9141136d3310a5fac5917d3f6056249f", |
| | | "resource\\font\\AlibabaPuHuiTi-3-65-Medium.ttf": "c8015ba2be3b6bb5fd991e9435ec1f8d", |
| | | "resource\\font\\Arabic.ttf": "3f00fe80780beb16682239db77e1aa80", |
| | | "resource\\font\\Korean.ttf": "470e4a7b27f9944288feb9fa3883b4fb", |
| | | "resource\\i18n\\CN.json": "bc0fd0baf44a41fa1e1ae92b4061a792", |
| | | "resource\\i18n\\EN.json": "bc0fd0baf44a41fa1e1ae92b4061a792", |
| | | "resource\\image\\4g.png": "e5b27ed5a596cb16c7ab695d82fe3014", |
| | | "resource\\image\\4g_dark.png": "414b3a9fcefd8ea6909158b51038d4d8", |
| | | "resource\\image\\accessCtrl.png": "6be30c8f648ec7153ae2c39a15884181", |
| | | "resource\\image\\add.png": "498480ce68e4d6047eb74d3aa5229f56", |
| | | "resource\\image\\advance.png": "d98aeb99a04163bce23b6c2638cd705a", |
| | | "resource\\image\\app.png": "7640c7358a3f5dba1f887b8413b93a9d", |
| | | "resource\\image\\app_btn.png": "aa325cea46fd3918c86d76bf009b1663", |
| | | "resource\\image\\app_qrcode.png": "0a20655d02ff0e473106bf41f7c9687b", |
| | | "resource\\image\\arrow_right.png": "edc6876d6fa1e2d0be2e606c73e0f2ec", |
| | | "resource\\image\\back.png": "aa5869ff78051dbdc5f688f1805064da", |
| | | "resource\\image\\background.jpg": "90d464f4221f62132ebf74e69446b6d7", |
| | | "resource\\image\\backspace.png": "26302e37dd8618e92c3a47d68039d0ec", |
| | | "resource\\image\\back_2.png": "b3f16ab01606d85c2c70124d50b3af1b", |
| | | "resource\\image\\basic.png": "84eedd84efdc5fdb54138dd29cf6fc41", |
| | | "resource\\image\\black_btn.png": "13ee1720aff247ba3f8e22e00f89a316", |
| | | "resource\\image\\card.png": "c05047d2ad6549db001d08790cb5d9ff", |
| | | "resource\\image\\close.png": "a5353c231df804fcc4577672ab3a4302", |
| | | "resource\\image\\close_small.png": "7d6cddddc38ce8d4950789169213add4", |
| | | "resource\\image\\cloudCert.png": "4481cfb9c2d1f44f0a0dd0489cb6fc2b", |
| | | "resource\\image\\co2_f.png": "7e6f00c03b71a4dbe439491083ca731c", |
| | | "resource\\image\\co2_s.png": "4fb691286b8856f1ed25ef8bacdb6099", |
| | | "resource\\image\\commMgmt.png": "5cd157e1b8c82fdf9ddba1f6d5047b9b", |
| | | "resource\\image\\config.png": "50d2091b9f7fba5915dbed0aa0dcf918", |
| | | "resource\\image\\config_btn.png": "e54cbc27d30e7c6480b83107a631e7ef", |
| | | "resource\\image\\delete.png": "014bad6d9a94a133c58ef350e198101e", |
| | | "resource\\image\\delete_fill.png": "947fc08278354a1151d5599382c2c5f3", |
| | | "resource\\image\\deviceInfo.png": "3e40246e01c1f7eede4d76fcbba33825", |
| | | "resource\\image\\devInfo.png": "1a80aba6780a45f8775bdfdcff4df23a", |
| | | "resource\\image\\doorControl.png": "68993ef92bb8c6b2d0dab2c75cc7533d", |
| | | "resource\\image\\down.png": "c4d5c1883db4694ccedb7c1140d89da9", |
| | | "resource\\image\\emergencyOpen.png": "890877dee840dabe60487f8ce57b41f6", |
| | | "resource\\image\\empty.png": "8283ac78099d9c13ef4b552ce86f5c38", |
| | | "resource\\image\\enter.png": "787e076256c8a47e07f2091a57585fb5", |
| | | "resource\\image\\enter_b.png": "02cb6c84fec128a639e3cf0828a6ee5f", |
| | | "resource\\image\\ethernet.png": "f3abb111d96a11a56f7ed77b21abab4c", |
| | | "resource\\image\\ethernet_dark.png": "10656303a6d22e204014f55ed0fb3efb", |
| | | "resource\\image\\eth_disable.png": "7017f5cc2c9b4f802f082f6c0f5bb581", |
| | | "resource\\image\\eth_enable.png": "84d1334e524ac669c3b79e8a69b41eb1", |
| | | "resource\\image\\eye-fill.png": "9ae71914bd47423be04d0a22eb4f3995", |
| | | "resource\\image\\eye-off.png": "295c3e8255ced50cf2667ecda524e11e", |
| | | "resource\\image\\eye_fill.png": "d0ac0d07f13e02e5fae7a12a0858ec49", |
| | | "resource\\image\\eye_fill_show.png": "265cf669797b94a138982c01c29d0bd9", |
| | | "resource\\image\\face.png": "d695a5f29dbf051fc0c6e0d4e177f5c5", |
| | | "resource\\image\\faceAdd.png": "5e0e3d4eb3f034a179a8eef5c08d4c63", |
| | | "resource\\image\\faceEmpty.png": "9ef3bd1d776183e203e69d5c91e4b129", |
| | | "resource\\image\\faceError.png": "19841af9136d4483642a254ab1a6f57c", |
| | | "resource\\image\\faceRec.png": "f1bfcb61f4642c6c1bbc04856fb57905", |
| | | "resource\\image\\faceRec2.png": "580c72783b4cfc64ec0a9593e77c456a", |
| | | "resource\\image\\factoryTest.png": "4bdb36420046870efcabd4a040e31913", |
| | | "resource\\image\\failBg.png": "5d6dca3cc98032a10ef4bc0658f7e546", |
| | | "resource\\image\\grey_btn.png": "b0ca6e44c0e01a17d0bdda5f7e057cc2", |
| | | "resource\\image\\help.png": "7d75da0510ca74870858a639882dc2ef", |
| | | "resource\\image\\idleImage.jpg": "90d464f4221f62132ebf74e69446b6d7", |
| | | "resource\\image\\input_bg.png": "8a8f5c43f1118869a7679ccbaaf47de2", |
| | | "resource\\image\\light_close.png": "607b38280bb5321327cacce5bd6c3fe9", |
| | | "resource\\image\\light_open.png": "1a8df3753b6f0df9e7abb5b53dabd72e", |
| | | "resource\\image\\localUser.png": "6429f43f7fee002d66d50a3d92a087da", |
| | | "resource\\image\\lock.png": "c1419aa2a9c9da4b7dbf3529a1af37f3", |
| | | "resource\\image\\logo.png": "5768b9344bedc53096d2227bee5d52d4", |
| | | "resource\\image\\menu_btn.png": "df98739cd4804d08b23eaf33bb92e1bc", |
| | | "resource\\image\\mini_app.png": "82ee9005b5d162a6fbb0d32764088da4", |
| | | "resource\\image\\mini_background.png": "620bf06dbfffe37f717b91fb3ed8ef40", |
| | | "resource\\image\\mini_config.png": "6bf78553fb53673a89e80613cfbee4c1", |
| | | "resource\\image\\mini_password.png": "6892385a457e084953bcf9acb2ae9957", |
| | | "resource\\image\\mqtt.png": "542ebc6bdbb66ea0f25cf29aeb9d264c", |
| | | "resource\\image\\mqtt_dark.png": "d4aab5adc128846c47a3b8bb015c757b", |
| | | "resource\\image\\mqtt_enable.png": "fc766f5fcbb95eca648ee10d421cc8fe", |
| | | "resource\\image\\network.png": "0a0119e3d5fce101b28575a4e44aaf7e", |
| | | "resource\\image\\networkSetting.png": "3e83d354e8293ed112fe7cc405b94187", |
| | | "resource\\image\\network_dark.png": "3c5f8ce5732e95ad613cdd41dc5adbc0", |
| | | "resource\\image\\o2_f.png": "b787951eba880b3ae82b42594b4e30df", |
| | | "resource\\image\\o2_s.png": "50564fb865bb7f5ed0352e43ea17d853", |
| | | "resource\\image\\ph3_f.png": "e95a348c887298dc4ed0555c577ea5bb", |
| | | "resource\\image\\ph3_s.png": "96e68d741b75fcd6938a6909014cccb0", |
| | | "resource\\image\\pwd_btn.png": "8764458bee98bff728445837e126231e", |
| | | "resource\\image\\qrcode_small.png": "285bbe7e8f968c8bf4506a563dffcac2", |
| | | "resource\\image\\recordQuery.png": "d340255a0c2342382bff6f8c57f6376b", |
| | | "resource\\image\\recQuery.png": "1b8c58663a6e61f4f885e784ee4e87d4", |
| | | "resource\\image\\rectangle.png": "394e2e483120908674f6de7fb879bfcf", |
| | | "resource\\image\\register.png": "7fa975d92007703532ba8011f2a0109f", |
| | | "resource\\image\\right.png": "a6f6bc770ad7a8220effcc96e750aaaa", |
| | | "resource\\image\\select_arrow.png": "9d82daa1092375abc413d581f36aaf2d", |
| | | "resource\\image\\setting.png": "92365fd93f2cfa63c7901ce3d8900a42", |
| | | "resource\\image\\setting32.png": "e531bf8a9ce7f6cf93a8ea9baf95377c", |
| | | "resource\\image\\space.png": "de9816e31308bd7ce187fe03ab634a37", |
| | | "resource\\image\\successBg.png": "1ef294bd7e1688bba47c2337906b1d1d", |
| | | "resource\\image\\success_fill.png": "09166b0cd4da44b76b4f6cdc2c550103", |
| | | "resource\\image\\sysSettings.png": "0a84bbe887481a1cce1ca562f83d5b89", |
| | | "resource\\image\\systemSetting.png": "9aee20d073df321250a5bbc57d16d5f1", |
| | | "resource\\image\\sys_info.png": "20dc23c019d07cd2c3ce32a160b7b63f", |
| | | "resource\\image\\title_bg.png": "82fbdcc4133899d03072dcd57a92f203", |
| | | "resource\\image\\trackFace.png": "e90f92eb629563ede01aadca2b719de9", |
| | | "resource\\image\\unlock.png": "7b97b659c36d3ba4f435f44792b90a80", |
| | | "resource\\image\\user.png": "6429f43f7fee002d66d50a3d92a087da", |
| | | "resource\\image\\userGuide.png": "3227210f670f66cd6c29641e1212b0b8", |
| | | "resource\\image\\userMgmt.png": "5dad96f344513f970c2b582d7feb537d", |
| | | "resource\\image\\user_1.png": "36ab26e22dc39ea28c03f05f4ab891ce", |
| | | "resource\\image\\user_f.png": "d82d235224deccd2235ab15dbf1fda26", |
| | | "resource\\image\\user_s.png": "709953f3695cae9ac1bb50533f1a96ba", |
| | | "resource\\image\\user_w.png": "bc2ca556f37181815c0093d802f2f24f", |
| | | "resource\\image\\vf105\\4g.png": "deebc58c4b7c81d3628c6bfe3d833917", |
| | | "resource\\image\\vf105\\4g_dark.png": "5cfe44ac267d0a1dfbfb896caa5dfe42", |
| | | "resource\\image\\vf105\\accessCtrl.png": "0561dac85eb4b325fdc377c63a1d1f52", |
| | | "resource\\image\\vf105\\add.png": "5ae43bc20471a91c6891d9a7cbe1e960", |
| | | "resource\\image\\vf105\\advance.png": "cb19e041703481ec6b0936074d3ff9d0", |
| | | "resource\\image\\vf105\\app.png": "2aa76ac48dcd1e35789f4031e2c90d76", |
| | | "resource\\image\\vf105\\app_btn.png": "9e8242d16657897b531a57bad52a0b20", |
| | | "resource\\image\\vf105\\app_qrcode.png": "919faf258376df92efc42a27ba5f42ea", |
| | | "resource\\image\\vf105\\arrow_right.png": "c01c64cf2d2f257917e6b733d2dc61ee", |
| | | "resource\\image\\vf105\\back.png": "be4dce7a5996ed70af1207a1f3e1ffbf", |
| | | "resource\\image\\vf105\\background.jpg": "1327b8fbd25c1a38da1a14c6b23fd381", |
| | | "resource\\image\\vf105\\backspace.png": "4f3eebd143aa2abc2c4f058d311a108d", |
| | | "resource\\image\\vf105\\back_2.png": "1d4bd817afe4cb46769c9a478305c823", |
| | | "resource\\image\\vf105\\basic.png": "1917055452e69999d6160255283bd5fe", |
| | | "resource\\image\\vf105\\black_btn.png": "da8f9db1ef40edace91552ae2a89357a", |
| | | "resource\\image\\vf105\\card.png": "59af350406e053f432e558f8ae3787d5", |
| | | "resource\\image\\vf105\\close.png": "cc269b704bc8c998f1f0b4eaae921469", |
| | | "resource\\image\\vf105\\close_small.png": "e5e5c5a54b90cda627c6c03675cdf56b", |
| | | "resource\\image\\vf105\\cloudCert.png": "5e56e48322f2bcef31ba844c8bebc393", |
| | | "resource\\image\\vf105\\commMgmt.png": "81b9d03c23f75ad877df64de06911c44", |
| | | "resource\\image\\vf105\\config.png": "648480dea71675fbb8a838a96b861f4c", |
| | | "resource\\image\\vf105\\config_btn.png": "2a581106bd12c67da3205b613bc10122", |
| | | "resource\\image\\vf105\\delete.png": "2ad0310904b10885096fba14965244f2", |
| | | "resource\\image\\vf105\\delete_fill.png": "29d3a8d714b6a0f0bd73dd8ef5947df6", |
| | | "resource\\image\\vf105\\developer.png": "e71e5ac6071eb821e86b44a91b59c838", |
| | | "resource\\image\\vf105\\deviceInfo.png": "deb7e25ebba6ac92b86bf0e740fdba12", |
| | | "resource\\image\\vf105\\devInfo.png": "fc661d4864cae401050ffd3fb61c19ac", |
| | | "resource\\image\\vf105\\doorControl.png": "e9e1e2400a3bc2b8a566757a7e73b104", |
| | | "resource\\image\\vf105\\down.png": "4fb09683bd3472015d5ae857b902e5f8", |
| | | "resource\\image\\vf105\\empty.png": "1ace2c58eefdbb660ebda558bbf971ff", |
| | | "resource\\image\\vf105\\enter.png": "4fdefe7a74ee80fb788fe44cbae40939", |
| | | "resource\\image\\vf105\\enter_b.png": "a17ddca038c8e48961421e42dadef12c", |
| | | "resource\\image\\vf105\\ethernet.png": "bd6ff1bd4635626409ae1368ea819190", |
| | | "resource\\image\\vf105\\ethernet_dark.png": "b620fb06a520673227b24fe875bc8c04", |
| | | "resource\\image\\vf105\\eth_disable.png": "fb715be89aae2b189cef1a93796a2bbd", |
| | | "resource\\image\\vf105\\eth_enable.png": "11366418b487b814ad63be2a11fad9a3", |
| | | "resource\\image\\vf105\\eye-fill.png": "8cbf389b92610178808283930cf2c29e", |
| | | "resource\\image\\vf105\\eye-off.png": "fb636053be988b443f9d52901dd773a1", |
| | | "resource\\image\\vf105\\eye_fill.png": "4b7ef420f57d10e271c745587a9c5692", |
| | | "resource\\image\\vf105\\eye_fill_show.png": "9677930e55cbe5766a75554d527ab3f1", |
| | | "resource\\image\\vf105\\face.png": "dc94fe6a6c31259ae386b6a84f41884a", |
| | | "resource\\image\\vf105\\faceAdd.png": "2e02cea502f061c31537bff3281d8d93", |
| | | "resource\\image\\vf105\\faceEmpty.png": "4e766bd9e4150be9a1149a7c072a9787", |
| | | "resource\\image\\vf105\\faceError.png": "0be5992ee5364f99589217b1199ad7db", |
| | | "resource\\image\\vf105\\faceRec.png": "9c6573c2861d9e136ba789ad748af684", |
| | | "resource\\image\\vf105\\faceRec2.png": "62ceecccb4888209192f7000f307bb70", |
| | | "resource\\image\\vf105\\factoryTest.png": "f0324fe73098bb08a2208e44f6ef3d6d", |
| | | "resource\\image\\vf105\\failBg.png": "358ad8e1f0312efbafdb077b504c165e", |
| | | "resource\\image\\vf105\\fingerBoxF.png": "125df8fa37905599d62ff47bbbd83aaf", |
| | | "resource\\image\\vf105\\fingerBoxS.png": "db2154eb4d4bd3d83b5230c04444477e", |
| | | "resource\\image\\vf105\\fingerRe0.png": "031e35a4b855732d72e64097ec9d01f6", |
| | | "resource\\image\\vf105\\fingerRe1.png": "0056ca579917f7d4fc9da9eebf848107", |
| | | "resource\\image\\vf105\\fingerRe2.png": "5f76290d264c5be03cf87367ccff6b98", |
| | | "resource\\image\\vf105\\fingerRe3.png": "f8cd749690744cffceff1ccd2d82e3fd", |
| | | "resource\\image\\vf105\\grey_btn.png": "76a60991c1e633ddbf6fd62c9f620d25", |
| | | "resource\\image\\vf105\\help.png": "ca3028f1bea2dbb14ffb86c2e779a038", |
| | | "resource\\image\\vf105\\idleImage.jpg": "44bfe1382c2e7055a1955b924acea44a", |
| | | "resource\\image\\vf105\\idleImage.png": "3ae637d7958e135f2164f4e9577f493f", |
| | | "resource\\image\\vf105\\localUser.png": "46e92a28978bbd8da82d8eb7d3168aa4", |
| | | "resource\\image\\vf105\\lock.png": "6ce2803f6feb5dd8e1b015fd774c497d", |
| | | "resource\\image\\vf105\\menu_btn.png": "1e7fc164bce121b3f06e50af62c51e25", |
| | | "resource\\image\\vf105\\mini_app.png": "973d67e3375260e7001ae01e0cac2d38", |
| | | "resource\\image\\vf105\\mini_background.png": "f6ea6c8747055632dfc26c4dd2223549", |
| | | "resource\\image\\vf105\\mini_config.png": "0c77094b492d84314afbdd24ee57c09d", |
| | | "resource\\image\\vf105\\mini_password.png": "17481fb43930feaa36c882db1186748a", |
| | | "resource\\image\\vf105\\mqtt.png": "ee92d53c5c6982b7c0418a5ec6821f59", |
| | | "resource\\image\\vf105\\mqtt_dark.png": "a4571c52ac1208ca9de4279cafcfeea8", |
| | | "resource\\image\\vf105\\network.png": "e067a6a31b3b3f8e6cacd96cc77c5216", |
| | | "resource\\image\\vf105\\networkSetting.png": "61b2477bcb70865b7c166df7f777f416", |
| | | "resource\\image\\vf105\\network_dark.png": "d142406315dcfa2a1277f9aacf03cffa", |
| | | "resource\\image\\vf105\\pwd_btn.png": "c3fed4b5d9c6288bf1207ca5d92d619c", |
| | | "resource\\image\\vf105\\qrcode_small.png": "cc962f51b5404db51bbc2868c4d6af77", |
| | | "resource\\image\\vf105\\recordQuery.png": "7503152bdf3aafded5295fa321d93654", |
| | | "resource\\image\\vf105\\recQuery.png": "1de029b697e42affb3103ddba57382f1", |
| | | "resource\\image\\vf105\\rectangle.png": "b64428c942dfa899df37b9cf0d3f43f8", |
| | | "resource\\image\\vf105\\register.png": "f4b081b7aef4dc6d1ba1ce6e99056734", |
| | | "resource\\image\\vf105\\right.png": "cb0cbed9eb5970784965d8e89f82478f", |
| | | "resource\\image\\vf105\\select_arrow.png": "da3020499f41c8b7f6f2ea5f4336db4b", |
| | | "resource\\image\\vf105\\setting.png": "a65d388b9aab8be38c636823a63946a4", |
| | | "resource\\image\\vf105\\setting32.png": "23524292f4f233b55c9f418a5e2e25b7", |
| | | "resource\\image\\vf105\\space.png": "e86fb40094372f10671b013ce07b7eb6", |
| | | "resource\\image\\vf105\\successBg.png": "fbf2cd4b5878d02d9c3583a444d02467", |
| | | "resource\\image\\vf105\\success_fill.png": "1299222da2acb2f5209dc754cc0e3677", |
| | | "resource\\image\\vf105\\sysSettings.png": "e2f48df59e6624717dd0c6ca35ff91ca", |
| | | "resource\\image\\vf105\\systemSetting.png": "8ebd576b41be069d1db5e1919b95bd52", |
| | | "resource\\image\\vf105\\sys_info.png": "374377d37b88c5be8678dd8314f443d0", |
| | | "resource\\image\\vf105\\trackFace.png": "efc48bdabbc21e49cb3d20e4e43b63c0", |
| | | "resource\\image\\vf105\\unlock.png": "5efdc71f5f45a431e0e8b0d74faa91a2", |
| | | "resource\\image\\vf105\\user.png": "7e8ef656c544c3432f015c655421ff8f", |
| | | "resource\\image\\vf105\\userGuide.png": "cbfac61db886f390c07d2a98161ef802", |
| | | "resource\\image\\vf105\\userMgmt.png": "5cc57923cb18f394673cea498132daa2", |
| | | "resource\\image\\vf105\\vip.png": "921e0753528bf63d031b73473549db9f", |
| | | "resource\\image\\vf105\\voiceBroadcast.png": "9a0e56e9e8d878559f9dad0138c3c1d9", |
| | | "resource\\image\\vf105\\wechat.png": "bf6b8466a1a8d84d869b06efd3540d46", |
| | | "resource\\image\\vf105\\wifi.png": "fb46272231389474003cd2f5191ea353", |
| | | "resource\\image\\vf105\\wifi_dark.png": "a167e7e06f3ed5740e3336b7f8123c8b", |
| | | "resource\\image\\vf114\\4g.png": "bdd7c97e50e4b092673b29bbe88bd8b8", |
| | | "resource\\image\\vf114\\4g_dark.png": "3539b8fc025cb50b04db91d632952548", |
| | | "resource\\image\\vf114\\accessCtrl.png": "9dfb072e0137274eec201845ad555665", |
| | | "resource\\image\\vf114\\add.png": "95fdd8fc16b07b45a6ec87cd737e5071", |
| | | "resource\\image\\vf114\\advance.png": "ad39f26cd248c761944c588396617b75", |
| | | "resource\\image\\vf114\\app.png": "702301a70e1a69b8dc07ae08ee0b3c9a", |
| | | "resource\\image\\vf114\\app_btn.png": "0173d42cca268ee3162e1d4877655af4", |
| | | "resource\\image\\vf114\\app_qrcode.png": "e03e3a48337ca68e4f6639bb814a3cd4", |
| | | "resource\\image\\vf114\\arrow_right.png": "76e59179fee9109776b2d6c3178de0d0", |
| | | "resource\\image\\vf114\\back.png": "974667f9572bd57b221c95da25ae5343", |
| | | "resource\\image\\vf114\\background.jpg": "ad3dd883a8878f3cd8b6d9d9b1726c05", |
| | | "resource\\image\\vf114\\backspace.png": "63458547fb5c95ea53cf92a2204b04a9", |
| | | "resource\\image\\vf114\\back_2.png": "d166678290cae0616dcb2053294eca28", |
| | | "resource\\image\\vf114\\basic.png": "6885a5790b032eda507250b01411eda8", |
| | | "resource\\image\\vf114\\black_btn.png": "2c69fa32fd710cd0544b19a2b3630fc3", |
| | | "resource\\image\\vf114\\card.png": "a7700c9f983f73747ab519b74a9a35b1", |
| | | "resource\\image\\vf114\\close.png": "324b84b237288f7cde0b08ad12d1d577", |
| | | "resource\\image\\vf114\\close_small.png": "b88b06ecb81f18c9b70ba6c4b4052169", |
| | | "resource\\image\\vf114\\cloudCert.png": "e1f01a5bcc0e0f40afb8ad3ae8a1d77b", |
| | | "resource\\image\\vf114\\commMgmt.png": "33c350ead16aa52ec41b0e68d5a28684", |
| | | "resource\\image\\vf114\\config.png": "fd5f1336f72193f7c15698941a208509", |
| | | "resource\\image\\vf114\\config_btn.png": "8ed325539cc83b73d915e9ccda9e2e43", |
| | | "resource\\image\\vf114\\delete.png": "3cce3c9fafb55aac0402255f0631f436", |
| | | "resource\\image\\vf114\\delete_fill.png": "b08f9411e7522b9e7cafab4d40c5311e", |
| | | "resource\\image\\vf114\\developer.png": "44a015510d4b1aabfa4959afb94a433b", |
| | | "resource\\image\\vf114\\deviceInfo.png": "d4f02a866605b683f135ab7dbba549b9", |
| | | "resource\\image\\vf114\\devInfo.png": "faed670572922bda527fc8255412e548", |
| | | "resource\\image\\vf114\\doorControl.png": "7be9d2b7b3b3432176e9bb2fdaf49f5e", |
| | | "resource\\image\\vf114\\down.png": "5a6689a7adc59c87a6ed2d565875c99d", |
| | | "resource\\image\\vf114\\empty.png": "0c4645c8c569b84b22b84ef471a256fb", |
| | | "resource\\image\\vf114\\enter.png": "cfdde3f3e9127940c95ba141a3ed9b9a", |
| | | "resource\\image\\vf114\\enter_b.png": "1604cad02b5a9daa13e5d813b113ab54", |
| | | "resource\\image\\vf114\\ethernet.png": "fad299febb1021bb8c11d2b5bffe44bb", |
| | | "resource\\image\\vf114\\ethernet_dark.png": "693e0fdda1c57c85fe39231915ce3cbc", |
| | | "resource\\image\\vf114\\eth_disable.png": "6cf5c960b556abf16fea7c42687baa5b", |
| | | "resource\\image\\vf114\\eth_enable.png": "a7ff6da3b332f5fbaf0a56e77f2760d2", |
| | | "resource\\image\\vf114\\eye-fill.png": "e9fafd51f0d641f0c8adc683374d6c05", |
| | | "resource\\image\\vf114\\eye-off.png": "a501181551682e1408f723fdbe63b9de", |
| | | "resource\\image\\vf114\\eye_fill.png": "eda7423b7a833faf1b795fe592ae5aa4", |
| | | "resource\\image\\vf114\\eye_fill_show.png": "0974c798b074126a70924b61456b44ea", |
| | | "resource\\image\\vf114\\face.png": "06b7afd104e793f5352d04d34df91c05", |
| | | "resource\\image\\vf114\\faceAdd.png": "0b5ad2c4bd3e8c5fbf139495310574be", |
| | | "resource\\image\\vf114\\faceEmpty.png": "3c72971bf874c4ab54793944f65a2275", |
| | | "resource\\image\\vf114\\faceError.png": "1f53a4b110495ef1685c87776af5eedf", |
| | | "resource\\image\\vf114\\faceRec.png": "862e02eb3cf55fe786aafea089df57c4", |
| | | "resource\\image\\vf114\\faceRec2.png": "a0fee4f4e7662b1ad9f6a51f1dddc35f", |
| | | "resource\\image\\vf114\\factoryTest.png": "b8490aa1a9f613bc1cbd6b96d8214dc0", |
| | | "resource\\image\\vf114\\failBg.png": "5527c1808e8443f945cd2c72d4794d83", |
| | | "resource\\image\\vf114\\fingerBoxF.png": "125df8fa37905599d62ff47bbbd83aaf", |
| | | "resource\\image\\vf114\\fingerBoxS.png": "db2154eb4d4bd3d83b5230c04444477e", |
| | | "resource\\image\\vf114\\fingerRe0.png": "031e35a4b855732d72e64097ec9d01f6", |
| | | "resource\\image\\vf114\\fingerRe1.png": "0056ca579917f7d4fc9da9eebf848107", |
| | | "resource\\image\\vf114\\fingerRe2.png": "5f76290d264c5be03cf87367ccff6b98", |
| | | "resource\\image\\vf114\\fingerRe3.png": "f8cd749690744cffceff1ccd2d82e3fd", |
| | | "resource\\image\\vf114\\grey_btn.png": "5c9d4c08a43153dfdc1302e37f4c1634", |
| | | "resource\\image\\vf114\\help.png": "a5b6c8c6931e00bc77804e42aeae011f", |
| | | "resource\\image\\vf114\\idleImage.jpg": "ad3dd883a8878f3cd8b6d9d9b1726c05", |
| | | "resource\\image\\vf114\\idleImage.png": "67b21ca8b9dfffb56ca1461c16b55afc", |
| | | "resource\\image\\vf114\\localUser.png": "af0d5ded90865acac93e68870f910cd9", |
| | | "resource\\image\\vf114\\lock.png": "54ae7cc3b5d50ec68939bd5bc8309ef2", |
| | | "resource\\image\\vf114\\menu_btn.png": "fd5f1336f72193f7c15698941a208509", |
| | | "resource\\image\\vf114\\mini_app.png": "638cdf3c7fbd1f86c69927dde9a214fe", |
| | | "resource\\image\\vf114\\mini_background.png": "11134c0d4ac0097232618ed1a62883e4", |
| | | "resource\\image\\vf114\\mini_config.png": "69f3f7a33cf1617ec08fb8d228facb0a", |
| | | "resource\\image\\vf114\\mini_password.png": "be1e0d36d21e9f70262243e63ac11fe8", |
| | | "resource\\image\\vf114\\mqtt.png": "e1a62521c2273ec0cef41144854acea9", |
| | | "resource\\image\\vf114\\mqtt_dark.png": "51ab6bb9a073752697b1f7241f5ad6f2", |
| | | "resource\\image\\vf114\\network.png": "d0460d1844015a805a1f52d8432001f5", |
| | | "resource\\image\\vf114\\networkSetting.png": "d1e5477b9ddf2da94e637876530481dd", |
| | | "resource\\image\\vf114\\network_dark.png": "60f7b54297f927126f52302de8b4b18f", |
| | | "resource\\image\\vf114\\pwd_btn.png": "a8f19a82bfe03b629ac3e0a3964135fc", |
| | | "resource\\image\\vf114\\qrcode_small.png": "12ba5e07703c3bf32c6ef4ff7750242e", |
| | | "resource\\image\\vf114\\recordQuery.png": "a4ad2ada5f8bf9c13d5a58bf70e40cac", |
| | | "resource\\image\\vf114\\recQuery.png": "98a6a81d624137dea96dcc0e8780902f", |
| | | "resource\\image\\vf114\\rectangle.png": "9482162a7b2744f313041be02c2c7c35", |
| | | "resource\\image\\vf114\\register.png": "35b0032b10158b850ebab52c1b89fc2b", |
| | | "resource\\image\\vf114\\right.png": "55fb9deeabf97b30da9749dd51aea5ea", |
| | | "resource\\image\\vf114\\select_arrow.png": "db66347b510537a4314da045c526cb0e", |
| | | "resource\\image\\vf114\\setting.png": "ecf2ed928f51c830176a6ae4f503034c", |
| | | "resource\\image\\vf114\\setting32.png": "8412dcd0fa26cb8bb812d76d2c257e9b", |
| | | "resource\\image\\vf114\\space.png": "65eac6437c86617b7be146390b34e12a", |
| | | "resource\\image\\vf114\\successBg.png": "a3ca0ce6acf62f57e4fcf25f5a073c13", |
| | | "resource\\image\\vf114\\success_fill.png": "589b3bd7fbcf7880c5f2b23accdd36e1", |
| | | "resource\\image\\vf114\\sysSettings.png": "946f8967e9b323b34f27242f0990d137", |
| | | "resource\\image\\vf114\\systemSetting.png": "19f0225379041aec6b16e1cf5af54962", |
| | | "resource\\image\\vf114\\sys_info.png": "5725825e5d4364dc578ad47754f92270", |
| | | "resource\\image\\vf114\\trackFace.png": "1b2e2ddf116119b5d39cbc37bf5011ed", |
| | | "resource\\image\\vf114\\unlock.png": "fb4defefea714489b8ed7b7002270f38", |
| | | "resource\\image\\vf114\\user.png": "af0d5ded90865acac93e68870f910cd9", |
| | | "resource\\image\\vf114\\userGuide.png": "89831ab4360b20a5b4c99e0ea48f5ac7", |
| | | "resource\\image\\vf114\\userMgmt.png": "0e3e47b6fe33cb209bc0c350917945e2", |
| | | "resource\\image\\vf114\\vip.png": "936afbfc08e7d30831805407a3d73f24", |
| | | "resource\\image\\vf114\\voiceBroadcast.png": "eb3ed0a4728e47e3ee684637fa0862ce", |
| | | "resource\\image\\vf114\\wechat.png": "78a3125fc2c9b62d5fb83b5f9a255a4f", |
| | | "resource\\image\\vf114\\wifi.png": "f966bbd23a878842cc6927cf2232eb26", |
| | | "resource\\image\\vf114\\wifi_dark.png": "aa8fd7b0f6920c47c18e3a4c731c1279", |
| | | "resource\\image\\vf202\\4g.png": "dac9a45fe25163789ea513e2fcf76c2f", |
| | | "resource\\image\\vf202\\4g_dark.png": "0e91379860cc3f29cb10e941ea1cf445", |
| | | "resource\\image\\vf202\\accessCtrl.png": "252dfe563aa14ed13f6335c66819e88e", |
| | | "resource\\image\\vf202\\add.png": "37f570778a63000e2fe13693a837e50c", |
| | | "resource\\image\\vf202\\advance.png": "6890b0ea472a8d2534982a338bb212e6", |
| | | "resource\\image\\vf202\\app.png": "778a7f45f1c61545c444b35ac1bb636c", |
| | | "resource\\image\\vf202\\app_btn.png": "1a7beb9c843dac5bfe8cb516ae85e578", |
| | | "resource\\image\\vf202\\app_qrcode.png": "24f2dd26efc016c829afd1ad9ec10021", |
| | | "resource\\image\\vf202\\arrow_right.png": "44bd3be59aa1e6a3d55e1932ee139a41", |
| | | "resource\\image\\vf202\\back.png": "576a3ac118a18df9e5c19371b51cd0b7", |
| | | "resource\\image\\vf202\\background.jpg": "e261f9d11ba192b9a318855198a82a72", |
| | | "resource\\image\\vf202\\backspace.png": "83a1bf7837d546548d4cc224ac0b95f2", |
| | | "resource\\image\\vf202\\back_2.png": "2f4178d75fa6e2811745b790763dfd22", |
| | | "resource\\image\\vf202\\basic.png": "19f16388b948bb3c62d8177060dcd0a6", |
| | | "resource\\image\\vf202\\black_btn.png": "b15f6df11a49a205289eb2471da39ae6", |
| | | "resource\\image\\vf202\\card.png": "9f9b02e484e6621f0929289daa32ab31", |
| | | "resource\\image\\vf202\\close.png": "9d61811afdf59012d7bb482487b49edb", |
| | | "resource\\image\\vf202\\close_small.png": "9956b2ae6ed2874af7c1fc631f34a423", |
| | | "resource\\image\\vf202\\cloudCert.png": "245c00f50c46be8da93960416f47cfff", |
| | | "resource\\image\\vf202\\commMgmt.png": "58ad847a1a506b66f92adcad635e0f12", |
| | | "resource\\image\\vf202\\config.png": "5bf26f61a5105bc20c9885679754ce1c", |
| | | "resource\\image\\vf202\\config_btn.png": "8d16e5ca4e08e31e9e22422ed21d6478", |
| | | "resource\\image\\vf202\\delete.png": "46e9b381a1bc45e950f1b332ecf54940", |
| | | "resource\\image\\vf202\\delete_fill.png": "4a215805b88677ede12627c4ac9e3a17", |
| | | "resource\\image\\vf202\\developer.png": "3314b8f50d20c7939bf17806622f2180", |
| | | "resource\\image\\vf202\\deviceInfo.png": "4710af6ceceaab1cdfc0032223144a64", |
| | | "resource\\image\\vf202\\devInfo.png": "ca529fac38bf272fab9c0fa93d651ce5", |
| | | "resource\\image\\vf202\\doorControl.png": "5ba35b3c1e45572f306fcc223e2c864f", |
| | | "resource\\image\\vf202\\down.png": "2a176c857ace4437068c182e7b175619", |
| | | "resource\\image\\vf202\\empty.png": "e36fc80c084639da27bee183eeaadba0", |
| | | "resource\\image\\vf202\\enter.png": "43b728abb252831b9309bd655a6ade86", |
| | | "resource\\image\\vf202\\enter_b.png": "d15c73e1c6d60bc4e74f501c0eb00ff4", |
| | | "resource\\image\\vf202\\ethernet.png": "7a6a8557200fe9ea9405fb5701797366", |
| | | "resource\\image\\vf202\\ethernet_dark.png": "21febf0b45887830c68938fbc756a6b2", |
| | | "resource\\image\\vf202\\eth_disable.png": "46def5850282186289fedcf3e1090ec1", |
| | | "resource\\image\\vf202\\eth_enable.png": "c7e2883cdca3c31dfa5ce7b59a38dd95", |
| | | "resource\\image\\vf202\\eye-fill.png": "f759a1d079b83215b7fdf8bde65ca6a9", |
| | | "resource\\image\\vf202\\eye-off.png": "08232a8b9562ac218e5364bc1702635d", |
| | | "resource\\image\\vf202\\eye_fill.png": "d40a644a0ecf10d29a5c3255e584729e", |
| | | "resource\\image\\vf202\\eye_fill_show.png": "a9c69cb678a2face9eb5c6d74ea3e819", |
| | | "resource\\image\\vf202\\face.png": "3ace44209c5a0972f0577fea245cc1f4", |
| | | "resource\\image\\vf202\\faceAdd.png": "0d9521169bdf6134a77f0efe20a4f923", |
| | | "resource\\image\\vf202\\faceEmpty.png": "0e7656faefc150c0a978dfac8e498c8d", |
| | | "resource\\image\\vf202\\faceError.png": "5d8036a7cae3615be4dcb2087f63e626", |
| | | "resource\\image\\vf202\\faceRec.png": "103012d8e17f980f91f37a00c246eae3", |
| | | "resource\\image\\vf202\\faceRec2.png": "300f0aa222a85398f67c7e28273ef501", |
| | | "resource\\image\\vf202\\factoryTest.png": "b3e8ae285f5f45675d3fa6f61446b01a", |
| | | "resource\\image\\vf202\\failBg.png": "a1d3e65aa14f159f468ba8835639c131", |
| | | "resource\\image\\vf202\\grey_btn.png": "1646b5420adf33ad1689af68c3062402", |
| | | "resource\\image\\vf202\\help.png": "6728c869776d883015eba1fffcf90613", |
| | | "resource\\image\\vf202\\idleImage.jpg": "e261f9d11ba192b9a318855198a82a72", |
| | | "resource\\image\\vf202\\idleImage.png": "6642f66bb0278150beac1b7b9fd7cd73", |
| | | "resource\\image\\vf202\\localUser.png": "46e06778952856e8805c39139128a3aa", |
| | | "resource\\image\\vf202\\lock.png": "d845e9bb5e35713e514b40c79dd8df94", |
| | | "resource\\image\\vf202\\menu_btn.png": "5bf26f61a5105bc20c9885679754ce1c", |
| | | "resource\\image\\vf202\\mini_app.png": "1ca5b55edcdcc5a3fd63f6ca4c977648", |
| | | "resource\\image\\vf202\\mini_background.png": "f7fa498fee57c3711d6824423665d6c3", |
| | | "resource\\image\\vf202\\mini_config.png": "a0978038a399d5d12a08f8886c3925bc", |
| | | "resource\\image\\vf202\\mini_password.png": "ab932304364b69d12884d019a178fe6a", |
| | | "resource\\image\\vf202\\mqtt.png": "8ae57eb8159a7e262ff69e7f1a394d53", |
| | | "resource\\image\\vf202\\mqtt_dark.png": "825ee7221785793dc3d70d685587bf8d", |
| | | "resource\\image\\vf202\\network.png": "95f44b690704e449e8575950954e3d6f", |
| | | "resource\\image\\vf202\\networkSetting.png": "f35618eddfc8409171159bdb0c0094f9", |
| | | "resource\\image\\vf202\\network_dark.png": "6458359eb6eede7a43750a562c0c4ea2", |
| | | "resource\\image\\vf202\\pwd_btn.png": "abee92156861b29fc866e9d4b73a5c42", |
| | | "resource\\image\\vf202\\qrcode_small.png": "6d00a50369b5002f9c1e0b2f63419169", |
| | | "resource\\image\\vf202\\recordQuery.png": "a51176f07c88fc740ca262c051fc31f6", |
| | | "resource\\image\\vf202\\recQuery.png": "9667e8dff1cbd45c47fd179a390e8464", |
| | | "resource\\image\\vf202\\rectangle.png": "0ad638ea5e599eba928210127349f72f", |
| | | "resource\\image\\vf202\\register.png": "c3e3895f3eb275b924c682b12e1f4858", |
| | | "resource\\image\\vf202\\right.png": "a0cf4963f9225509668bb4f4547fe1f2", |
| | | "resource\\image\\vf202\\select_arrow.png": "f99d4833326933fc5979d1bef6ab13a3", |
| | | "resource\\image\\vf202\\setting.png": "6d936d9331f9a16106f0956d63a43d9b", |
| | | "resource\\image\\vf202\\setting32.png": "76b9637f7aece12d2ebb14684fe9a0c7", |
| | | "resource\\image\\vf202\\space.png": "bdf92f0846c70e068872a62e64198a95", |
| | | "resource\\image\\vf202\\successBg.png": "9b1cf2d0410a6c5b10802b0645d664bf", |
| | | "resource\\image\\vf202\\success_fill.png": "7d95368d99dcd7bb86d26f9c488fc51c", |
| | | "resource\\image\\vf202\\sysSettings.png": "cbd0b4362afbfb2f65df290e9fd5e0dd", |
| | | "resource\\image\\vf202\\systemSetting.png": "ebffe5062a323f123cdb3ed61d0beae3", |
| | | "resource\\image\\vf202\\sys_info.png": "9a22244032b537e10aefce4d751bf7a1", |
| | | "resource\\image\\vf202\\tip_card.png": "3d2870619abcb67b3665c28bad20f68c", |
| | | "resource\\image\\vf202\\trackFace.png": "ef2f257efcaeda212e148e7e74e88dae", |
| | | "resource\\image\\vf202\\unlock.png": "221c28aa8d6ee43ac1fecb62ef59554d", |
| | | "resource\\image\\vf202\\user.png": "46e06778952856e8805c39139128a3aa", |
| | | "resource\\image\\vf202\\userGuide.png": "e1237d22454a3b32b47382eaea2ea3f6", |
| | | "resource\\image\\vf202\\userMgmt.png": "8498f8a520f70a758c5f34f2b21d276d", |
| | | "resource\\image\\vf202\\vip.png": "f41ac8a61926ee0cc7ce66a0ffae9d4f", |
| | | "resource\\image\\vf202\\voiceBroadcast.png": "edf212a156202cbc40fb34f194a0d417", |
| | | "resource\\image\\vf202\\wechat.png": "d02d045138c3ae125888acf01ef50642", |
| | | "resource\\image\\vf202\\wifi.png": "cd0b8b70a30d25278896064e3ce20a79", |
| | | "resource\\image\\vf202\\wifi_dark.png": "520131d4f1423fb6be242a7c193d952b", |
| | | "resource\\image\\vf203\\4g.png": "e5b27ed5a596cb16c7ab695d82fe3014", |
| | | "resource\\image\\vf203\\4g_dark.png": "414b3a9fcefd8ea6909158b51038d4d8", |
| | | "resource\\image\\vf203\\accessCtrl.png": "6be30c8f648ec7153ae2c39a15884181", |
| | | "resource\\image\\vf203\\add.png": "498480ce68e4d6047eb74d3aa5229f56", |
| | | "resource\\image\\vf203\\advance.png": "d98aeb99a04163bce23b6c2638cd705a", |
| | | "resource\\image\\vf203\\app.png": "b356136ee80e638afc0bd63b5fe058c8", |
| | | "resource\\image\\vf203\\app_btn.png": "0630aeda9d5f294c1a8b4d5a4404e43d", |
| | | "resource\\image\\vf203\\app_qrcode.png": "162225bafe2c27282b0f6330b05959f6", |
| | | "resource\\image\\vf203\\arrow_right.png": "edc6876d6fa1e2d0be2e606c73e0f2ec", |
| | | "resource\\image\\vf203\\back.png": "aa5869ff78051dbdc5f688f1805064da", |
| | | "resource\\image\\vf203\\background.jpg": "75768189315c907532dda963d31b9ba0", |
| | | "resource\\image\\vf203\\backspace.png": "26302e37dd8618e92c3a47d68039d0ec", |
| | | "resource\\image\\vf203\\back_2.png": "b3f16ab01606d85c2c70124d50b3af1b", |
| | | "resource\\image\\vf203\\basic.png": "84eedd84efdc5fdb54138dd29cf6fc41", |
| | | "resource\\image\\vf203\\black_btn.png": "c66efd82b546bf991b1e231f89b71e9b", |
| | | "resource\\image\\vf203\\card.png": "c05047d2ad6549db001d08790cb5d9ff", |
| | | "resource\\image\\vf203\\close.png": "a5353c231df804fcc4577672ab3a4302", |
| | | "resource\\image\\vf203\\close_small.png": "7d6cddddc38ce8d4950789169213add4", |
| | | "resource\\image\\vf203\\cloudCert.png": "4481cfb9c2d1f44f0a0dd0489cb6fc2b", |
| | | "resource\\image\\vf203\\commMgmt.png": "5cd157e1b8c82fdf9ddba1f6d5047b9b", |
| | | "resource\\image\\vf203\\config.png": "feeed86aa53ad897dc851845f75ffc3e", |
| | | "resource\\image\\vf203\\config_btn.png": "537ce58e033cdc5c42c85c431f7a16ff", |
| | | "resource\\image\\vf203\\delete.png": "014bad6d9a94a133c58ef350e198101e", |
| | | "resource\\image\\vf203\\delete_fill.png": "947fc08278354a1151d5599382c2c5f3", |
| | | "resource\\image\\vf203\\developer.png": "07c619643647945294449fdfed486218", |
| | | "resource\\image\\vf203\\deviceInfo.png": "3e40246e01c1f7eede4d76fcbba33825", |
| | | "resource\\image\\vf203\\devInfo.png": "1a80aba6780a45f8775bdfdcff4df23a", |
| | | "resource\\image\\vf203\\doorControl.png": "68993ef92bb8c6b2d0dab2c75cc7533d", |
| | | "resource\\image\\vf203\\down.png": "c4d5c1883db4694ccedb7c1140d89da9", |
| | | "resource\\image\\vf203\\empty.png": "91882cb65ac01e63f52e63a7e8a35cbb", |
| | | "resource\\image\\vf203\\enter.png": "787e076256c8a47e07f2091a57585fb5", |
| | | "resource\\image\\vf203\\enter_b.png": "02cb6c84fec128a639e3cf0828a6ee5f", |
| | | "resource\\image\\vf203\\ethernet.png": "f3abb111d96a11a56f7ed77b21abab4c", |
| | | "resource\\image\\vf203\\ethernet_dark.png": "10656303a6d22e204014f55ed0fb3efb", |
| | | "resource\\image\\vf203\\eth_disable.png": "7017f5cc2c9b4f802f082f6c0f5bb581", |
| | | "resource\\image\\vf203\\eth_enable.png": "84d1334e524ac669c3b79e8a69b41eb1", |
| | | "resource\\image\\vf203\\eye-fill.png": "9ae71914bd47423be04d0a22eb4f3995", |
| | | "resource\\image\\vf203\\eye-off.png": "295c3e8255ced50cf2667ecda524e11e", |
| | | "resource\\image\\vf203\\eye_fill.png": "d0ac0d07f13e02e5fae7a12a0858ec49", |
| | | "resource\\image\\vf203\\eye_fill_show.png": "265cf669797b94a138982c01c29d0bd9", |
| | | "resource\\image\\vf203\\face.png": "4a3cab29dab637adc68625d143fe976d", |
| | | "resource\\image\\vf203\\faceAdd.png": "573d86de2713d8ae420bc0a20ba859a4", |
| | | "resource\\image\\vf203\\faceEmpty.png": "9ef3bd1d776183e203e69d5c91e4b129", |
| | | "resource\\image\\vf203\\faceError.png": "972e08c5d3d83a85f14d5ccd3907569a", |
| | | "resource\\image\\vf203\\faceRec.png": "f1bfcb61f4642c6c1bbc04856fb57905", |
| | | "resource\\image\\vf203\\faceRec2.png": "cdadd31ad335195cbb67e05e698f3b31", |
| | | "resource\\image\\vf203\\factoryTest.png": "4bdb36420046870efcabd4a040e31913", |
| | | "resource\\image\\vf203\\failBg.png": "b448125e6a812a5dea92f873e5157407", |
| | | "resource\\image\\vf203\\grey_btn.png": "b0ca6e44c0e01a17d0bdda5f7e057cc2", |
| | | "resource\\image\\vf203\\help.png": "7d75da0510ca74870858a639882dc2ef", |
| | | "resource\\image\\vf203\\idleImage.jpg": "75768189315c907532dda963d31b9ba0", |
| | | "resource\\image\\vf203\\idleImage.png": "4292e1d6db684081b4a94fbb59bd8388", |
| | | "resource\\image\\vf203\\localUser.png": "6429f43f7fee002d66d50a3d92a087da", |
| | | "resource\\image\\vf203\\lock.png": "c1419aa2a9c9da4b7dbf3529a1af37f3", |
| | | "resource\\image\\vf203\\menu_btn.png": "feeed86aa53ad897dc851845f75ffc3e", |
| | | "resource\\image\\vf203\\mini_app.png": "33f0225311e7a4463e9d86c6eab3efdc", |
| | | "resource\\image\\vf203\\mini_background.png": "620bf06dbfffe37f717b91fb3ed8ef40", |
| | | "resource\\image\\vf203\\mini_config.png": "1b2be1c6686f627e86dd49abb0b32a14", |
| | | "resource\\image\\vf203\\mini_password.png": "9a5013cd8f152d388a9b60e6ad2fdc12", |
| | | "resource\\image\\vf203\\mqtt.png": "542ebc6bdbb66ea0f25cf29aeb9d264c", |
| | | "resource\\image\\vf203\\mqtt_dark.png": "d4aab5adc128846c47a3b8bb015c757b", |
| | | "resource\\image\\vf203\\network.png": "0a0119e3d5fce101b28575a4e44aaf7e", |
| | | "resource\\image\\vf203\\networkSetting.png": "3e83d354e8293ed112fe7cc405b94187", |
| | | "resource\\image\\vf203\\network_dark.png": "3c5f8ce5732e95ad613cdd41dc5adbc0", |
| | | "resource\\image\\vf203\\pwd_btn.png": "c05557e93d0b23642cd506d82be8411a", |
| | | "resource\\image\\vf203\\qrcode_small.png": "285bbe7e8f968c8bf4506a563dffcac2", |
| | | "resource\\image\\vf203\\recordQuery.png": "d340255a0c2342382bff6f8c57f6376b", |
| | | "resource\\image\\vf203\\recQuery.png": "1b8c58663a6e61f4f885e784ee4e87d4", |
| | | "resource\\image\\vf203\\rectangle.png": "aad07a3c98dbc044765be57b7a95b2b9", |
| | | "resource\\image\\vf203\\register.png": "7fa975d92007703532ba8011f2a0109f", |
| | | "resource\\image\\vf203\\right.png": "a6f6bc770ad7a8220effcc96e750aaaa", |
| | | "resource\\image\\vf203\\select_arrow.png": "9d82daa1092375abc413d581f36aaf2d", |
| | | "resource\\image\\vf203\\setting.png": "92365fd93f2cfa63c7901ce3d8900a42", |
| | | "resource\\image\\vf203\\setting32.png": "e531bf8a9ce7f6cf93a8ea9baf95377c", |
| | | "resource\\image\\vf203\\space.png": "de9816e31308bd7ce187fe03ab634a37", |
| | | "resource\\image\\vf203\\successBg.png": "dcdf9bc63a89fff478bdf6a2ded56d8d", |
| | | "resource\\image\\vf203\\success_fill.png": "09166b0cd4da44b76b4f6cdc2c550103", |
| | | "resource\\image\\vf203\\sysSettings.png": "2607627249cd1c60619918793b3dd04f", |
| | | "resource\\image\\vf203\\systemSetting.png": "9aee20d073df321250a5bbc57d16d5f1", |
| | | "resource\\image\\vf203\\sys_info.png": "20dc23c019d07cd2c3ce32a160b7b63f", |
| | | "resource\\image\\vf203\\trackFace.png": "5b60294444dab3fec931a2bf80bd1ebc", |
| | | "resource\\image\\vf203\\unlock.png": "7b97b659c36d3ba4f435f44792b90a80", |
| | | "resource\\image\\vf203\\user.png": "6429f43f7fee002d66d50a3d92a087da", |
| | | "resource\\image\\vf203\\userGuide.png": "567e69e478c9470881f45bafbeb5e8de", |
| | | "resource\\image\\vf203\\userMgmt.png": "5dad96f344513f970c2b582d7feb537d", |
| | | "resource\\image\\vf203\\vip.png": "0e816b4860ee87ed1169154e3f0fc524", |
| | | "resource\\image\\vf203\\voiceBroadcast.png": "e6f1a31ba7159962d18b77deef71c106", |
| | | "resource\\image\\vf203\\wechat.png": "55eac1cc3b6398113293b7025e25c450", |
| | | "resource\\image\\vf203\\wifi.png": "fd668b648ac984ed92fad8e40e151283", |
| | | "resource\\image\\vf203\\wifi_dark.png": "37505f892ac6a43cb8dc5ea685de9740", |
| | | "resource\\image\\view_f.png": "4fbdda957ef2966bc4938990725d0246", |
| | | "resource\\image\\view_s.png": "93ddad11d282c5a8f56233682290b38c", |
| | | "resource\\image\\vip.png": "0e816b4860ee87ed1169154e3f0fc524", |
| | | "resource\\image\\voiceBroadcast.png": "e6f1a31ba7159962d18b77deef71c106", |
| | | "resource\\image\\wifi.png": "fd668b648ac984ed92fad8e40e151283", |
| | | "resource\\image\\wifi_dark.png": "37505f892ac6a43cb8dc5ea685de9740", |
| | | "resource\\langPack.js": "956b0d902f723e4817319436ee7df117", |
| | | "resource\\wav\\alarm.wav": "fe9d43cfb930f873973cc31fd6e8c132", |
| | | "resource\\wav\\AR\\calibration_1s.wav": "a5ed7bdf10f5c0bec1f964cbaf8d7c59", |
| | | "resource\\wav\\AR\\calibration_2s.wav": "1a533e06dd209b7b87d48947357a0ca0", |
| | | "resource\\wav\\AR\\calibration_s.wav": "40ecad9f2eba8373c6d9060e0e04e2ed", |
| | | "resource\\wav\\AR\\fingerF.wav": "1a8dabdb7bd80af25331217c5cb2a2f5", |
| | | "resource\\wav\\AR\\fingerInput1.wav": "a66c8d4329462cf4d69f386f9c9f9739", |
| | | "resource\\wav\\AR\\fingerInput2.wav": "2ee652221b5f1d1537b76347615d02b4", |
| | | "resource\\wav\\AR\\fingerInput3.wav": "e68e282f25963ae83451c19fe4075958", |
| | | "resource\\wav\\AR\\fingerR.wav": "564096e2700986fb5d284b550dc1849e", |
| | | "resource\\wav\\AR\\fingerS.wav": "d39c8e14ec9518a8f29df1934b4a87b8", |
| | | "resource\\wav\\AR\\fingerT.wav": "e741678c6bc7cb4a475ce16dafef4ffe", |
| | | "resource\\wav\\AR\\read.wav": "3a053015f4a30814b33dc900d7f48f33", |
| | | "resource\\wav\\AR\\recg_f.wav": "21dfe28f19a6be1c2a93f89f67d764f1", |
| | | "resource\\wav\\AR\\recg_s.wav": "44759af10d2fba0fef6675c029bfb15e", |
| | | "resource\\wav\\AR\\recognition.wav": "10b7198c357752c2f71093ece81def67", |
| | | "resource\\wav\\AR\\recognition_s.wav": "4ef357ffe8d6ead5dde8e1a1b46f174d", |
| | | "resource\\wav\\AR\\register.wav": "7a52494f55ef4ac161e24b35653bfa63", |
| | | "resource\\wav\\AR\\stranger.wav": "f5e4baa2f88c81ab03783631f64798b7", |
| | | "resource\\wav\\AR\\verify.wav": "7c8d730412feda278f5255ea2d504f41", |
| | | "resource\\wav\\AR\\verify_f.wav": "8a75cb02a71a12c27db4aeeae26ea6fa", |
| | | "resource\\wav\\AR\\verify_s.wav": "cb9c12b27047bcdcb7ac89c37a71ad9d", |
| | | "resource\\wav\\CN\\calibration_1s.wav": "95be0f4e70b3e3ed788933a6adaac48c", |
| | | "resource\\wav\\CN\\calibration_2s.wav": "dbd379708c7b4ee310ff8e5629c11e18", |
| | | "resource\\wav\\CN\\calibration_s.wav": "41fd2b04f2320aec19139c70e321795f", |
| | | "resource\\wav\\CN\\fingerF.wav": "932ad149b0290538c49f8208961e7bdb", |
| | | "resource\\wav\\CN\\fingerInput1.wav": "4bcae26fdfef53f4f9a2c0223deb56ae", |
| | | "resource\\wav\\CN\\fingerInput2.wav": "c0251f592f4c2570d1b760bde6c34b2a", |
| | | "resource\\wav\\CN\\fingerInput3.wav": "88f54eca8add2ef122583fed9df4bab0", |
| | | "resource\\wav\\CN\\fingerR.wav": "d597f3f0f968b868a896917354373922", |
| | | "resource\\wav\\CN\\fingerS.wav": "4163dbe6607e35f1d12061c5edf4f9f4", |
| | | "resource\\wav\\CN\\fingerT.wav": "428bea9dd8508f9321276eaeaa80a2ca", |
| | | "resource\\wav\\CN\\read.wav": "d0e959a98c294882ac5ddd63762b32d9", |
| | | "resource\\wav\\CN\\recg_f.wav": "9ec07057fa7deb60859ef1937f515df2", |
| | | "resource\\wav\\CN\\recg_s.wav": "c0b3486c9eb370d259a5d1b188b9d481", |
| | | "resource\\wav\\CN\\recognition.wav": "1adb5d50dd1f61d4e2e15ee859f1a838", |
| | | "resource\\wav\\CN\\recognition_s.wav": "16ea2454fa95d57c5bad0bdb6fcd5386", |
| | | "resource\\wav\\CN\\register.wav": "a811322b30389c915b3461f214958389", |
| | | "resource\\wav\\CN\\stranger.wav": "3961f3192cbbd85c356037610726d9cb", |
| | | "resource\\wav\\CN\\verify.wav": "36202c8c9f111fea718b536526098d4c", |
| | | "resource\\wav\\CN\\verify_f.wav": "f0429d7fb4a04c4c797a8b7bcbe45577", |
| | | "resource\\wav\\CN\\verify_s.wav": "cabb8f2b1cb7be25a18222e7b108f208", |
| | | "resource\\wav\\DE\\calibration_1s.wav": "52e28bd12e4376a0de8f2f8dfeeb3f8a", |
| | | "resource\\wav\\DE\\calibration_2s.wav": "121458873a5ea7999e6e859ca705a90e", |
| | | "resource\\wav\\DE\\calibration_s.wav": "5fa56f1ac0df95c5fa21d3c97283dee2", |
| | | "resource\\wav\\DE\\fingerF.wav": "c7fdcf59eaf7e2eb1f7e0983c604a7af", |
| | | "resource\\wav\\DE\\fingerInput1.wav": "9519473165bf28c615f9b68bb4613909", |
| | | "resource\\wav\\DE\\fingerInput2.wav": "b127650142eed76f25df1b2802803b47", |
| | | "resource\\wav\\DE\\fingerInput3.wav": "318e963b18d9d69e7de60e87536d7544", |
| | | "resource\\wav\\DE\\fingerR.wav": "238541066f5a5e269ec3bdfeae70ca18", |
| | | "resource\\wav\\DE\\fingerS.wav": "a616ec675a53124438592cdcaaf6bb9d", |
| | | "resource\\wav\\DE\\fingerT.wav": "9717d2422c6233b901fecba0f3b6f219", |
| | | "resource\\wav\\DE\\read.wav": "411c8189b9317faf448d1ff74e5c8029", |
| | | "resource\\wav\\DE\\recg_f.wav": "6055910c9079ddcd6ce9b94940729bcb", |
| | | "resource\\wav\\DE\\recg_s.wav": "15b60814216d9786606dec148a683227", |
| | | "resource\\wav\\DE\\recognition.wav": "0ef18cb9387fbd7ad2a2a17e4c39a4c6", |
| | | "resource\\wav\\DE\\recognition_s.wav": "d604c7898d99292bc0880611ea790876", |
| | | "resource\\wav\\DE\\register.wav": "dd310e24cfb6de7396f4c5ac1f97e9a0", |
| | | "resource\\wav\\DE\\stranger.wav": "bee4570c4eab0604302469a0b458f6ee", |
| | | "resource\\wav\\DE\\verify.wav": "345845ebd135af196e50c476eaeed831", |
| | | "resource\\wav\\DE\\verify_f.wav": "6a565e48d9369dd20ca2a29d548a4ade", |
| | | "resource\\wav\\DE\\verify_s.wav": "8ac44273c3c639b2f0a9abb14599664a", |
| | | "resource\\wav\\EN\\calibration_1s.wav": "921ee406cb5069069ba3e03d9d9b948d", |
| | | "resource\\wav\\EN\\calibration_2s.wav": "06d4447bacec83ae524d544e64b269a6", |
| | | "resource\\wav\\EN\\calibration_s.wav": "c0dcf35be40779f8925e332b3b8efc85", |
| | | "resource\\wav\\EN\\fingerF.wav": "510d14814a14e2cd331d0065423f5785", |
| | | "resource\\wav\\EN\\fingerInput1.wav": "5c41614ad862b0b4b5d4719d2031521f", |
| | | "resource\\wav\\EN\\fingerInput2.wav": "ea037a1332343280f87cfc66536a20ee", |
| | | "resource\\wav\\EN\\fingerInput3.wav": "058ab61627bc6886346d0e8de043525a", |
| | | "resource\\wav\\EN\\fingerR.wav": "11fe3281d28422191402630ea9d654f8", |
| | | "resource\\wav\\EN\\fingerS.wav": "16398aadc67ff3977262c15f83c16612", |
| | | "resource\\wav\\EN\\fingerT.wav": "72cd4670c8d86c1cab5d03706e98bd49", |
| | | "resource\\wav\\EN\\read.wav": "8d29d22febaf903ff3177f6844def6bf", |
| | | "resource\\wav\\EN\\recg_f.wav": "01ba9b3bb6216c28da18dd61e0f9488e", |
| | | "resource\\wav\\EN\\recg_s.wav": "bb83312e643dfc896395f0d64dd71c68", |
| | | "resource\\wav\\EN\\recognition.wav": "9e2d1c15eb5eb95f55864a2ddd9af4f6", |
| | | "resource\\wav\\EN\\recognition_s.wav": "6edb8d0669ba7d82bf6e14c0490cfdd3", |
| | | "resource\\wav\\EN\\register.wav": "4534ee5193306a8f75be48fdd9a42edc", |
| | | "resource\\wav\\EN\\stranger.wav": "0e902f86cb3fe443eac4b756b4c1b1c5", |
| | | "resource\\wav\\EN\\verify.wav": "e7f04238d896a0c7c2a3de8aad65beeb", |
| | | "resource\\wav\\EN\\verify_f.wav": "abf0d48629397aba9a97109f9fedd087", |
| | | "resource\\wav\\EN\\verify_s.wav": "935e88563857e8cade71bf558256842e", |
| | | "resource\\wav\\ES\\calibration_1s.wav": "7bdabdb4dbee796cc2bb7aa9b071c859", |
| | | "resource\\wav\\ES\\calibration_2s.wav": "c4262a41b7272816e49080d3616645ec", |
| | | "resource\\wav\\ES\\calibration_s.wav": "0ed429d1bcedf413d77ba5b7770068cc", |
| | | "resource\\wav\\ES\\fingerF.wav": "c4c938fea144e8def6798b1e487b7182", |
| | | "resource\\wav\\ES\\fingerInput1.wav": "7c7f92d28442dd9d3d7161ab06da56a5", |
| | | "resource\\wav\\ES\\fingerInput2.wav": "deef2ff30eddeefe95865db356e272ce", |
| | | "resource\\wav\\ES\\fingerInput3.wav": "7c7f92d28442dd9d3d7161ab06da56a5", |
| | | "resource\\wav\\ES\\fingerR.wav": "5d7bb888025f715db6683df774d3b6f9", |
| | | "resource\\wav\\ES\\fingerS.wav": "92ed0560df2d4ea38919241501011ef8", |
| | | "resource\\wav\\ES\\fingerT.wav": "d2f50e99b38d142dec28f6efc5989ed3", |
| | | "resource\\wav\\ES\\read.wav": "6c0f153f8a95fc9053f25d8cff92ea2a", |
| | | "resource\\wav\\ES\\recg_f.wav": "99536dea254832007f9b66461be00fc5", |
| | | "resource\\wav\\ES\\recg_s.wav": "3b7fe279b7d99b8f15cb8b4e12d5e06f", |
| | | "resource\\wav\\ES\\recognition.wav": "97e6ba9a65302ebed0561bed4ac7d0e1", |
| | | "resource\\wav\\ES\\recognition_s.wav": "879a7e5721996f7c49deb0f479fcec79", |
| | | "resource\\wav\\ES\\register.wav": "9e8e5c169b4417e0f070667cf6d6fd47", |
| | | "resource\\wav\\ES\\stranger.wav": "d26faf4f830cc418cdb4bcd2344c9763", |
| | | "resource\\wav\\ES\\verify.wav": "a5c501f02b699d7681537d33f913f007", |
| | | "resource\\wav\\ES\\verify_f.wav": "deef2ff30eddeefe95865db356e272ce", |
| | | "resource\\wav\\ES\\verify_s.wav": "c7d2f541fe970aec1515607ee1d71c05", |
| | | "resource\\wav\\FR\\calibration_1s.wav": "90bc4bcc25cd05d00e01bc33bc25e044", |
| | | "resource\\wav\\FR\\calibration_2s.wav": "822c2d270484e7330dcb3da58ab52479", |
| | | "resource\\wav\\FR\\calibration_s.wav": "569513acc17ea14570c33144d02d88fa", |
| | | "resource\\wav\\FR\\fingerF.wav": "2bbbf80c5343687aebfaa838bc38c381", |
| | | "resource\\wav\\FR\\fingerInput1.wav": "18db34e42be799d8ef63ecd4ee880434", |
| | | "resource\\wav\\FR\\fingerInput2.wav": "91ee1f94fdedf6797865f070346f6778", |
| | | "resource\\wav\\FR\\fingerInput3.wav": "8e2e87765ae0389566d4319a22a4826d", |
| | | "resource\\wav\\FR\\fingerR.wav": "1ecfd9d1c72a4eae2644306e0bd25aff", |
| | | "resource\\wav\\FR\\fingerS.wav": "da70743ef141747fedde637c70ce93ec", |
| | | "resource\\wav\\FR\\fingerT.wav": "4e01419987fa49b88a79a36aec7ec312", |
| | | "resource\\wav\\FR\\read.wav": "77eb8c0ffe8b1e278bdb59f5f22c386f", |
| | | "resource\\wav\\FR\\recg_f.wav": "a4e0c3cf167fa4db3e5eacf08ab0e287", |
| | | "resource\\wav\\FR\\recg_s.wav": "56a17208c5af5f9cd82d0c4762c12c54", |
| | | "resource\\wav\\FR\\recognition.wav": "d7961442cd6d0a233227be08df97014c", |
| | | "resource\\wav\\FR\\recognition_s.wav": "6f41689362369dd66a5d91dae1df11a9", |
| | | "resource\\wav\\FR\\register.wav": "64a3b9782abffd3264e0a42a59aed4c2", |
| | | "resource\\wav\\FR\\stranger.wav": "c5bdaee5595fd3f2fb7b43b64854965c", |
| | | "resource\\wav\\FR\\verify.wav": "98f91f55b0e363a4ff5147a38ec7a142", |
| | | "resource\\wav\\FR\\verify_f.wav": "2dd839c1fce3797a94488fd04b0a6b6d", |
| | | "resource\\wav\\FR\\verify_s.wav": "670eac29b52aa9648c04ec00a4bdc53a", |
| | | "resource\\wav\\KO\\.DS_Store": "194577a7e20bdcc7afbb718f502c134c", |
| | | "resource\\wav\\KO\\calibration_1s.wav": "7402d18dab54f254b7fc632fa39fd975", |
| | | "resource\\wav\\KO\\calibration_2s.wav": "ea767fb11a3ea7c5e4979645ea1b290f", |
| | | "resource\\wav\\KO\\calibration_s.wav": "376e3a44b29864d1ced354796e1780d2", |
| | | "resource\\wav\\KO\\fingerF.wav": "d22570bfe2b6f7da61db3814347da015", |
| | | "resource\\wav\\KO\\fingerInput1.wav": "a0f3beaaf7da75825ebf96e3e63ff6a2", |
| | | "resource\\wav\\KO\\fingerInput2.wav": "0e1f0069f6bea232d0b808bf68220a5f", |
| | | "resource\\wav\\KO\\fingerInput3.wav": "af87f04def1fbe6fa2202a1c476ac38a", |
| | | "resource\\wav\\KO\\fingerR.wav": "a2270f58b171bc065bd26a43df22ab19", |
| | | "resource\\wav\\KO\\fingerS.wav": "4351453d76fd352be3771a425d13bbb8", |
| | | "resource\\wav\\KO\\fingerT.wav": "6ebeba178719d5e0f50d3b09f047f383", |
| | | "resource\\wav\\KO\\read.wav": "b6bc10805b392d0310a79eea741e3b3f", |
| | | "resource\\wav\\KO\\recg_f.wav": "681345dd730860770e22689191f1d96a", |
| | | "resource\\wav\\KO\\recg_s.wav": "88b56cc7c059666edbdb0ce81b8c3c04", |
| | | "resource\\wav\\KO\\recognition.wav": "9454b2d82ad2d3513dafb355edc025f2", |
| | | "resource\\wav\\KO\\recognition_s.wav": "9398a4b31d5d2d1e3b10f04620a30dae", |
| | | "resource\\wav\\KO\\register.wav": "58cb13509719da302a3d431a59a68f5c", |
| | | "resource\\wav\\KO\\stranger.wav": "523d5eae87864b41350bf39829c53e76", |
| | | "resource\\wav\\KO\\verify.wav": "68c67283487bed689fb7d8567d5485e3", |
| | | "resource\\wav\\KO\\verify_f.wav": "e3de3c0fa0cfe2484e4b38c8269920cc", |
| | | "resource\\wav\\KO\\verify_s.wav": "8f6c8a4ecebd44941260a08ad3a4dd72", |
| | | "resource\\wav\\PT\\calibration_1s.wav": "da58062f0e45ebd7bbecb126b2d453ce", |
| | | "resource\\wav\\PT\\calibration_2s.wav": "5a92af498230aa4ba882fee5857cc73f", |
| | | "resource\\wav\\PT\\calibration_s.wav": "b926e31a78516b46d1dcf7a1f62c6cf8", |
| | | "resource\\wav\\PT\\fingerF.wav": "9d6f7c11fd9393547cb1feb72b8f06a7", |
| | | "resource\\wav\\PT\\fingerInput1.wav": "b2d2e38d58c4b86f4b2537647aabe446", |
| | | "resource\\wav\\PT\\fingerInput2.wav": "75f1d97cd779f2cb890efda812254dd3", |
| | | "resource\\wav\\PT\\fingerInput3.wav": "d446e2f562b509d806f1b8862d1d9b55", |
| | | "resource\\wav\\PT\\fingerR.wav": "f1786c3dc3a0683aeef6d26062f12ed1", |
| | | "resource\\wav\\PT\\fingerS.wav": "6c6ad480079a51836c06cbcad0306289", |
| | | "resource\\wav\\PT\\fingerT.wav": "15b6fc875a46ef3a81facda5b225510a", |
| | | "resource\\wav\\PT\\read.wav": "dd63196f7cb81caf949d1c46db597e9e", |
| | | "resource\\wav\\PT\\recg_f.wav": "92746b018b29bcfd7cb2caf841d32025", |
| | | "resource\\wav\\PT\\recg_s.wav": "0244bd357d573aabae6e3143e4093b52", |
| | | "resource\\wav\\PT\\recognition.wav": "02887b41858dd3ad6872ef666cda6b21", |
| | | "resource\\wav\\PT\\recognition_s.wav": "de2f118f324fb6754442233cc7bd9163", |
| | | "resource\\wav\\PT\\register.wav": "a821a9a578db5bc0a21c9d508f05154a", |
| | | "resource\\wav\\PT\\stranger.wav": "0d94a14857ddbbb9ec2f49da4308ce3e", |
| | | "resource\\wav\\PT\\verify.wav": "5d30cc1dfb9f198e3e35b969728e3370", |
| | | "resource\\wav\\PT\\verify_f.wav": "eb745523f398a46a6bb6e7bd61ae0fbb", |
| | | "resource\\wav\\PT\\verify_s.wav": "cce663087a3a629b6e57f1e70f8d7965", |
| | | "resource\\wav\\RU\\calibration_1s.wav": "345845ebd135af196e50c476eaeed831", |
| | | "resource\\wav\\RU\\calibration_2s.wav": "70e991ab0ac7b41f3307beda62326154", |
| | | "resource\\wav\\RU\\calibration_s.wav": "00b75e1fcffec26c49b5b7c7a24f4c43", |
| | | "resource\\wav\\RU\\fingerF.wav": "0b73f3a06b522b76ec6ef7ee76395813", |
| | | "resource\\wav\\RU\\fingerInput1.wav": "077b12f4ddabc15ecfad1e5d8802414b", |
| | | "resource\\wav\\RU\\fingerInput2.wav": "1da2108ea08bbc05af7a785ef58fd664", |
| | | "resource\\wav\\RU\\fingerInput3.wav": "7ba5db75cb9542f03eda5095d7a23572", |
| | | "resource\\wav\\RU\\fingerR.wav": "9758966564082624bce1d39433ed3f7a", |
| | | "resource\\wav\\RU\\fingerS.wav": "f1146d690c62e8a8b890fe88f443f082", |
| | | "resource\\wav\\RU\\fingerT.wav": "1a61470775f82c3d11868d260fe89a24", |
| | | "resource\\wav\\RU\\read.wav": "73f492713c7b86645be69f31d1a20ed3", |
| | | "resource\\wav\\RU\\recg_f.wav": "1e16e083ba2b7ed7bd21939c7999346a", |
| | | "resource\\wav\\RU\\recg_s.wav": "7f279071d927beb26abe377ac82a8287", |
| | | "resource\\wav\\RU\\recognition.wav": "8ad03ac16ae29e541aa75a8c73fe89c3", |
| | | "resource\\wav\\RU\\recognition_s.wav": "f7ea28dab9f7b655cb12e82611432619", |
| | | "resource\\wav\\RU\\register.wav": "61ad2813fd80f3e96f919df598660260", |
| | | "resource\\wav\\RU\\stranger.wav": "b2cc134c9efa67d19b614fa79a1f9d08", |
| | | "resource\\wav\\RU\\verify.wav": "7065f2418c31d521d57ca1a257227036", |
| | | "resource\\wav\\RU\\verify_f.wav": "1da2108ea08bbc05af7a785ef58fd664", |
| | | "resource\\wav\\RU\\verify_s.wav": "5f327d4e695ffec7c3d372a35b7c2c6d", |
| | | "resource\\wav\\success.wav": "1e9b06bd363e891ad7ed19c74edcd2ce", |
| | | "resource\\wav\\tamper.wav": "5be9a5cebd6bb26b6b3020b461600fde", |
| | | "resource\\web\\config.js": "3d7861b269daebe064e3173ad305ae23", |
| | | "resource\\web\\css\\app.7043d6da.css": "999a87106e2755763dd81279b6025992", |
| | | "resource\\web\\css\\chunk-vendors.6b92dc4c.css": "e1ec7b3d258707dfa59963f29e6f8e75", |
| | | "resource\\web\\favicon.ico": "1ba2ae710d927f13d483fd5d1e548c9b", |
| | | "resource\\web\\fonts\\element-icons.535877f5.woff": "535877f50039c0cb49a6196a5b7517cd", |
| | | "resource\\web\\fonts\\element-icons.732389de.ttf": "732389ded34cb9c52dd88271f1345af9", |
| | | "resource\\web\\img\\bg.a32161db.png": "a32161dbd9d76983f1abc8e6de118629", |
| | | "resource\\web\\img\\iconfont.675b1cb4.svg": "675b1cb40e0ad004e651cbf410d8c9b9", |
| | | "resource\\web\\index.css": "00f3e0e219f286a00a28b72e0f398238", |
| | | "resource\\web\\index.html": "1edc8246781c3c3bc7f200446d94817c", |
| | | "resource\\web\\js\\app.da6752e9.js": "fce7a868ce64badaf7742f7cfe6bd6b8", |
| | | "resource\\web\\js\\app.da6752e9.js.map": "10ba9093ac4c8ad8f829906bf188230c", |
| | | "resource\\web\\js\\chunk-vendors.303b1624.js": "3f495d9202748c1e070016b1af602295", |
| | | "resource\\web\\js\\chunk-vendors.303b1624.js.map": "1b58852183ab5b6ba073c10171483108", |
| | | "src\\common\\consts\\configConst.js": "54c90a4a5470745f5505b6b283ab8746", |
| | | "src\\common\\utils\\codeUtils.js": "749f60e6b75b7dfa7be62b4ed9c873b5", |
| | | "src\\common\\utils\\netUtils.js": "34da771eb84bbb2d0f7085a1af85d132", |
| | | "src\\common\\utils\\stringUtils.js": "425d9cd0390ab8a60f1507544c2cb00a", |
| | | "src\\common\\utils\\tokenUtil.js": "b7abd3698644aadb7d3e936fb6f7fc8b", |
| | | "src\\common\\utils\\utils.js": "bbee074a060e962a570dddc4d586504d", |
| | | "src\\config.json": "6619f6367ac0230030de3131160a2178", |
| | | "src\\controller.js": "3ca7b098eaf218df5e911fea64113d11", |
| | | "src\\driver.js": "94ef548d913eb6ba832e87e1748f2bc2", |
| | | "src\\main.js": "e5958b02098ba5d92c159970c2e9bd63", |
| | | "src\\screen.js": "b8a256f4f3ba51b4c1e49fcb69e06b28", |
| | | "src\\service\\accessService.js": "304718a9a06ded28947373c3d9a21295", |
| | | "src\\service\\api.js": "def5b52441ccc827913a73478cc7c32a", |
| | | "src\\service\\codeService.js": "e3f53b983c37a91d85a3de95fab7745d", |
| | | "src\\service\\configService.js": "d1c3c533c1d451c2eaf46758b4efeb19", |
| | | "src\\service\\faceService.js": "cfc3cf7d510f2ba6d6fcedb1251e0795", |
| | | "src\\service\\fingerService.js": "0fee47e46ded411c2da21eb508d8f9ba", |
| | | "src\\service\\gpiokeyService.js": "7aeb81b1577df935f147f3817a0a144b", |
| | | "src\\service\\grainService.js": "3ec28482d55059fd09d091145fad041c", |
| | | "src\\service\\httpService.js": "567d6f52d5392e3d95a54264e631944e", |
| | | "src\\service\\mqttService.js": "eafd4b82b1d5a7d02b32d046bf492ac9", |
| | | "src\\service\\nfcService.js": "fff19d7f08d3a499455ed93a5376c0fd", |
| | | "src\\service\\sqliteService.js": "9dd93a7afd36b50e6be015e950aaff83", |
| | | "src\\service\\uartBleService.js": "f8816894598283c7114b4d8708bb65aa", |
| | | "src\\service\\uartCodeService.js": "ed1952645c055885c78bc6c02699906f", |
| | | "src\\service\\weComService.js": "14896c15403107f7225fce6db9b8a049", |
| | | "src\\services.js": "426d898a09de0fcc61d6fc644052b51e", |
| | | "src\\view\\appView.js": "6bab5f16cbafe492d277948b144529ba", |
| | | "src\\view\\config\\configView.js": "9f89bd5efb5060c2dea799e684c8a460", |
| | | "src\\view\\config\\identityVerificationView.js": "6f4eece1b8021b0beb7ff9ac4315efff", |
| | | "src\\view\\config\\menu\\cloudCertView.js": "089fda3f32cc72c07ffc1f76fa98ac06", |
| | | "src\\view\\config\\menu\\developer\\capcalView.js": "eb3a2b6b8f4546b71471ae06fbf32741", |
| | | "src\\view\\config\\menu\\developerView.js": "a6ae2941432970908f887bd20807f1ff", |
| | | "src\\view\\config\\menu\\deviceInfo\\dataCapacityInfoView.js": "81fbf258e0ba70c126f850658981469e", |
| | | "src\\view\\config\\menu\\deviceInfo\\systemInfoView.js": "95a96c6d8586410be1fe085dfa61db9f", |
| | | "src\\view\\config\\menu\\deviceInfoView.js": "b703a2f9053c1b089294b3dffdf6a449", |
| | | "src\\view\\config\\menu\\doorControlView.js": "2b29eff26537ab92171a40110b8e8c0e", |
| | | "src\\view\\config\\menu\\helpView.js": "b3cf2078efe3a274740276b550b68b63", |
| | | "src\\view\\config\\menu\\localUser\\faceEnterView.js": "f6dc4e020a4eddba902820d4b2444ee3", |
| | | "src\\view\\config\\menu\\localUser\\fingerApplyView.js": "b2b5a46109f7ac768ae6d18131a33fbe", |
| | | "src\\view\\config\\menu\\localUser\\fingerEnterView.js": "46dd45fe0e8d06410a5f2bcbeb7be5ad", |
| | | "src\\view\\config\\menu\\localUser\\localUserAddView.js": "8266626bf9cadde968e2b439ef9073b0", |
| | | "src\\view\\config\\menu\\localUserView.js": "f7881e4a47fe06648d0934f286d59775", |
| | | "src\\view\\config\\menu\\networkSettingView.js": "7cb7b7ef6c1d49f819f509de43e49a56", |
| | | "src\\view\\config\\menu\\recordQuery\\recordQueryDetailView.js": "79e15d726de5146bab15a3dba533a82b", |
| | | "src\\view\\config\\menu\\recordQueryView.js": "f640c2f2d560213c44633d7ea36c6960", |
| | | "src\\view\\config\\menu\\systemSetting\\displaySettingView.js": "1a376eaccd07b12bd80773be83e080fc", |
| | | "src\\view\\config\\menu\\systemSetting\\faceRecognitionSettingView.js": "8ac866907bd817d51cde8d757e33b852", |
| | | "src\\view\\config\\menu\\systemSetting\\passLogSettingView.js": "b3fb57b54b5079075c331aceab74a052", |
| | | "src\\view\\config\\menu\\systemSetting\\passwordManagementView.js": "720e32768be124d5591cc0914c9ba340", |
| | | "src\\view\\config\\menu\\systemSetting\\passwordOpenDoorSettingView.js": "a56728c84d37129fbae06c3a23b01092", |
| | | "src\\view\\config\\menu\\systemSetting\\swipeCardRecognitionSettingView.js": "d23ab8015ac4dc7f316fc7ca4b852f6f", |
| | | "src\\view\\config\\menu\\systemSetting\\timeSettingView.js": "7c5744868ad7e40b3d9ce0708e3f7b85", |
| | | "src\\view\\config\\menu\\systemSettingView.js": "91aa4b58c5da0ba01e7a56ee348fee11", |
| | | "src\\view\\config\\menu\\voiceBroadcastView.js": "b985213b271e8e8019d3a5697f2a402c", |
| | | "src\\view\\config\\newPwdView.js": "9313a7399dcab5eff76b26dad4dbab99", |
| | | "src\\view\\emergencyPwdView.js": "db0fc9252e9e897fce33dbe3314963d0", |
| | | "src\\view\\gasDetailView.js": "e7f705f9b89459726064e51d57ed9d7c", |
| | | "src\\view\\i18n.js": "94f43798d35026189125bf2534d1bffd", |
| | | "src\\view\\idleView.js": "a1a6f9fb0ec44c59330a7461298aec46", |
| | | "src\\view\\mainView.js": "0c49e5905a87a5cfd33062df8531e421", |
| | | "src\\view\\pinyin\\dict.js": "a7812c30b956099fd248271ad6fd5ac9", |
| | | "src\\view\\pinyin\\pinyin.js": "84e7c2ac116f5c22cf07b563ba230c68", |
| | | "src\\view\\pwdView.js": "e46813353af5b4cd9f9b776328aa1987", |
| | | "src\\view\\topView.js": "de69270ae02a9893902b453f184eb070", |
| | | "src\\view\\viewUtils.js": "3d99a33880bd45247740e528f3bc8610", |
| | | "src\\view\\wechatBindView.js": "6d0239d71de3c1cf4c2e0817cd65ce3f", |
| | | "src\\view\\wechatFaceView.js": "65f5edfbe0ef402c66bd62bd3eebec49", |
| | | "src\\view\\wechatNetView.js": "84d8dd397ed6483a25ab99174e652362", |
| | | "src\\worker\\mqttWorker.js": "2dda93d129f1edd9f8a52aceddb0079d", |
| | | "src\\worker\\netWorker.js": "e38b00c21c77dc5b98425f12068f85ff", |
| | | "src\\worker\\passRecordWorker.js": "ad27fa58b7de2b8155bb3517e601bef4", |
| | | "src\\worker\\screenWorker.js": "57a6f54f05c57e186e44892c97e36647" |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # vf105_v12_access_new é¨ç¦åºç¨æºç |
| | | |
| | | æ¤ç®å½å
å« `vf105_v12_access_new` é¨ç¦åºç¨ç JavaScript æºç ã |
| | | |
| | | **éè¦è¯´æï¼** |
| | | |
| | | æ¬é¡¹ç®ç JavaScript æºç ä¸ `vf203_v12_access_new` 项ç®ï¼è·¯å¾ï¼`../../vf203_v12/vf203_v12_access_new`ï¼ä½¿ç¨çæ¯å®å
¨ç¸åçä¸å¥æºç ã |
| | | |
| | | 两个项ç®å¯ä¸çå·®å«å¨äºåºå±çåçå
±äº«åºï¼`.so`ï¼æä»¶ãå
·ä½ä½¿ç¨åªä¸ªçæ¬ç `.so` æä»¶ï¼æ¯éè¿ `app.dxproj` é¡¹ç®æä»¶æ¥åºååé
ç½®çã |
| | | |
| | | --- |
| | | |
| | | å½å项ç®å·²ä¿®æ¹æ¨¡ç»æä»¶-dxmodules/dxEventBus.jsï¼ä½¿äºä»¶æ»çº¿æ¯æå¤ä¸ªäºä»¶å¤ç彿°ï¼ |
| | | |
| | | 1. ä¿®æ¹ bus.on 彿° ï¼å°å个äºä»¶å¤ç彿°æ¹ä¸ºåå¨ä¸ºæ°ç»ï¼æ¯æå¤ä¸ªå¤ç彿° |
| | | 2. ä¿®æ¹ bus.fire 彿° ï¼æ§è¡æææ³¨åçäºä»¶å¤ç彿°ï¼èä¸ä»
ä»
æ¯æåä¸ä¸ª |
| | | 3. æ·»å é误å¤ç ï¼ç¡®ä¿ä¸ä¸ªäºä»¶å¤ç彿°åºéæ¶ä¸ä¼å½±åå
¶ä»å¤ç彿°çæ§è¡ |
| | | |
| | | --- |
| | | |
| | | |
| | | æµè¯ç»æï¼ |
| | | |
| | | 1. 第ä¸ç¨æ·æçº¹éªè¯éè¿-ç¨æ·1UIæ´æ°-çå¾
第äºç¨æ·ï¼ |
| | | 2. 第äºç¨æ·äººè¸éªè¯éè¿-ç¨æ·1UIæ´æ°-çå¾
第äºç¨æ·ï¼ |
| | | 3. 第ä¸ç¨æ·æçº¹éªè¯éè¿-ç¨æ·2UIæ´æ°-ç¨æ·1UIæ´æ°ä¸ºç¬¬ä¸ç¨æ·ï¼ |
| | | 4. 䏿®µæ¶é´åæç¤ºå人认è¯è¶
æ¶ |
| | | |
| | | æä»¥å½åæçº¹è®¤è¯å人è¸è®¤è¯æ¯ä¸¤ä¸ªäºä¸ç¸å¹²çè®¤è¯æµç¨ï¼è½å¦ä¼å代ç 使å¾ä¸æ¬¡åäººè®¤è¯æµç¨ä¸æ¯æäººè¸åæçº¹çç»å认è¯ï¼å³æçº¹æçº¹ãäººè¸æçº¹ãæçº¹äººè¸ã人è¸äººè¸ï¼ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | {"name":"vf107_v12_access_","model":"VF105_V12","components":[{"component":"dxAudio","version":"1.0.1"},{"component":"dxBase64","version":"2.0.0"},{"component":"dxCommon","version":"1.0.1"},{"component":"dxConfig","version":"2.0.0"},{"component":"dxCommonUtils","version":"1.0.1"},{"component":"dxCryptoES","version":"2.0.0"},{"component":"dxChannel","version":"1.0.0"},{"component":"dxDisplay","version":"1.0.0"},{"component":"dxDriver","version":"1.1.8"},{"component":"dxEventBus","version":"2.0.2"},{"component":"dxFacial","version":"1.1.0"},{"component":"dxFingerMz","version":"1.0.5"},{"component":"dxFingerZaz","version":"1.0.1"},{"component":"dxGpio","version":"1.0.0"},{"component":"dxGpioKey","version":"1.0.1"},{"component":"dxHttpClient","version":"2.0.3"},{"component":"dxHttpServer","version":"1.0.3"},{"component":"dxLogger","version":"2.0.3"},{"component":"dxMap","version":"2.0.1"},{"component":"dxMqttClient","version":"1.0.1"},{"component":"dxNtp","version":"2.0.2"},{"component":"dxNetwork","version":"1.0.3"},{"component":"dxNfcCard","version":"1.0.1"},{"component":"dxOta","version":"2.0.2"},{"component":"dxOs","version":"1.0.0"},{"component":"dxPwm","version":"2.0.1"},{"component":"dxQrRule","version":"2.0.0"},{"component":"dxStd","version":"2.0.3"},{"component":"dxSqliteDB","version":"1.0.0"},{"component":"dxTimeZones","version":"1.0.0"},{"component":"dxUi","version":"2.0.0"},{"component":"dxUart","version":"1.0.1"},{"component":"dxVgBle","version":"1.0.0"},{"component":"dxWorkerPool","version":"2.0.1"},{"component":"dxWatchdog","version":"1.0.1"}],"ignore":{"folder":".temp,.git","file":"md5s.json,md5snew.json"},"folder":".temp,.git","file":"md5s.json,md5snew.json","version":"2.0.2"} |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # CryptoES |
| | | |
| | | *A cryptography algorithms library compatible with ES6 and TypeScript* |
| | | |
| | | - Inspired by and has the same API with [CryptoJS](https://code.google.com/archive/p/crypto-js/) |
| | | - With types for TypeScript usage |
| | | - Witten in latest ECMAScript Standard |
| | | - Support ES6 module import and partially import |
| | | |
| | | ## Usage |
| | | |
| | | |
| | | Then you can import CryptoES: |
| | | |
| | | ``` |
| | | import CryptoES from '../dxmodules/crypto-es/index.js'; |
| | | const rst = CryptoES.MD5("Message").toString(); |
| | | ``` |
| | | |
| | | Or partially import the function to reduce the package weight: |
| | | |
| | | ``` |
| | | import { MD5 } from 'crypto-es/lib/md5.js'; |
| | | const rst = MD5("Message").toString(); |
| | | ``` |
| | | |
| | | ## TypeScript Usage |
| | | |
| | | Every file in this library has its own .d.ts file now, so it is available to partially import single algorithm files in TypeScript projects. |
| | | |
| | | ## Guide |
| | | |
| | | > Just the same as [CryptoJS](https://code.google.com/archive/p/crypto-js/) |
| | | |
| | | --- |
| | | |
| | | - [Hashers](###Hashers) |
| | | - [HMAC](#HMAC) |
| | | - [Ciphers](#Ciphers) |
| | | - [Encoders](#Encoders) |
| | | - [ArrayBuffer and TypedArray](#ArrayBuffer-and-TypedArray) |
| | | |
| | | --- |
| | | |
| | | ### Hashers |
| | | |
| | | #### The Hasher Algorithms |
| | | |
| | | **MD5** |
| | | |
| | | MD5 is a widely used hash function. It's been used in a variety of security applications and is also commonly used to check the integrity of files. Though, MD5 is not collision resistant, and it isn't suitable for applications like SSL certificates or digital signatures that rely on this property. |
| | | |
| | | ``` |
| | | const hash = CryptoES.MD5("Message"); |
| | | ``` |
| | | |
| | | **SHA-1** |
| | | |
| | | The SHA hash functions were designed by the National Security Agency (NSA). SHA-1 is the most established of the existing SHA hash functions, and it's used in a variety of security applications and protocols. Though, SHA-1's collision resistance has been weakening as new attacks are discovered or improved. |
| | | |
| | | ``` |
| | | const hash = CryptoES.SHA1("Message"); |
| | | ``` |
| | | |
| | | **SHA-2** |
| | | |
| | | SHA-256 is one of the four variants in the SHA-2 set. It isn't as widely used as SHA-1, though it appears to provide much better security. |
| | | |
| | | ``` |
| | | const hash = CryptoES.SHA256("Message"); |
| | | ``` |
| | | |
| | | SHA-512 is largely identical to SHA-256 but operates on 64-bit words rather than 32. |
| | | |
| | | ``` |
| | | const hash = CryptoES.SHA512("Message"); |
| | | ``` |
| | | |
| | | CryptoES also supports SHA-224 and SHA-384, which are largely identical but truncated versions of SHA-256 and SHA-512 respectively. |
| | | |
| | | **SHA-3** |
| | | |
| | | SHA-3 is the winner of a five-year competition to select a new cryptographic hash algorithm where 64 competing designs were evaluated. |
| | | |
| | | **NOTE:** I made a mistake when I named this implementation SHA-3. It should be named Keccak[c=2d]. Each of the SHA-3 functions is based on an instance of the Keccak algorithm, which NIST selected as the winner of the SHA-3 competition, but those SHA-3 functions won't produce hashes identical to Keccak. |
| | | |
| | | ``` |
| | | const hash = CryptoES.SHA3("Message"); |
| | | ``` |
| | | |
| | | SHA-3 can be configured to output hash lengths of one of 224, 256, 384, or 512 bits. The default is 512 bits. |
| | | |
| | | ``` |
| | | const hash = CryptoES.SHA3("Message", { outputLength: 512 }); |
| | | const hash = CryptoES.SHA3("Message", { outputLength: 384 }); |
| | | const hash = CryptoES.SHA3("Message", { outputLength: 256 }); |
| | | const hash = CryptoES.SHA3("Message", { outputLength: 224 }); |
| | | ``` |
| | | |
| | | **RIPEMD-160** |
| | | |
| | | ``` |
| | | const hash = CryptoES.RIPEMD160("Message"); |
| | | ``` |
| | | |
| | | #### The Hasher Input |
| | | |
| | | The hash algorithms accept either strings or instances of CryptoES.lib.WordArray. A WordArray object represents an array of 32-bit words. When you pass a string, it's automatically converted to a WordArray encoded as UTF-8. |
| | | |
| | | #### The Hasher Output |
| | | |
| | | The hash you get back isn't a string yet. It's a WordArray object. When you use a WordArray object in a string context, it's automatically converted to a hex string. |
| | | |
| | | ``` |
| | | const hash = CryptoES.SHA256("Message"); |
| | | alert(typeof hash); // object |
| | | alert(hash); // 2f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91 |
| | | ``` |
| | | |
| | | You can convert a WordArray object to other formats by explicitly calling the toString method and passing an encoder. |
| | | |
| | | ``` |
| | | const hash = CryptoES.SHA256("Message"); |
| | | alert(hash.toString(CryptoES.enc.Base64)); // L3dmip37+NWEi57rSnFFypTG7ZI25Kdz9tyvpRMrL5E= alert(hash.toString(CryptoES.enc.Latin1)); // /wf��ûøÃ���ëJqEÃ�ÃÃ�6ä§söï¥+/� |
| | | alert(hash.toString(CryptoES.enc.Hex)); // 2f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91 |
| | | ``` |
| | | |
| | | #### Progressive Hashing |
| | | |
| | | ``` |
| | | const sha256 = CryptoES.algo.SHA256.create(); |
| | | sha256.update("Message Part 1"); |
| | | sha256.update("Message Part 2"); |
| | | sha256.update("Message Part 3"); |
| | | const hash = sha256.finalize(); |
| | | ``` |
| | | |
| | | ### HMAC |
| | | |
| | | Keyed-hash message authentication codes (HMAC) is a mechanism for message authentication using cryptographic hash functions. |
| | | |
| | | HMAC can be used in combination with any iterated cryptographic hash function. |
| | | |
| | | ``` |
| | | const hash = CryptoES.HmacMD5("Message", "Secret Passphrase"); |
| | | const hash = CryptoES.HmacSHA1("Message", "Secret Passphrase"); |
| | | const hash = CryptoES.HmacSHA256("Message", "Secret Passphrase"); |
| | | const hash = CryptoES.HmacSHA512("Message", "Secret Passphrase"); |
| | | ``` |
| | | |
| | | #### Progressive HMAC Hashing |
| | | |
| | | ``` |
| | | const hmac = CryptoES.algo.HMAC.create(CryptoES.algo.SHA256, "Secret Passphrase"); |
| | | hmac.update("Message Part 1"); |
| | | hmac.update("Message Part 2"); |
| | | hmac.update("Message Part 3"); |
| | | const hash = hmac.finalize(); |
| | | ``` |
| | | |
| | | ### PBKDF2 |
| | | |
| | | PBKDF2 is a password-based key derivation function. In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required. |
| | | |
| | | A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack. |
| | | |
| | | ``` |
| | | const salt = CryptoES.lib.WordArray.random(128/8); |
| | | const key128Bits = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 128/32 }); |
| | | const key256Bits = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 256/32 }); |
| | | const key512Bits = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 512/32 }); |
| | | const key512Bits1000Iterations = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 512/32, iterations: 1000 }); |
| | | ``` |
| | | |
| | | ### Ciphers |
| | | |
| | | #### The Cipher Algorithms |
| | | |
| | | **AES** |
| | | |
| | | The Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated. |
| | | |
| | | ``` |
| | | const encrypted = CryptoES.AES.encrypt("Message", "Secret Passphrase"); |
| | | const decrypted = CryptoES.AES.decrypt(encrypted, "Secret Passphrase"); |
| | | ``` |
| | | |
| | | CryptoES supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key. |
| | | |
| | | **DES, Triple DES** |
| | | |
| | | DES is a previously dominant algorithm for encryption, and was published as an official Federal Information Processing Standard (FIPS). DES is now considered to be insecure due to the small key size. |
| | | |
| | | ``` |
| | | const encrypted = CryptoES.DES.encrypt("Message", "Secret Passphrase"); |
| | | const decrypted = CryptoES.DES.decrypt(encrypted, "Secret Passphrase"); |
| | | ``` |
| | | |
| | | Triple DES applies DES three times to each block to increase the key size. The algorithm is believed to be secure in this form. |
| | | |
| | | ``` |
| | | const encrypted = CryptoES.TripleDES.encrypt("Message", "Secret Passphrase"); |
| | | const decrypted = CryptoES.TripleDES.decrypt(encrypted, "Secret Passphrase"); |
| | | ``` |
| | | |
| | | **Rabbit** |
| | | |
| | | Rabbit is a high-performance stream cipher and a finalist in the eSTREAM Portfolio. It is one of the four designs selected after a 3 1/2-year process where 22 designs were evaluated. |
| | | |
| | | ``` |
| | | const encrypted = CryptoES.Rabbit.encrypt("Message", "Secret Passphrase"); |
| | | const decrypted = CryptoES.Rabbit.decrypt(encrypted, "Secret Passphrase"); |
| | | ``` |
| | | |
| | | **RC4, RC4Drop** |
| | | |
| | | RC4 is a widely-used stream cipher. It's used in popular protocols such as SSL and WEP. Although remarkable for its simplicity and speed, the algorithm's history doesn't inspire confidence in its security. |
| | | |
| | | ``` |
| | | const encrypted = CryptoES.RC4.encrypt("Message", "Secret Passphrase"); |
| | | const decrypted = CryptoES.RC4.decrypt(encrypted, "Secret Passphrase"); |
| | | ``` |
| | | |
| | | It was discovered that the first few bytes of keystream are strongly non-random and leak information about the key. We can defend against this attack by discarding the initial portion of the keystream. This modified algorithm is traditionally called RC4-drop. |
| | | |
| | | By default, 192 words (768 bytes) are dropped, but you can configure the algorithm to drop any number of words. |
| | | |
| | | ``` |
| | | const encrypted = CryptoES.RC4Drop.encrypt("Message", "Secret Passphrase"); |
| | | const encrypted = CryptoES.RC4Drop.encrypt("Message", "Secret Passphrase", { drop: 3072/4 }); |
| | | const decrypted = CryptoES.RC4Drop.decrypt(encrypted, "Secret Passphrase", { drop: 3072/4 }); |
| | | ``` |
| | | |
| | | **Blowfish** |
| | | |
| | | Blowfish is a symmetric-key block cipher, designed in 1993 by Bruce Schneier and included in many cipher suites and encryption products. Blowfish provides a good encryption rate in software, and no effective cryptanalysis of it has been found to date. However, the Advanced Encryption Standard (AES) now receives more attention, and Schneier recommends Twofish for modern applications. |
| | | |
| | | Schneier designed Blowfish as a general-purpose algorithm, intended as an alternative to the aging DES and free of the problems and constraints associated with other algorithms. At the time Blowfish was released, many other designs were proprietary, encumbered by patents, or were commercial or government secrets. Schneier has stated that "Blowfish is unpatented, and will remain so in all countries. The algorithm is hereby placed in the public domain, and can be freely used by anyone." |
| | | |
| | | Notable features of the design include key-dependent S-boxes and a highly complex key schedule. |
| | | |
| | | ``` |
| | | const ciphertext = CryptoJS.Blowfish.encrypt(message, key, cfg); |
| | | const plaintext = CryptoJS.Blowfish.decrypt(ciphertext, key, cfg); |
| | | ``` |
| | | |
| | | #### Custom Key and IV |
| | | |
| | | ``` |
| | | const key = CryptoES.enc.Hex.parse('000102030405060708090a0b0c0d0e0f'); |
| | | const iv = CryptoES.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); |
| | | const encrypted = CryptoES.AES.encrypt("Message", key, { iv: iv }); |
| | | ``` |
| | | |
| | | #### Block Modes and Padding |
| | | |
| | | ``` |
| | | const encrypted = CryptoES.AES.encrypt("Message", "Secret Passphrase", { mode: CryptoES.mode.CFB, padding: CryptoES.pad.AnsiX923 }); |
| | | ``` |
| | | |
| | | CryptoES supports the following modes: |
| | | |
| | | - CBC (the default) |
| | | - CFB |
| | | - CTR |
| | | - OFB |
| | | - ECB |
| | | |
| | | And CryptoES supports the following padding schemes: |
| | | |
| | | - Pkcs7 (the default) |
| | | - Iso97971 |
| | | - AnsiX923 |
| | | - Iso10126 |
| | | - ZeroPadding |
| | | - NoPadding |
| | | |
| | | #### The Cipher Input |
| | | |
| | | For the plaintext message, the cipher algorithms accept either strings or instances of CryptoES.lib.WordArray. |
| | | |
| | | For the key, when you pass a string, it's treated as a passphrase and used to derive an actual key and IV. Or you can pass a WordArray that represents the actual key. If you pass the actual key, you must also pass the actual IV. |
| | | |
| | | For the ciphertext, the cipher algorithms accept either strings or instances of CryptoES.lib.CipherParams. A CipherParams object represents a collection of parameters such as the IV, a salt, and the raw ciphertext itself. When you pass a string, it's automatically converted to a CipherParams object according to a configurable format strategy. |
| | | |
| | | #### The Cipher Output |
| | | |
| | | The plaintext you get back after decryption is a WordArray object. See Hashers' Output for more detail. |
| | | |
| | | The ciphertext you get back after encryption isn't a string yet. It's a CipherParams object. A CipherParams object gives you access to all the parameters used during encryption. When you use a CipherParams object in a string context, it's automatically converted to a string according to a format strategy. The default is an OpenSSL-compatible format. |
| | | |
| | | ``` |
| | | const encrypted = CryptoES.AES.encrypt("Message", "Secret Passphrase"); alert(encrypted.key); // 74eb593087a982e2a6f5dded54ecd96d1fd0f3d44a58728cdcd40c55227522223 |
| | | alert(encrypted.iv); // 7781157e2629b094f0e3dd48c4d786115 |
| | | alert(encrypted.salt); // 7a25f9132ec6a8b34 |
| | | alert(encrypted.ciphertext); // 73e54154a15d1beeb509d9e12f1e462a0 |
| | | alert(encrypted); // U2FsdGVkX1+iX5Ey7GqLND5UFUoV0b7rUJ2eEvHkYqA= |
| | | ``` |
| | | |
| | | You can define your own formats in order to be compatible with other crypto implementations. A format is an object with two methodsâstringify and parseâthat converts between CipherParams objects and ciphertext strings. |
| | | |
| | | Here's how you might write a JSON formatter: |
| | | |
| | | ``` |
| | | const JsonFormatter = { |
| | | stringify: function (cipherParams) { // create json object with ciphertext |
| | | const jsonObj = { ct: cipherParams.ciphertext.toString(CryptoES.enc.Base64) }; // optionally add iv and salt |
| | | if (cipherParams.iv) { |
| | | jsonObj.iv = cipherParams.iv.toString(); |
| | | } |
| | | if (cipherParams.salt) { |
| | | jsonObj.s = cipherParams.salt.toString(); |
| | | } |
| | | // stringify json object |
| | | return JSON.stringify(jsonObj); |
| | | }, |
| | | parse: function (jsonStr) { // parse json string |
| | | const jsonObj = JSON.parse(jsonStr); // extract ciphertext from json object, and create cipher params object |
| | | const cipherParams = CryptoES.lib.CipherParams.create( |
| | | { ciphertext: CryptoES.enc.Base64.parse(jsonObj.ct) }, |
| | | ); // optionally extract iv and salt |
| | | if (jsonObj.iv) { |
| | | cipherParams.iv = CryptoES.enc.Hex.parse(jsonObj.iv) |
| | | } |
| | | if (jsonObj.s) { |
| | | cipherParams.salt = CryptoES.enc.Hex.parse(jsonObj.s) |
| | | } |
| | | return cipherParams; |
| | | }, |
| | | }; |
| | | const encrypted = CryptoES.AES.encrypt( |
| | | "Message", |
| | | "Secret Passphrase", |
| | | { format: JsonFormatter }, |
| | | ); |
| | | alert(encrypted); // {"ct":"tZ4MsEnfbcDOwqau68aOrQ==","iv":"8a8c8fd8fe33743d3638737ea4a00698","s":"ba06373c8f57179c"} |
| | | const decrypted = CryptoES.AES.decrypt( |
| | | encrypted, |
| | | "Secret Passphrase", |
| | | { format: JsonFormatter }, |
| | | ); |
| | | alert(decrypted.toString(CryptoES.enc.Utf8)); // Message |
| | | ``` |
| | | |
| | | #### Progressive Ciphering |
| | | |
| | | ``` |
| | | const key = CryptoES.enc.Hex.parse('000102030405060708090a0b0c0d0e0f'); |
| | | const iv = CryptoES.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); |
| | | const aesEncryptor = CryptoES.algo.AES.createEncryptor(key, { iv: iv }); |
| | | const ciphertextPart1 = aesEncryptor.process("Message Part 1"); |
| | | const ciphertextPart2 = aesEncryptor.process("Message Part 2"); |
| | | const ciphertextPart3 = aesEncryptor.process("Message Part 3"); |
| | | const ciphertextPart4 = aesEncryptor.finalize(); |
| | | const aesDecryptor = CryptoES.algo.AES.createDecryptor(key, { iv: iv }); |
| | | const plaintextPart1 = aesDecryptor.process(ciphertextPart1); |
| | | const plaintextPart2 = aesDecryptor.process(ciphertextPart2); |
| | | const plaintextPart3 = aesDecryptor.process(ciphertextPart3); |
| | | const plaintextPart4 = aesDecryptor.process(ciphertextPart4); |
| | | const plaintextPart5 = aesDecryptor.finalize(); |
| | | ``` |
| | | |
| | | #### Interoperability |
| | | |
| | | With OpenSSL |
| | | |
| | | Encrypt with OpenSSL: |
| | | |
| | | ``` |
| | | openssl enc -aes-256-cbc -in infile -out outfile -pass pass:"Secret Passphrase" -e -base64 |
| | | ``` |
| | | |
| | | Decrypt with CryptoES: |
| | | |
| | | ``` |
| | | const decrypted = CryptoES.AES.decrypt(openSSLEncrypted, "Secret Passphrase"); |
| | | ``` |
| | | |
| | | ### Encoders |
| | | |
| | | CryptoES can convert from encoding formats such as Base64, Latin1 or Hex to WordArray objects and vica versa. |
| | | |
| | | ``` |
| | | const words = CryptoES.enc.Base64.parse('SGVsbG8sIFdvcmxkIQ=='); |
| | | const base64 = CryptoES.enc.Base64.stringify(words); |
| | | const words = CryptoES.enc.Base64url.parse('SGVsbG8sIFdvcmxkIQ=='); |
| | | const base64url = CryptoES.enc.Base64.stringify(words); |
| | | const words = CryptoES.enc.Latin1.parse('Hello, World!'); |
| | | const latin1 = CryptoES.enc.Latin1.stringify(words); |
| | | const words = CryptoES.enc.Hex.parse('48656c6c6f2c20576f726c6421'); |
| | | const hex = CryptoES.enc.Hex.stringify(words); |
| | | const words = CryptoES.enc.Utf8.parse('ð¤¢'); |
| | | const utf8 = CryptoES.enc.Utf8.stringify(words); |
| | | const words = CryptoES.enc.Utf16.parse('Hello, World!'); |
| | | const utf16 = CryptoES.enc.Utf16.stringify(words); |
| | | const words = CryptoES.enc.Utf16LE.parse('Hello, World!'); |
| | | const utf16 = CryptoES.enc.Utf16LE.stringify(words); |
| | | ``` |
| | | |
| | | ### ArrayBuffer and TypedArray |
| | | |
| | | WordArray creator could recive an ArrayBuffer or TypedArray so that CryptoES algorisms could apply to them: |
| | | |
| | | ``` |
| | | const words = CryptoES.lib.WordArray.create(new ArrayBuffer(8)); |
| | | const rst = CryptoES.AES.encrypt(words, 'Secret Passphrase') |
| | | ``` |
| | | |
| | | **NOTE**: ArrayBuffer could not directly passed to algorisms, you should change them to WordArray first. |
| | | |
| | | With this, encrypting files would be easier: |
| | | |
| | | ``` |
| | | const fileInput = document.getElementById('fileInput'); |
| | | const file = fileInput.files[0]; |
| | | const reader = new FileReader(); |
| | | reader.readAsArrayBuffer(file); |
| | | reader.onload = function () { |
| | | const arrayBuffer = reader.result; |
| | | const words = CryptoES.lib.WordArray.create(arrayBuffer); |
| | | const rst = CryptoES.AES.encrypt(words, 'Secret Passphrase') |
| | | ... |
| | | }; |
| | | ``` |
| | | |
| | | ## Change Log |
| | | |
| | | [Change Log](https://github.com/entronad/crypto-es/blob/master/CHANGELOG.md) |
| | | |
| | | ## Blogs |
| | | |
| | | [Refactoring CryptoJS in Modern ECMAScript](https://medium.com/front-end-weekly/refactoring-cryptojs-in-modern-ecmascript-1d4e1837c272) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | BlockCipher, |
| | | } from './cipher-core.js'; |
| | | |
| | | // Lookup tables |
| | | const _SBOX = []; |
| | | const INV_SBOX = []; |
| | | const _SUB_MIX_0 = []; |
| | | const _SUB_MIX_1 = []; |
| | | const _SUB_MIX_2 = []; |
| | | const _SUB_MIX_3 = []; |
| | | const INV_SUB_MIX_0 = []; |
| | | const INV_SUB_MIX_1 = []; |
| | | const INV_SUB_MIX_2 = []; |
| | | const INV_SUB_MIX_3 = []; |
| | | |
| | | // Compute lookup tables |
| | | |
| | | // Compute double table |
| | | const d = []; |
| | | for (let i = 0; i < 256; i += 1) { |
| | | if (i < 128) { |
| | | d[i] = i << 1; |
| | | } else { |
| | | d[i] = (i << 1) ^ 0x11b; |
| | | } |
| | | } |
| | | |
| | | // Walk GF(2^8) |
| | | let x = 0; |
| | | let xi = 0; |
| | | for (let i = 0; i < 256; i += 1) { |
| | | // Compute sbox |
| | | let sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); |
| | | sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; |
| | | _SBOX[x] = sx; |
| | | INV_SBOX[sx] = x; |
| | | |
| | | // Compute multiplication |
| | | const x2 = d[x]; |
| | | const x4 = d[x2]; |
| | | const x8 = d[x4]; |
| | | |
| | | // Compute sub bytes, mix columns tables |
| | | let t = (d[sx] * 0x101) ^ (sx * 0x1010100); |
| | | _SUB_MIX_0[x] = (t << 24) | (t >>> 8); |
| | | _SUB_MIX_1[x] = (t << 16) | (t >>> 16); |
| | | _SUB_MIX_2[x] = (t << 8) | (t >>> 24); |
| | | _SUB_MIX_3[x] = t; |
| | | |
| | | // Compute inv sub bytes, inv mix columns tables |
| | | t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); |
| | | INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); |
| | | INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); |
| | | INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); |
| | | INV_SUB_MIX_3[sx] = t; |
| | | |
| | | // Compute next counter |
| | | if (!x) { |
| | | xi = 1; |
| | | x = xi; |
| | | } else { |
| | | x = x2 ^ d[d[d[x8 ^ x2]]]; |
| | | xi ^= d[d[xi]]; |
| | | } |
| | | } |
| | | |
| | | // Precomputed Rcon lookup |
| | | const RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; |
| | | |
| | | /** |
| | | * AES block cipher algorithm. |
| | | */ |
| | | export class AESAlgo extends BlockCipher { |
| | | _doReset() { |
| | | let t; |
| | | |
| | | // Skip reset of nRounds has been set before and key did not change |
| | | if (this._nRounds && this._keyPriorReset === this._key) { |
| | | return; |
| | | } |
| | | |
| | | // Shortcuts |
| | | this._keyPriorReset = this._key; |
| | | const key = this._keyPriorReset; |
| | | const keyWords = key.words; |
| | | const keySize = key.sigBytes / 4; |
| | | |
| | | // Compute number of rounds |
| | | this._nRounds = keySize + 6; |
| | | const nRounds = this._nRounds; |
| | | |
| | | // Compute number of key schedule rows |
| | | const ksRows = (nRounds + 1) * 4; |
| | | |
| | | // Compute key schedule |
| | | this._keySchedule = []; |
| | | const keySchedule = this._keySchedule; |
| | | for (let ksRow = 0; ksRow < ksRows; ksRow += 1) { |
| | | if (ksRow < keySize) { |
| | | keySchedule[ksRow] = keyWords[ksRow]; |
| | | } else { |
| | | t = keySchedule[ksRow - 1]; |
| | | |
| | | if (!(ksRow % keySize)) { |
| | | // Rot word |
| | | t = (t << 8) | (t >>> 24); |
| | | |
| | | // Sub word |
| | | t = (_SBOX[t >>> 24] << 24) |
| | | | (_SBOX[(t >>> 16) & 0xff] << 16) |
| | | | (_SBOX[(t >>> 8) & 0xff] << 8) |
| | | | _SBOX[t & 0xff]; |
| | | |
| | | // Mix Rcon |
| | | t ^= RCON[(ksRow / keySize) | 0] << 24; |
| | | } else if (keySize > 6 && ksRow % keySize === 4) { |
| | | // Sub word |
| | | t = (_SBOX[t >>> 24] << 24) |
| | | | (_SBOX[(t >>> 16) & 0xff] << 16) |
| | | | (_SBOX[(t >>> 8) & 0xff] << 8) |
| | | | _SBOX[t & 0xff]; |
| | | } |
| | | |
| | | keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; |
| | | } |
| | | } |
| | | |
| | | // Compute inv key schedule |
| | | this._invKeySchedule = []; |
| | | const invKeySchedule = this._invKeySchedule; |
| | | for (let invKsRow = 0; invKsRow < ksRows; invKsRow += 1) { |
| | | const ksRow = ksRows - invKsRow; |
| | | |
| | | if (invKsRow % 4) { |
| | | t = keySchedule[ksRow]; |
| | | } else { |
| | | t = keySchedule[ksRow - 4]; |
| | | } |
| | | |
| | | if (invKsRow < 4 || ksRow <= 4) { |
| | | invKeySchedule[invKsRow] = t; |
| | | } else { |
| | | invKeySchedule[invKsRow] = INV_SUB_MIX_0[_SBOX[t >>> 24]] |
| | | ^ INV_SUB_MIX_1[_SBOX[(t >>> 16) & 0xff]] |
| | | ^ INV_SUB_MIX_2[_SBOX[(t >>> 8) & 0xff]] |
| | | ^ INV_SUB_MIX_3[_SBOX[t & 0xff]]; |
| | | } |
| | | } |
| | | } |
| | | |
| | | encryptBlock(M, offset) { |
| | | this._doCryptBlock( |
| | | M, offset, this._keySchedule, _SUB_MIX_0, _SUB_MIX_1, _SUB_MIX_2, _SUB_MIX_3, _SBOX, |
| | | ); |
| | | } |
| | | |
| | | decryptBlock(M, offset) { |
| | | const _M = M; |
| | | |
| | | // Swap 2nd and 4th rows |
| | | let t = _M[offset + 1]; |
| | | _M[offset + 1] = _M[offset + 3]; |
| | | _M[offset + 3] = t; |
| | | |
| | | this._doCryptBlock( |
| | | _M, |
| | | offset, |
| | | this._invKeySchedule, |
| | | INV_SUB_MIX_0, |
| | | INV_SUB_MIX_1, |
| | | INV_SUB_MIX_2, |
| | | INV_SUB_MIX_3, |
| | | INV_SBOX, |
| | | ); |
| | | |
| | | // Inv swap 2nd and 4th rows |
| | | t = _M[offset + 1]; |
| | | _M[offset + 1] = _M[offset + 3]; |
| | | _M[offset + 3] = t; |
| | | } |
| | | |
| | | _doCryptBlock(M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { |
| | | const _M = M; |
| | | |
| | | // Shortcut |
| | | const nRounds = this._nRounds; |
| | | |
| | | // Get input, add round key |
| | | let s0 = _M[offset] ^ keySchedule[0]; |
| | | let s1 = _M[offset + 1] ^ keySchedule[1]; |
| | | let s2 = _M[offset + 2] ^ keySchedule[2]; |
| | | let s3 = _M[offset + 3] ^ keySchedule[3]; |
| | | |
| | | // Key schedule row counter |
| | | let ksRow = 4; |
| | | |
| | | // Rounds |
| | | for (let round = 1; round < nRounds; round += 1) { |
| | | // Shift rows, sub bytes, mix columns, add round key |
| | | const t0 = SUB_MIX_0[s0 >>> 24] |
| | | ^ SUB_MIX_1[(s1 >>> 16) & 0xff] |
| | | ^ SUB_MIX_2[(s2 >>> 8) & 0xff] |
| | | ^ SUB_MIX_3[s3 & 0xff] |
| | | ^ keySchedule[ksRow]; |
| | | ksRow += 1; |
| | | const t1 = SUB_MIX_0[s1 >>> 24] |
| | | ^ SUB_MIX_1[(s2 >>> 16) & 0xff] |
| | | ^ SUB_MIX_2[(s3 >>> 8) & 0xff] |
| | | ^ SUB_MIX_3[s0 & 0xff] |
| | | ^ keySchedule[ksRow]; |
| | | ksRow += 1; |
| | | const t2 = SUB_MIX_0[s2 >>> 24] |
| | | ^ SUB_MIX_1[(s3 >>> 16) & 0xff] |
| | | ^ SUB_MIX_2[(s0 >>> 8) & 0xff] |
| | | ^ SUB_MIX_3[s1 & 0xff] |
| | | ^ keySchedule[ksRow]; |
| | | ksRow += 1; |
| | | const t3 = SUB_MIX_0[s3 >>> 24] |
| | | ^ SUB_MIX_1[(s0 >>> 16) & 0xff] |
| | | ^ SUB_MIX_2[(s1 >>> 8) & 0xff] |
| | | ^ SUB_MIX_3[s2 & 0xff] |
| | | ^ keySchedule[ksRow]; |
| | | ksRow += 1; |
| | | |
| | | // Update state |
| | | s0 = t0; |
| | | s1 = t1; |
| | | s2 = t2; |
| | | s3 = t3; |
| | | } |
| | | |
| | | // Shift rows, sub bytes, add round key |
| | | const t0 = ( |
| | | (SBOX[s0 >>> 24] << 24) |
| | | | (SBOX[(s1 >>> 16) & 0xff] << 16) |
| | | | (SBOX[(s2 >>> 8) & 0xff] << 8) |
| | | | SBOX[s3 & 0xff] |
| | | ) ^ keySchedule[ksRow]; |
| | | ksRow += 1; |
| | | const t1 = ( |
| | | (SBOX[s1 >>> 24] << 24) |
| | | | (SBOX[(s2 >>> 16) & 0xff] << 16) |
| | | | (SBOX[(s3 >>> 8) & 0xff] << 8) |
| | | | SBOX[s0 & 0xff] |
| | | ) ^ keySchedule[ksRow]; |
| | | ksRow += 1; |
| | | const t2 = ( |
| | | (SBOX[s2 >>> 24] << 24) |
| | | | (SBOX[(s3 >>> 16) & 0xff] << 16) |
| | | | (SBOX[(s0 >>> 8) & 0xff] << 8) |
| | | | SBOX[s1 & 0xff] |
| | | ) ^ keySchedule[ksRow]; |
| | | ksRow += 1; |
| | | const t3 = ( |
| | | (SBOX[s3 >>> 24] << 24) |
| | | | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff] |
| | | ) ^ keySchedule[ksRow]; |
| | | ksRow += 1; |
| | | |
| | | // Set output |
| | | _M[offset] = t0; |
| | | _M[offset + 1] = t1; |
| | | _M[offset + 2] = t2; |
| | | _M[offset + 3] = t3; |
| | | } |
| | | } |
| | | AESAlgo.keySize = 256 / 32; |
| | | |
| | | /** |
| | | * Shortcut functions to the cipher's object interface. |
| | | * |
| | | * @example |
| | | * |
| | | * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); |
| | | * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); |
| | | */ |
| | | export const AES = BlockCipher._createHelper(AESAlgo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | WordArray, |
| | | } from './core.js'; |
| | | import { |
| | | BlockCipher, |
| | | } from './cipher-core.js'; |
| | | |
| | | const N = 16; |
| | | |
| | | //Origin pbox and sbox, derived from PI |
| | | const ORIG_P = [ |
| | | 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, |
| | | 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, |
| | | 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, |
| | | 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, |
| | | 0x9216D5D9, 0x8979FB1B, |
| | | ]; |
| | | |
| | | const ORIG_S = [ |
| | | [0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, |
| | | 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, |
| | | 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, |
| | | 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, |
| | | 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, |
| | | 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, |
| | | 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, |
| | | 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, |
| | | 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, |
| | | 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, |
| | | 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, |
| | | 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, |
| | | 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, |
| | | 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, |
| | | 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, |
| | | 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, |
| | | 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, |
| | | 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, |
| | | 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, |
| | | 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, |
| | | 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, |
| | | 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, |
| | | 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, |
| | | 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, |
| | | 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, |
| | | 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, |
| | | 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, |
| | | 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, |
| | | 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, |
| | | 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, |
| | | 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, |
| | | 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, |
| | | 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, |
| | | 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, |
| | | 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, |
| | | 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, |
| | | 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, |
| | | 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, |
| | | 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, |
| | | 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, |
| | | 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, |
| | | 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, |
| | | 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, |
| | | 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, |
| | | 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, |
| | | 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, |
| | | 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, |
| | | 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, |
| | | 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, |
| | | 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, |
| | | 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, |
| | | 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, |
| | | 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, |
| | | 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, |
| | | 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, |
| | | 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, |
| | | 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, |
| | | 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, |
| | | 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, |
| | | 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, |
| | | 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, |
| | | 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, |
| | | 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, |
| | | 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A,], |
| | | [0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, |
| | | 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, |
| | | 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, |
| | | 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, |
| | | 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, |
| | | 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, |
| | | 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, |
| | | 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, |
| | | 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, |
| | | 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, |
| | | 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, |
| | | 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, |
| | | 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, |
| | | 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, |
| | | 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, |
| | | 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, |
| | | 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, |
| | | 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, |
| | | 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, |
| | | 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, |
| | | 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, |
| | | 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, |
| | | 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, |
| | | 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, |
| | | 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, |
| | | 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, |
| | | 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, |
| | | 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, |
| | | 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, |
| | | 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, |
| | | 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, |
| | | 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, |
| | | 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, |
| | | 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, |
| | | 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, |
| | | 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, |
| | | 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, |
| | | 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, |
| | | 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, |
| | | 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, |
| | | 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, |
| | | 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, |
| | | 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, |
| | | 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, |
| | | 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, |
| | | 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, |
| | | 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, |
| | | 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, |
| | | 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, |
| | | 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, |
| | | 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, |
| | | 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, |
| | | 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, |
| | | 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, |
| | | 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, |
| | | 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, |
| | | 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, |
| | | 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, |
| | | 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, |
| | | 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, |
| | | 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, |
| | | 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, |
| | | 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, |
| | | 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7,], |
| | | [0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, |
| | | 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, |
| | | 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, |
| | | 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, |
| | | 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, |
| | | 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, |
| | | 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, |
| | | 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, |
| | | 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, |
| | | 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, |
| | | 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, |
| | | 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, |
| | | 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, |
| | | 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, |
| | | 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, |
| | | 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, |
| | | 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, |
| | | 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, |
| | | 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, |
| | | 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, |
| | | 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, |
| | | 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, |
| | | 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, |
| | | 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, |
| | | 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, |
| | | 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, |
| | | 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, |
| | | 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, |
| | | 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, |
| | | 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, |
| | | 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, |
| | | 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, |
| | | 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, |
| | | 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, |
| | | 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, |
| | | 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, |
| | | 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, |
| | | 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, |
| | | 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, |
| | | 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, |
| | | 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, |
| | | 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, |
| | | 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, |
| | | 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, |
| | | 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, |
| | | 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, |
| | | 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, |
| | | 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, |
| | | 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, |
| | | 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, |
| | | 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, |
| | | 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, |
| | | 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, |
| | | 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, |
| | | 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, |
| | | 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, |
| | | 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, |
| | | 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, |
| | | 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, |
| | | 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, |
| | | 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, |
| | | 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, |
| | | 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, |
| | | 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0,], |
| | | [0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, |
| | | 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, |
| | | 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, |
| | | 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, |
| | | 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, |
| | | 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, |
| | | 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, |
| | | 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, |
| | | 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, |
| | | 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, |
| | | 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, |
| | | 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, |
| | | 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, |
| | | 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, |
| | | 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, |
| | | 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, |
| | | 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, |
| | | 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, |
| | | 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, |
| | | 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, |
| | | 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, |
| | | 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, |
| | | 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, |
| | | 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, |
| | | 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, |
| | | 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, |
| | | 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, |
| | | 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, |
| | | 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, |
| | | 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, |
| | | 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, |
| | | 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, |
| | | 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, |
| | | 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, |
| | | 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, |
| | | 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, |
| | | 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, |
| | | 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, |
| | | 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, |
| | | 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, |
| | | 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, |
| | | 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, |
| | | 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, |
| | | 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, |
| | | 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, |
| | | 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, |
| | | 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, |
| | | 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, |
| | | 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, |
| | | 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, |
| | | 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, |
| | | 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, |
| | | 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, |
| | | 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, |
| | | 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, |
| | | 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, |
| | | 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, |
| | | 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, |
| | | 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, |
| | | 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, |
| | | 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, |
| | | 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, |
| | | 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, |
| | | 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6,], |
| | | ]; |
| | | |
| | | const blowfishCtx = { |
| | | pbox: [], |
| | | sbox: [], |
| | | }; |
| | | |
| | | function f(ctx, x) { |
| | | const a = (x >> 24) & 0xFF; |
| | | const b = (x >> 16) & 0xFF; |
| | | const c = (x >> 8) & 0xFF; |
| | | const d = x & 0xFF; |
| | | |
| | | let y = ctx.sbox[0][a] + ctx.sbox[1][b]; |
| | | y = y ^ ctx.sbox[2][c]; |
| | | y = y + ctx.sbox[3][d]; |
| | | |
| | | return y; |
| | | } |
| | | |
| | | function blowfishEncrypt(ctx, left, right) { |
| | | let Xl = left; |
| | | let Xr = right; |
| | | let temp; |
| | | |
| | | for(let i = 0; i < N; ++i){ |
| | | Xl = Xl ^ ctx.pbox[i]; |
| | | Xr = f(ctx, Xl) ^ Xr; |
| | | |
| | | temp = Xl; |
| | | Xl = Xr; |
| | | Xr = temp; |
| | | } |
| | | |
| | | temp = Xl; |
| | | Xl = Xr; |
| | | Xr = temp; |
| | | |
| | | Xr = Xr ^ ctx.pbox[N]; |
| | | Xl = Xl ^ ctx.pbox[N + 1]; |
| | | |
| | | return {left: Xl, right: Xr}; |
| | | } |
| | | |
| | | function blowfishDecrypt(ctx, left, right) { |
| | | let Xl = left; |
| | | let Xr = right; |
| | | let temp; |
| | | |
| | | for(let i = N + 1; i > 1; --i){ |
| | | Xl = Xl ^ ctx.pbox[i]; |
| | | Xr = f(ctx, Xl) ^ Xr; |
| | | |
| | | temp = Xl; |
| | | Xl = Xr; |
| | | Xr = temp; |
| | | } |
| | | |
| | | temp = Xl; |
| | | Xl = Xr; |
| | | Xr = temp; |
| | | |
| | | Xr = Xr ^ ctx.pbox[1]; |
| | | Xl = Xl ^ ctx.pbox[0]; |
| | | |
| | | return {left: Xl, right: Xr}; |
| | | } |
| | | |
| | | /** |
| | | * Initialization ctx's pbox and sbox. |
| | | * |
| | | * @param {Object} ctx The object has pbox and sbox. |
| | | * @param {Array} key An array of 32-bit words. |
| | | * @param {int} keysize The length of the key. |
| | | * |
| | | * @example |
| | | * |
| | | * blowfishInit(BLOWFISH_CTX, key, 128/32); |
| | | */ |
| | | function blowfishInit(ctx, key, keysize) { |
| | | for (let Row = 0; Row < 4; Row++) { |
| | | ctx.sbox[Row] = []; |
| | | for (let Col = 0; Col < 256; Col++) { |
| | | ctx.sbox[Row][Col] = ORIG_S[Row][Col]; |
| | | } |
| | | } |
| | | |
| | | let keyIndex = 0; |
| | | for (let index = 0; index < N + 2; index++) { |
| | | ctx.pbox[index] = ORIG_P[index] ^ key[keyIndex]; |
| | | keyIndex++; |
| | | if (keyIndex >= keysize) { |
| | | keyIndex = 0; |
| | | } |
| | | } |
| | | |
| | | let data1 = 0; |
| | | let data2 = 0; |
| | | let res = 0; |
| | | for (let i = 0; i < N + 2; i += 2) { |
| | | res = blowfishEncrypt(ctx, data1, data2); |
| | | data1 = res.left; |
| | | data2 = res.right; |
| | | ctx.pbox[i] = data1; |
| | | ctx.pbox[i + 1] = data2; |
| | | } |
| | | |
| | | for (let i = 0; i < 4; i++) { |
| | | for (let j = 0; j < 256; j += 2) { |
| | | res = blowfishEncrypt(ctx, data1, data2); |
| | | data1 = res.left; |
| | | data2 = res.right; |
| | | ctx.sbox[i][j] = data1; |
| | | ctx.sbox[i][j + 1] = data2; |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * Blowfish block cipher algorithm. |
| | | */ |
| | | export class BlowfishAlgo extends BlockCipher { |
| | | constructor(xformMode, key, cfg) { |
| | | super(xformMode, key, cfg); |
| | | |
| | | // blickSize is an instance field and should set in constructor. |
| | | this.blockSize = 64 / 32; |
| | | } |
| | | |
| | | _doReset() { |
| | | // Skip reset of nRounds has been set before and key did not change |
| | | if (this._keyPriorReset === this._key) { |
| | | return; |
| | | } |
| | | |
| | | // Shortcuts |
| | | const key = this._keyPriorReset = this._key; |
| | | const keyWords = key.words; |
| | | const keySize = key.sigBytes / 4; |
| | | |
| | | //Initialization pbox and sbox |
| | | blowfishInit(blowfishCtx, keyWords, keySize); |
| | | } |
| | | |
| | | encryptBlock(M, offset) { |
| | | const res = blowfishEncrypt(blowfishCtx, M[offset], M[offset + 1]); |
| | | M[offset] = res.left; |
| | | M[offset + 1] = res.right; |
| | | } |
| | | |
| | | decryptBlock(M, offset) { |
| | | const res = blowfishDecrypt(blowfishCtx, M[offset], M[offset + 1]); |
| | | M[offset] = res.left; |
| | | M[offset + 1] = res.right; |
| | | } |
| | | } |
| | | BlowfishAlgo.keySize = 128 / 32; |
| | | BlowfishAlgo.ivSize = 64 / 32; |
| | | // blickSize is an instance field and should set in constructor. |
| | | |
| | | /** |
| | | * Shortcut functions to the cipher's object interface. |
| | | * |
| | | * @example |
| | | * |
| | | * var ciphertext = CryptoJS.Blowfish.encrypt(message, key, cfg); |
| | | * var plaintext = CryptoJS.Blowfish.decrypt(ciphertext, key, cfg); |
| | | */ |
| | | export const Blowfish = BlockCipher._createHelper(BlowfishAlgo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /* eslint-disable no-use-before-define */ |
| | | |
| | | import { |
| | | Base, |
| | | WordArray, |
| | | BufferedBlockAlgorithm, |
| | | } from './core.js'; |
| | | import { Base64 } from './enc-base64.js'; |
| | | import { EvpKDFAlgo } from './evpkdf.js'; |
| | | |
| | | /** |
| | | * Abstract base cipher template. |
| | | * |
| | | * @property {number} keySize This cipher's key size. Default: 4 (128 bits) |
| | | * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) |
| | | * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. |
| | | * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. |
| | | */ |
| | | export class Cipher extends BufferedBlockAlgorithm { |
| | | /** |
| | | * Initializes a newly created cipher. |
| | | * |
| | | * @param {number} xformMode Either the encryption or decryption transormation mode constant. |
| | | * @param {WordArray} key The key. |
| | | * @param {Object} cfg (Optional) The configuration options to use for this operation. |
| | | * |
| | | * @example |
| | | * |
| | | * const cipher = CryptoJS.algo.AES.create( |
| | | * CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray } |
| | | * ); |
| | | */ |
| | | constructor(xformMode, key, cfg) { |
| | | super(); |
| | | |
| | | /** |
| | | * Configuration options. |
| | | * |
| | | * @property {WordArray} iv The IV to use for this operation. |
| | | */ |
| | | this.cfg = Object.assign(new Base(), cfg); |
| | | |
| | | // Store transform mode and key |
| | | this._xformMode = xformMode; |
| | | this._key = key; |
| | | |
| | | // Set initial values |
| | | this.reset(); |
| | | } |
| | | |
| | | /** |
| | | * Creates this cipher in encryption mode. |
| | | * |
| | | * @param {WordArray} key The key. |
| | | * @param {Object} cfg (Optional) The configuration options to use for this operation. |
| | | * |
| | | * @return {Cipher} A cipher instance. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); |
| | | */ |
| | | static createEncryptor(key, cfg) { |
| | | return this.create(this._ENC_XFORM_MODE, key, cfg); |
| | | } |
| | | |
| | | /** |
| | | * Creates this cipher in decryption mode. |
| | | * |
| | | * @param {WordArray} key The key. |
| | | * @param {Object} cfg (Optional) The configuration options to use for this operation. |
| | | * |
| | | * @return {Cipher} A cipher instance. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); |
| | | */ |
| | | static createDecryptor(key, cfg) { |
| | | return this.create(this._DEC_XFORM_MODE, key, cfg); |
| | | } |
| | | |
| | | /** |
| | | * Creates shortcut functions to a cipher's object interface. |
| | | * |
| | | * @param {Cipher} cipher The cipher to create a helper for. |
| | | * |
| | | * @return {Object} An object with encrypt and decrypt shortcut functions. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); |
| | | */ |
| | | static _createHelper(SubCipher) { |
| | | const selectCipherStrategy = (key) => { |
| | | if (typeof key === 'string') { |
| | | return PasswordBasedCipher; |
| | | } |
| | | return SerializableCipher; |
| | | }; |
| | | |
| | | return { |
| | | encrypt(message, key, cfg) { |
| | | return selectCipherStrategy(key).encrypt(SubCipher, message, key, cfg); |
| | | }, |
| | | |
| | | decrypt(ciphertext, key, cfg) { |
| | | return selectCipherStrategy(key).decrypt(SubCipher, ciphertext, key, cfg); |
| | | }, |
| | | }; |
| | | } |
| | | |
| | | /** |
| | | * Resets this cipher to its initial state. |
| | | * |
| | | * @example |
| | | * |
| | | * cipher.reset(); |
| | | */ |
| | | reset() { |
| | | // Reset data buffer |
| | | super.reset.call(this); |
| | | |
| | | // Perform concrete-cipher logic |
| | | this._doReset(); |
| | | } |
| | | |
| | | /** |
| | | * Adds data to be encrypted or decrypted. |
| | | * |
| | | * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. |
| | | * |
| | | * @return {WordArray} The data after processing. |
| | | * |
| | | * @example |
| | | * |
| | | * const encrypted = cipher.process('data'); |
| | | * const encrypted = cipher.process(wordArray); |
| | | */ |
| | | process(dataUpdate) { |
| | | // Append |
| | | this._append(dataUpdate); |
| | | |
| | | // Process available blocks |
| | | return this._process(); |
| | | } |
| | | |
| | | /** |
| | | * Finalizes the encryption or decryption process. |
| | | * Note that the finalize operation is effectively a destructive, read-once operation. |
| | | * |
| | | * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. |
| | | * |
| | | * @return {WordArray} The data after final processing. |
| | | * |
| | | * @example |
| | | * |
| | | * const encrypted = cipher.finalize(); |
| | | * const encrypted = cipher.finalize('data'); |
| | | * const encrypted = cipher.finalize(wordArray); |
| | | */ |
| | | finalize(dataUpdate) { |
| | | // Final data update |
| | | if (dataUpdate) { |
| | | this._append(dataUpdate); |
| | | } |
| | | |
| | | // Perform concrete-cipher logic |
| | | const finalProcessedData = this._doFinalize(); |
| | | |
| | | return finalProcessedData; |
| | | } |
| | | } |
| | | Cipher._ENC_XFORM_MODE = 1; |
| | | Cipher._DEC_XFORM_MODE = 2; |
| | | Cipher.keySize = 128 / 32; |
| | | Cipher.ivSize = 128 / 32; |
| | | |
| | | /** |
| | | * Abstract base stream cipher template. |
| | | * |
| | | * @property {number} blockSize |
| | | * |
| | | * The number of 32-bit words this cipher operates on. Default: 1 (32 bits) |
| | | */ |
| | | export class StreamCipher extends Cipher { |
| | | constructor(...args) { |
| | | super(...args); |
| | | |
| | | this.blockSize = 1; |
| | | } |
| | | |
| | | _doFinalize() { |
| | | // Process partial blocks |
| | | const finalProcessedBlocks = this._process(!!'flush'); |
| | | |
| | | return finalProcessedBlocks; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Abstract base block cipher mode template. |
| | | */ |
| | | export class BlockCipherMode extends Base { |
| | | /** |
| | | * Initializes a newly created mode. |
| | | * |
| | | * @param {Cipher} cipher A block cipher instance. |
| | | * @param {Array} iv The IV words. |
| | | * |
| | | * @example |
| | | * |
| | | * const mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); |
| | | */ |
| | | constructor(cipher, iv) { |
| | | super(); |
| | | |
| | | this._cipher = cipher; |
| | | this._iv = iv; |
| | | } |
| | | |
| | | /** |
| | | * Creates this mode for encryption. |
| | | * |
| | | * @param {Cipher} cipher A block cipher instance. |
| | | * @param {Array} iv The IV words. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); |
| | | */ |
| | | static createEncryptor(cipher, iv) { |
| | | return this.Encryptor.create(cipher, iv); |
| | | } |
| | | |
| | | /** |
| | | * Creates this mode for decryption. |
| | | * |
| | | * @param {Cipher} cipher A block cipher instance. |
| | | * @param {Array} iv The IV words. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); |
| | | */ |
| | | static createDecryptor(cipher, iv) { |
| | | return this.Decryptor.create(cipher, iv); |
| | | } |
| | | } |
| | | |
| | | function xorBlock(words, offset, blockSize) { |
| | | const _words = words; |
| | | let block; |
| | | |
| | | // Shortcut |
| | | const iv = this._iv; |
| | | |
| | | // Choose mixing block |
| | | if (iv) { |
| | | block = iv; |
| | | |
| | | // Remove IV for subsequent blocks |
| | | this._iv = undefined; |
| | | } else { |
| | | block = this._prevBlock; |
| | | } |
| | | |
| | | // XOR blocks |
| | | for (let i = 0; i < blockSize; i += 1) { |
| | | _words[offset + i] ^= block[i]; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Cipher Block Chaining mode. |
| | | */ |
| | | |
| | | /** |
| | | * Abstract base CBC mode. |
| | | */ |
| | | export class CBC extends BlockCipherMode { |
| | | } |
| | | /** |
| | | * CBC encryptor. |
| | | */ |
| | | CBC.Encryptor = class extends CBC { |
| | | /** |
| | | * Processes the data block at offset. |
| | | * |
| | | * @param {Array} words The data words to operate on. |
| | | * @param {number} offset The offset where the block starts. |
| | | * |
| | | * @example |
| | | * |
| | | * mode.processBlock(data.words, offset); |
| | | */ |
| | | processBlock(words, offset) { |
| | | // Shortcuts |
| | | const cipher = this._cipher; |
| | | const { blockSize } = cipher; |
| | | |
| | | // XOR and encrypt |
| | | xorBlock.call(this, words, offset, blockSize); |
| | | cipher.encryptBlock(words, offset); |
| | | |
| | | // Remember this block to use with next block |
| | | this._prevBlock = words.slice(offset, offset + blockSize); |
| | | } |
| | | }; |
| | | /** |
| | | * CBC decryptor. |
| | | */ |
| | | CBC.Decryptor = class extends CBC { |
| | | /** |
| | | * Processes the data block at offset. |
| | | * |
| | | * @param {Array} words The data words to operate on. |
| | | * @param {number} offset The offset where the block starts. |
| | | * |
| | | * @example |
| | | * |
| | | * mode.processBlock(data.words, offset); |
| | | */ |
| | | processBlock(words, offset) { |
| | | // Shortcuts |
| | | const cipher = this._cipher; |
| | | const { blockSize } = cipher; |
| | | |
| | | // Remember this block to use with next block |
| | | const thisBlock = words.slice(offset, offset + blockSize); |
| | | |
| | | // Decrypt and XOR |
| | | cipher.decryptBlock(words, offset); |
| | | xorBlock.call(this, words, offset, blockSize); |
| | | |
| | | // This block becomes the previous block |
| | | this._prevBlock = thisBlock; |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * PKCS #5/7 padding strategy. |
| | | */ |
| | | export const Pkcs7 = { |
| | | /** |
| | | * Pads data using the algorithm defined in PKCS #5/7. |
| | | * |
| | | * @param {WordArray} data The data to pad. |
| | | * @param {number} blockSize The multiple that the data should be padded to. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * CryptoJS.pad.Pkcs7.pad(wordArray, 4); |
| | | */ |
| | | pad(data, blockSize) { |
| | | // Shortcut |
| | | const blockSizeBytes = blockSize * 4; |
| | | |
| | | // Count padding bytes |
| | | const nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes); |
| | | |
| | | // Create padding word |
| | | const paddingWord = (nPaddingBytes << 24) |
| | | | (nPaddingBytes << 16) |
| | | | (nPaddingBytes << 8) |
| | | | nPaddingBytes; |
| | | |
| | | // Create padding |
| | | const paddingWords = []; |
| | | for (let i = 0; i < nPaddingBytes; i += 4) { |
| | | paddingWords.push(paddingWord); |
| | | } |
| | | const padding = WordArray.create(paddingWords, nPaddingBytes); |
| | | |
| | | // Add padding |
| | | data.concat(padding); |
| | | }, |
| | | |
| | | /** |
| | | * Unpads data that had been padded using the algorithm defined in PKCS #5/7. |
| | | * |
| | | * @param {WordArray} data The data to unpad. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * CryptoJS.pad.Pkcs7.unpad(wordArray); |
| | | */ |
| | | unpad(data) { |
| | | const _data = data; |
| | | |
| | | // Get number of padding bytes from last byte |
| | | const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff; |
| | | |
| | | // Remove padding |
| | | _data.sigBytes -= nPaddingBytes; |
| | | }, |
| | | }; |
| | | |
| | | /** |
| | | * Abstract base block cipher template. |
| | | * |
| | | * @property {number} blockSize |
| | | * |
| | | * The number of 32-bit words this cipher operates on. Default: 4 (128 bits) |
| | | */ |
| | | export class BlockCipher extends Cipher { |
| | | constructor(xformMode, key, cfg) { |
| | | /** |
| | | * Configuration options. |
| | | * |
| | | * @property {Mode} mode The block mode to use. Default: CBC |
| | | * @property {Padding} padding The padding strategy to use. Default: Pkcs7 |
| | | */ |
| | | super(xformMode, key, Object.assign( |
| | | { |
| | | mode: CBC, |
| | | padding: Pkcs7, |
| | | }, |
| | | cfg, |
| | | )); |
| | | |
| | | this.blockSize = 128 / 32; |
| | | } |
| | | |
| | | reset() { |
| | | let modeCreator; |
| | | |
| | | // Reset cipher |
| | | super.reset.call(this); |
| | | |
| | | // Shortcuts |
| | | const { cfg } = this; |
| | | const { iv, mode } = cfg; |
| | | |
| | | // Reset block mode |
| | | if (this._xformMode === this.constructor._ENC_XFORM_MODE) { |
| | | modeCreator = mode.createEncryptor; |
| | | } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { |
| | | modeCreator = mode.createDecryptor; |
| | | // Keep at least one block in the buffer for unpadding |
| | | this._minBufferSize = 1; |
| | | } |
| | | |
| | | this._mode = modeCreator.call(mode, this, iv && iv.words); |
| | | this._mode.__creator = modeCreator; |
| | | } |
| | | |
| | | _doProcessBlock(words, offset) { |
| | | this._mode.processBlock(words, offset); |
| | | } |
| | | |
| | | _doFinalize() { |
| | | let finalProcessedBlocks; |
| | | |
| | | // Shortcut |
| | | const { padding } = this.cfg; |
| | | |
| | | // Finalize |
| | | if (this._xformMode === this.constructor._ENC_XFORM_MODE) { |
| | | // Pad data |
| | | padding.pad(this._data, this.blockSize); |
| | | |
| | | // Process final blocks |
| | | finalProcessedBlocks = this._process(!!'flush'); |
| | | } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { |
| | | // Process final blocks |
| | | finalProcessedBlocks = this._process(!!'flush'); |
| | | |
| | | // Unpad data |
| | | padding.unpad(finalProcessedBlocks); |
| | | } |
| | | |
| | | return finalProcessedBlocks; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * A collection of cipher parameters. |
| | | * |
| | | * @property {WordArray} ciphertext The raw ciphertext. |
| | | * @property {WordArray} key The key to this ciphertext. |
| | | * @property {WordArray} iv The IV used in the ciphering operation. |
| | | * @property {WordArray} salt The salt used with a key derivation function. |
| | | * @property {Cipher} algorithm The cipher algorithm. |
| | | * @property {Mode} mode The block mode used in the ciphering operation. |
| | | * @property {Padding} padding The padding scheme used in the ciphering operation. |
| | | * @property {number} blockSize The block size of the cipher. |
| | | * @property {Format} formatter |
| | | * The default formatting strategy to convert this cipher params object to a string. |
| | | */ |
| | | export class CipherParams extends Base { |
| | | /** |
| | | * Initializes a newly created cipher params object. |
| | | * |
| | | * @param {Object} cipherParams An object with any of the possible cipher parameters. |
| | | * |
| | | * @example |
| | | * |
| | | * var cipherParams = CryptoJS.lib.CipherParams.create({ |
| | | * ciphertext: ciphertextWordArray, |
| | | * key: keyWordArray, |
| | | * iv: ivWordArray, |
| | | * salt: saltWordArray, |
| | | * algorithm: CryptoJS.algo.AES, |
| | | * mode: CryptoJS.mode.CBC, |
| | | * padding: CryptoJS.pad.PKCS7, |
| | | * blockSize: 4, |
| | | * formatter: CryptoJS.format.OpenSSL |
| | | * }); |
| | | */ |
| | | constructor(cipherParams) { |
| | | super(); |
| | | |
| | | this.mixIn(cipherParams); |
| | | } |
| | | |
| | | /** |
| | | * Converts this cipher params object to a string. |
| | | * |
| | | * @param {Format} formatter (Optional) The formatting strategy to use. |
| | | * |
| | | * @return {string} The stringified cipher params. |
| | | * |
| | | * @throws Error If neither the formatter nor the default formatter is set. |
| | | * |
| | | * @example |
| | | * |
| | | * var string = cipherParams + ''; |
| | | * var string = cipherParams.toString(); |
| | | * var string = cipherParams.toString(CryptoJS.format.OpenSSL); |
| | | */ |
| | | toString(formatter) { |
| | | return (formatter || this.formatter).stringify(this); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * OpenSSL formatting strategy. |
| | | */ |
| | | export const OpenSSLFormatter = { |
| | | /** |
| | | * Converts a cipher params object to an OpenSSL-compatible string. |
| | | * |
| | | * @param {CipherParams} cipherParams The cipher params object. |
| | | * |
| | | * @return {string} The OpenSSL-compatible string. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); |
| | | */ |
| | | stringify(cipherParams) { |
| | | let wordArray; |
| | | |
| | | // Shortcuts |
| | | const { ciphertext, salt } = cipherParams; |
| | | |
| | | // Format |
| | | if (salt) { |
| | | wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); |
| | | } else { |
| | | wordArray = ciphertext; |
| | | } |
| | | |
| | | return wordArray.toString(Base64); |
| | | }, |
| | | |
| | | /** |
| | | * Converts an OpenSSL-compatible string to a cipher params object. |
| | | * |
| | | * @param {string} openSSLStr The OpenSSL-compatible string. |
| | | * |
| | | * @return {CipherParams} The cipher params object. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); |
| | | */ |
| | | parse(openSSLStr) { |
| | | let salt; |
| | | |
| | | // Parse base64 |
| | | const ciphertext = Base64.parse(openSSLStr); |
| | | |
| | | // Shortcut |
| | | const ciphertextWords = ciphertext.words; |
| | | |
| | | // Test for salt |
| | | if (ciphertextWords[0] === 0x53616c74 && ciphertextWords[1] === 0x65645f5f) { |
| | | // Extract salt |
| | | salt = WordArray.create(ciphertextWords.slice(2, 4)); |
| | | |
| | | // Remove salt from ciphertext |
| | | ciphertextWords.splice(0, 4); |
| | | ciphertext.sigBytes -= 16; |
| | | } |
| | | |
| | | return CipherParams.create({ ciphertext, salt }); |
| | | }, |
| | | }; |
| | | |
| | | /** |
| | | * A cipher wrapper that returns ciphertext as a serializable cipher params object. |
| | | */ |
| | | export class SerializableCipher extends Base { |
| | | /** |
| | | * Encrypts a message. |
| | | * |
| | | * @param {Cipher} cipher The cipher algorithm to use. |
| | | * @param {WordArray|string} message The message to encrypt. |
| | | * @param {WordArray} key The key. |
| | | * @param {Object} cfg (Optional) The configuration options to use for this operation. |
| | | * |
| | | * @return {CipherParams} A cipher params object. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var ciphertextParams = CryptoJS.lib.SerializableCipher |
| | | * .encrypt(CryptoJS.algo.AES, message, key); |
| | | * var ciphertextParams = CryptoJS.lib.SerializableCipher |
| | | * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); |
| | | * var ciphertextParams = CryptoJS.lib.SerializableCipher |
| | | * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); |
| | | */ |
| | | static encrypt(cipher, message, key, cfg) { |
| | | // Apply config defaults |
| | | const _cfg = Object.assign(new Base(), this.cfg, cfg); |
| | | |
| | | // Encrypt |
| | | const encryptor = cipher.createEncryptor(key, _cfg); |
| | | const ciphertext = encryptor.finalize(message); |
| | | |
| | | // Shortcut |
| | | const cipherCfg = encryptor.cfg; |
| | | |
| | | // Create and return serializable cipher params |
| | | return CipherParams.create({ |
| | | ciphertext, |
| | | key, |
| | | iv: cipherCfg.iv, |
| | | algorithm: cipher, |
| | | mode: cipherCfg.mode, |
| | | padding: cipherCfg.padding, |
| | | blockSize: encryptor.blockSize, |
| | | formatter: _cfg.format, |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * Decrypts serialized ciphertext. |
| | | * |
| | | * @param {Cipher} cipher The cipher algorithm to use. |
| | | * @param {CipherParams|string} ciphertext The ciphertext to decrypt. |
| | | * @param {WordArray} key The key. |
| | | * @param {Object} cfg (Optional) The configuration options to use for this operation. |
| | | * |
| | | * @return {WordArray} The plaintext. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var plaintext = CryptoJS.lib.SerializableCipher |
| | | * .decrypt(CryptoJS.algo.AES, formattedCiphertext, key, |
| | | * { iv: iv, format: CryptoJS.format.OpenSSL }); |
| | | * var plaintext = CryptoJS.lib.SerializableCipher |
| | | * .decrypt(CryptoJS.algo.AES, ciphertextParams, key, |
| | | * { iv: iv, format: CryptoJS.format.OpenSSL }); |
| | | */ |
| | | static decrypt(cipher, ciphertext, key, cfg) { |
| | | let _ciphertext = ciphertext; |
| | | |
| | | // Apply config defaults |
| | | const _cfg = Object.assign(new Base(), this.cfg, cfg); |
| | | |
| | | // Convert string to CipherParams |
| | | _ciphertext = this._parse(_ciphertext, _cfg.format); |
| | | |
| | | // Decrypt |
| | | const plaintext = cipher.createDecryptor(key, _cfg).finalize(_ciphertext.ciphertext); |
| | | |
| | | return plaintext; |
| | | } |
| | | |
| | | /** |
| | | * Converts serialized ciphertext to CipherParams, |
| | | * else assumed CipherParams already and returns ciphertext unchanged. |
| | | * |
| | | * @param {CipherParams|string} ciphertext The ciphertext. |
| | | * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. |
| | | * |
| | | * @return {CipherParams} The unserialized ciphertext. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var ciphertextParams = CryptoJS.lib.SerializableCipher |
| | | * ._parse(ciphertextStringOrParams, format); |
| | | */ |
| | | static _parse(ciphertext, format) { |
| | | if (typeof ciphertext === 'string') { |
| | | return format.parse(ciphertext, this); |
| | | } |
| | | return ciphertext; |
| | | } |
| | | } |
| | | /** |
| | | * Configuration options. |
| | | * |
| | | * @property {Formatter} format |
| | | * |
| | | * The formatting strategy to convert cipher param objects to and from a string. |
| | | * Default: OpenSSL |
| | | */ |
| | | SerializableCipher.cfg = Object.assign( |
| | | new Base(), |
| | | { format: OpenSSLFormatter }, |
| | | ); |
| | | |
| | | /** |
| | | * OpenSSL key derivation function. |
| | | */ |
| | | export const OpenSSLKdf = { |
| | | /** |
| | | * Derives a key and IV from a password. |
| | | * |
| | | * @param {string} password The password to derive from. |
| | | * @param {number} keySize The size in words of the key to generate. |
| | | * @param {number} ivSize The size in words of the IV to generate. |
| | | * @param {WordArray|string} salt |
| | | * (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. |
| | | * |
| | | * @return {CipherParams} A cipher params object with the key, IV, and salt. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); |
| | | * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); |
| | | */ |
| | | execute(password, keySize, ivSize, salt, hasher) { |
| | | let _salt = salt; |
| | | |
| | | // Generate random salt |
| | | if (!_salt) { |
| | | _salt = WordArray.random(64 / 8); |
| | | } |
| | | |
| | | // Derive key and IV |
| | | let key; |
| | | if (!hasher) { |
| | | key = EvpKDFAlgo.create({ keySize: keySize + ivSize }).compute(password, _salt); |
| | | } else { |
| | | key = EvpKDFAlgo.create({ keySize: keySize + ivSize, hasher }).compute(password, _salt); |
| | | } |
| | | |
| | | // Separate key and IV |
| | | const iv = WordArray.create(key.words.slice(keySize), ivSize * 4); |
| | | key.sigBytes = keySize * 4; |
| | | |
| | | // Return params |
| | | return CipherParams.create({ key, iv, salt: _salt }); |
| | | }, |
| | | }; |
| | | |
| | | /** |
| | | * A serializable cipher wrapper that derives the key from a password, |
| | | * and returns ciphertext as a serializable cipher params object. |
| | | */ |
| | | export class PasswordBasedCipher extends SerializableCipher { |
| | | /** |
| | | * Encrypts a message using a password. |
| | | * |
| | | * @param {Cipher} cipher The cipher algorithm to use. |
| | | * @param {WordArray|string} message The message to encrypt. |
| | | * @param {string} password The password. |
| | | * @param {Object} cfg (Optional) The configuration options to use for this operation. |
| | | * |
| | | * @return {CipherParams} A cipher params object. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher |
| | | * .encrypt(CryptoJS.algo.AES, message, 'password'); |
| | | * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher |
| | | * .encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); |
| | | */ |
| | | static encrypt(cipher, message, password, cfg) { |
| | | // Apply config defaults |
| | | const _cfg = Object.assign(new Base(), this.cfg, cfg); |
| | | |
| | | // Derive key and other params |
| | | const derivedParams = _cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, _cfg.salt, _cfg.hasher); |
| | | |
| | | // Add IV to config |
| | | _cfg.iv = derivedParams.iv; |
| | | |
| | | // Encrypt |
| | | const ciphertext = SerializableCipher.encrypt |
| | | .call(this, cipher, message, derivedParams.key, _cfg); |
| | | |
| | | // Mix in derived params |
| | | ciphertext.mixIn(derivedParams); |
| | | |
| | | return ciphertext; |
| | | } |
| | | |
| | | /** |
| | | * Decrypts serialized ciphertext using a password. |
| | | * |
| | | * @param {Cipher} cipher The cipher algorithm to use. |
| | | * @param {CipherParams|string} ciphertext The ciphertext to decrypt. |
| | | * @param {string} password The password. |
| | | * @param {Object} cfg (Optional) The configuration options to use for this operation. |
| | | * |
| | | * @return {WordArray} The plaintext. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var plaintext = CryptoJS.lib.PasswordBasedCipher |
| | | * .decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', |
| | | * { format: CryptoJS.format.OpenSSL }); |
| | | * var plaintext = CryptoJS.lib.PasswordBasedCipher |
| | | * .decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', |
| | | * { format: CryptoJS.format.OpenSSL }); |
| | | */ |
| | | static decrypt(cipher, ciphertext, password, cfg) { |
| | | let _ciphertext = ciphertext; |
| | | |
| | | // Apply config defaults |
| | | const _cfg = Object.assign(new Base(), this.cfg, cfg); |
| | | |
| | | // Convert string to CipherParams |
| | | _ciphertext = this._parse(_ciphertext, _cfg.format); |
| | | |
| | | // Derive key and other params |
| | | const derivedParams = _cfg.kdf |
| | | .execute(password, cipher.keySize, cipher.ivSize, _ciphertext.salt, _cfg.hasher); |
| | | |
| | | // Add IV to config |
| | | _cfg.iv = derivedParams.iv; |
| | | |
| | | // Decrypt |
| | | const plaintext = SerializableCipher.decrypt |
| | | .call(this, cipher, _ciphertext, derivedParams.key, _cfg); |
| | | |
| | | return plaintext; |
| | | } |
| | | } |
| | | /** |
| | | * Configuration options. |
| | | * |
| | | * @property {KDF} kdf |
| | | * The key derivation function to use to generate a key and IV from a password. |
| | | * Default: OpenSSL |
| | | */ |
| | | PasswordBasedCipher.cfg = Object.assign(SerializableCipher.cfg, { kdf: OpenSSLKdf }); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /* eslint-disable no-use-before-define */ |
| | | |
| | | const crypto = |
| | | (typeof globalThis != 'undefined' ? globalThis : void 0)?.crypto || |
| | | (typeof global != 'undefined' ? global : void 0)?.crypto || |
| | | (typeof window != 'undefined' ? window : void 0)?.crypto || |
| | | (typeof self != 'undefined' ? self : void 0)?.crypto || |
| | | (typeof frames != 'undefined' ? frames : void 0)?.[0]?.crypto; |
| | | |
| | | let randomWordArray; |
| | | |
| | | if (crypto) { |
| | | randomWordArray = (nBytes) => { |
| | | const words = []; |
| | | |
| | | for (let i = 0, rcache; i < nBytes; i += 4) { |
| | | words.push(crypto.getRandomValues(new Uint32Array(1))[0]); |
| | | } |
| | | |
| | | return new WordArray(words, nBytes); |
| | | } |
| | | } else { |
| | | // Because there is no global crypto property in this context, cryptographically unsafe Math.random() is used. |
| | | |
| | | randomWordArray = (nBytes) => { |
| | | const words = []; |
| | | |
| | | const r = (m_w) => { |
| | | let _m_w = m_w; |
| | | let _m_z = 0x3ade68b1; |
| | | const mask = 0xffffffff; |
| | | |
| | | return () => { |
| | | _m_z = (0x9069 * (_m_z & 0xFFFF) + (_m_z >> 0x10)) & mask; |
| | | _m_w = (0x4650 * (_m_w & 0xFFFF) + (_m_w >> 0x10)) & mask; |
| | | let result = ((_m_z << 0x10) + _m_w) & mask; |
| | | result /= 0x100000000; |
| | | result += 0.5; |
| | | return result * (Math.random() > 0.5 ? 1 : -1); |
| | | }; |
| | | }; |
| | | |
| | | for (let i = 0, rcache; i < nBytes; i += 4) { |
| | | const _r = r((rcache || Math.random()) * 0x100000000); |
| | | |
| | | rcache = _r() * 0x3ade67b7; |
| | | words.push((_r() * 0x100000000) | 0); |
| | | } |
| | | |
| | | return new WordArray(words, nBytes); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Base class for inheritance. |
| | | */ |
| | | export class Base { |
| | | /** |
| | | * Extends this object and runs the init method. |
| | | * Arguments to create() will be passed to init(). |
| | | * |
| | | * @return {Object} The new object. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var instance = MyType.create(); |
| | | */ |
| | | static create(...args) { |
| | | return new this(...args); |
| | | } |
| | | |
| | | /** |
| | | * Copies properties into this object. |
| | | * |
| | | * @param {Object} properties The properties to mix in. |
| | | * |
| | | * @example |
| | | * |
| | | * MyType.mixIn({ |
| | | * field: 'value' |
| | | * }); |
| | | */ |
| | | mixIn(properties) { |
| | | return Object.assign(this, properties); |
| | | } |
| | | |
| | | /** |
| | | * Creates a copy of this object. |
| | | * |
| | | * @return {Object} The clone. |
| | | * |
| | | * @example |
| | | * |
| | | * var clone = instance.clone(); |
| | | */ |
| | | clone() { |
| | | const clone = new this.constructor(); |
| | | Object.assign(clone, this); |
| | | return clone; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * An array of 32-bit words. |
| | | * |
| | | * @property {Array} words The array of 32-bit words. |
| | | * @property {number} sigBytes The number of significant bytes in this word array. |
| | | */ |
| | | export class WordArray extends Base { |
| | | /** |
| | | * Initializes a newly created word array. |
| | | * |
| | | * @param {Array} words (Optional) An array of 32-bit words. |
| | | * @param {number} sigBytes (Optional) The number of significant bytes in the words. |
| | | * |
| | | * @example |
| | | * |
| | | * var wordArray = CryptoJS.lib.WordArray.create(); |
| | | * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); |
| | | * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); |
| | | */ |
| | | constructor(words = [], sigBytes = words.length * 4) { |
| | | super(); |
| | | |
| | | let typedArray = words; |
| | | // Convert buffers to uint8 |
| | | if (typedArray instanceof ArrayBuffer) { |
| | | typedArray = new Uint8Array(typedArray); |
| | | } |
| | | |
| | | // Convert other array views to uint8 |
| | | if ( |
| | | typedArray instanceof Int8Array |
| | | || typedArray instanceof Uint8ClampedArray |
| | | || typedArray instanceof Int16Array |
| | | || typedArray instanceof Uint16Array |
| | | || typedArray instanceof Int32Array |
| | | || typedArray instanceof Uint32Array |
| | | || typedArray instanceof Float32Array |
| | | || typedArray instanceof Float64Array |
| | | ) { |
| | | typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); |
| | | } |
| | | |
| | | // Handle Uint8Array |
| | | if (typedArray instanceof Uint8Array) { |
| | | // Shortcut |
| | | const typedArrayByteLength = typedArray.byteLength; |
| | | |
| | | // Extract bytes |
| | | const _words = []; |
| | | for (let i = 0; i < typedArrayByteLength; i += 1) { |
| | | _words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); |
| | | } |
| | | |
| | | // Initialize this word array |
| | | this.words = _words; |
| | | this.sigBytes = typedArrayByteLength; |
| | | } else { |
| | | // Else call normal init |
| | | this.words = words; |
| | | this.sigBytes = sigBytes; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Creates a word array filled with random bytes. |
| | | * |
| | | * @param {number} nBytes The number of random bytes to generate. |
| | | * |
| | | * @return {WordArray} The random word array. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var wordArray = CryptoJS.lib.WordArray.random(16); |
| | | */ |
| | | static random = randomWordArray; |
| | | |
| | | /** |
| | | * Converts this word array to a string. |
| | | * |
| | | * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex |
| | | * |
| | | * @return {string} The stringified word array. |
| | | * |
| | | * @example |
| | | * |
| | | * var string = wordArray + ''; |
| | | * var string = wordArray.toString(); |
| | | * var string = wordArray.toString(CryptoJS.enc.Utf8); |
| | | */ |
| | | toString(encoder = Hex) { |
| | | return encoder.stringify(this); |
| | | } |
| | | |
| | | /** |
| | | * Concatenates a word array to this word array. |
| | | * |
| | | * @param {WordArray} wordArray The word array to append. |
| | | * |
| | | * @return {WordArray} This word array. |
| | | * |
| | | * @example |
| | | * |
| | | * wordArray1.concat(wordArray2); |
| | | */ |
| | | concat(wordArray) { |
| | | // Shortcuts |
| | | const thisWords = this.words; |
| | | const thatWords = wordArray.words; |
| | | const thisSigBytes = this.sigBytes; |
| | | const thatSigBytes = wordArray.sigBytes; |
| | | |
| | | // Clamp excess bits |
| | | this.clamp(); |
| | | |
| | | // Concat |
| | | if (thisSigBytes % 4) { |
| | | // Copy one byte at a time |
| | | for (let i = 0; i < thatSigBytes; i += 1) { |
| | | const thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; |
| | | thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); |
| | | } |
| | | } else { |
| | | // Copy one word at a time |
| | | for (let i = 0; i < thatSigBytes; i += 4) { |
| | | thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; |
| | | } |
| | | } |
| | | this.sigBytes += thatSigBytes; |
| | | |
| | | // Chainable |
| | | return this; |
| | | } |
| | | |
| | | /** |
| | | * Removes insignificant bits. |
| | | * |
| | | * @example |
| | | * |
| | | * wordArray.clamp(); |
| | | */ |
| | | clamp() { |
| | | // Shortcuts |
| | | const { words, sigBytes } = this; |
| | | |
| | | // Clamp |
| | | words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); |
| | | words.length = Math.ceil(sigBytes / 4); |
| | | } |
| | | |
| | | /** |
| | | * Creates a copy of this word array. |
| | | * |
| | | * @return {WordArray} The clone. |
| | | * |
| | | * @example |
| | | * |
| | | * var clone = wordArray.clone(); |
| | | */ |
| | | clone() { |
| | | const clone = super.clone.call(this); |
| | | clone.words = this.words.slice(0); |
| | | |
| | | return clone; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Hex encoding strategy. |
| | | */ |
| | | export const Hex = { |
| | | /** |
| | | * Converts a word array to a hex string. |
| | | * |
| | | * @param {WordArray} wordArray The word array. |
| | | * |
| | | * @return {string} The hex string. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hexString = CryptoJS.enc.Hex.stringify(wordArray); |
| | | */ |
| | | stringify(wordArray) { |
| | | // Shortcuts |
| | | const { words, sigBytes } = wordArray; |
| | | |
| | | // Convert |
| | | const hexChars = []; |
| | | for (let i = 0; i < sigBytes; i += 1) { |
| | | const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; |
| | | hexChars.push((bite >>> 4).toString(16)); |
| | | hexChars.push((bite & 0x0f).toString(16)); |
| | | } |
| | | |
| | | return hexChars.join(''); |
| | | }, |
| | | |
| | | /** |
| | | * Converts a hex string to a word array. |
| | | * |
| | | * @param {string} hexStr The hex string. |
| | | * |
| | | * @return {WordArray} The word array. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var wordArray = CryptoJS.enc.Hex.parse(hexString); |
| | | */ |
| | | parse(hexStr) { |
| | | // Shortcut |
| | | const hexStrLength = hexStr.length; |
| | | |
| | | // Convert |
| | | const words = []; |
| | | for (let i = 0; i < hexStrLength; i += 2) { |
| | | words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); |
| | | } |
| | | |
| | | return new WordArray(words, hexStrLength / 2); |
| | | }, |
| | | }; |
| | | |
| | | /** |
| | | * Latin1 encoding strategy. |
| | | */ |
| | | export const Latin1 = { |
| | | /** |
| | | * Converts a word array to a Latin1 string. |
| | | * |
| | | * @param {WordArray} wordArray The word array. |
| | | * |
| | | * @return {string} The Latin1 string. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); |
| | | */ |
| | | stringify(wordArray) { |
| | | // Shortcuts |
| | | const { words, sigBytes } = wordArray; |
| | | |
| | | // Convert |
| | | const latin1Chars = []; |
| | | for (let i = 0; i < sigBytes; i += 1) { |
| | | const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; |
| | | latin1Chars.push(String.fromCharCode(bite)); |
| | | } |
| | | |
| | | return latin1Chars.join(''); |
| | | }, |
| | | |
| | | /** |
| | | * Converts a Latin1 string to a word array. |
| | | * |
| | | * @param {string} latin1Str The Latin1 string. |
| | | * |
| | | * @return {WordArray} The word array. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); |
| | | */ |
| | | parse(latin1Str) { |
| | | // Shortcut |
| | | const latin1StrLength = latin1Str.length; |
| | | |
| | | // Convert |
| | | const words = []; |
| | | for (let i = 0; i < latin1StrLength; i += 1) { |
| | | words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); |
| | | } |
| | | |
| | | return new WordArray(words, latin1StrLength); |
| | | }, |
| | | }; |
| | | |
| | | /** |
| | | * UTF-8 encoding strategy. |
| | | */ |
| | | export const Utf8 = { |
| | | /** |
| | | * Converts a word array to a UTF-8 string. |
| | | * |
| | | * @param {WordArray} wordArray The word array. |
| | | * |
| | | * @return {string} The UTF-8 string. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); |
| | | */ |
| | | stringify(wordArray) { |
| | | try { |
| | | return decodeURIComponent(escape(Latin1.stringify(wordArray))); |
| | | } catch (e) { |
| | | throw new Error('Malformed UTF-8 data'); |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * Converts a UTF-8 string to a word array. |
| | | * |
| | | * @param {string} utf8Str The UTF-8 string. |
| | | * |
| | | * @return {WordArray} The word array. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); |
| | | */ |
| | | parse(utf8Str) { |
| | | return Latin1.parse(unescape(encodeURIComponent(utf8Str))); |
| | | }, |
| | | }; |
| | | |
| | | /** |
| | | * Abstract buffered block algorithm template. |
| | | * |
| | | * The property blockSize must be implemented in a concrete subtype. |
| | | * |
| | | * @property {number} _minBufferSize |
| | | * |
| | | * The number of blocks that should be kept unprocessed in the buffer. Default: 0 |
| | | */ |
| | | export class BufferedBlockAlgorithm extends Base { |
| | | constructor() { |
| | | super(); |
| | | this._minBufferSize = 0; |
| | | } |
| | | |
| | | /** |
| | | * Resets this block algorithm's data buffer to its initial state. |
| | | * |
| | | * @example |
| | | * |
| | | * bufferedBlockAlgorithm.reset(); |
| | | */ |
| | | reset() { |
| | | // Initial values |
| | | this._data = new WordArray(); |
| | | this._nDataBytes = 0; |
| | | } |
| | | |
| | | /** |
| | | * Adds new data to this block algorithm's buffer. |
| | | * |
| | | * @param {WordArray|string} data |
| | | * |
| | | * The data to append. Strings are converted to a WordArray using UTF-8. |
| | | * |
| | | * @example |
| | | * |
| | | * bufferedBlockAlgorithm._append('data'); |
| | | * bufferedBlockAlgorithm._append(wordArray); |
| | | */ |
| | | _append(data) { |
| | | let m_data = data; |
| | | |
| | | // Convert string to WordArray, else assume WordArray already |
| | | if (typeof m_data === 'string') { |
| | | m_data = Utf8.parse(m_data); |
| | | } |
| | | |
| | | // Append |
| | | this._data.concat(m_data); |
| | | this._nDataBytes += m_data.sigBytes; |
| | | } |
| | | |
| | | /** |
| | | * Processes available data blocks. |
| | | * |
| | | * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. |
| | | * |
| | | * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. |
| | | * |
| | | * @return {WordArray} The processed data. |
| | | * |
| | | * @example |
| | | * |
| | | * var processedData = bufferedBlockAlgorithm._process(); |
| | | * var processedData = bufferedBlockAlgorithm._process(!!'flush'); |
| | | */ |
| | | _process(doFlush) { |
| | | let processedWords; |
| | | |
| | | // Shortcuts |
| | | const { _data: data, blockSize } = this; |
| | | const dataWords = data.words; |
| | | const dataSigBytes = data.sigBytes; |
| | | const blockSizeBytes = blockSize * 4; |
| | | |
| | | // Count blocks ready |
| | | let nBlocksReady = dataSigBytes / blockSizeBytes; |
| | | if (doFlush) { |
| | | // Round up to include partial blocks |
| | | nBlocksReady = Math.ceil(nBlocksReady); |
| | | } else { |
| | | // Round down to include only full blocks, |
| | | // less the number of blocks that must remain in the buffer |
| | | nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); |
| | | } |
| | | |
| | | // Count words ready |
| | | const nWordsReady = nBlocksReady * blockSize; |
| | | |
| | | // Count bytes ready |
| | | const nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); |
| | | |
| | | // Process blocks |
| | | if (nWordsReady) { |
| | | for (let offset = 0; offset < nWordsReady; offset += blockSize) { |
| | | // Perform concrete-algorithm logic |
| | | this._doProcessBlock(dataWords, offset); |
| | | } |
| | | |
| | | // Remove processed words |
| | | processedWords = dataWords.splice(0, nWordsReady); |
| | | data.sigBytes -= nBytesReady; |
| | | } |
| | | |
| | | // Return processed words |
| | | return new WordArray(processedWords, nBytesReady); |
| | | } |
| | | |
| | | /** |
| | | * Creates a copy of this object. |
| | | * |
| | | * @return {Object} The clone. |
| | | * |
| | | * @example |
| | | * |
| | | * var clone = bufferedBlockAlgorithm.clone(); |
| | | */ |
| | | clone() { |
| | | const clone = super.clone.call(this); |
| | | clone._data = this._data.clone(); |
| | | |
| | | return clone; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Abstract hasher template. |
| | | * |
| | | * @property {number} blockSize |
| | | * |
| | | * The number of 32-bit words this hasher operates on. Default: 16 (512 bits) |
| | | */ |
| | | export class Hasher extends BufferedBlockAlgorithm { |
| | | constructor(cfg) { |
| | | super(); |
| | | |
| | | this.blockSize = 512 / 32; |
| | | |
| | | /** |
| | | * Configuration options. |
| | | */ |
| | | this.cfg = Object.assign(new Base(), cfg); |
| | | |
| | | // Set initial values |
| | | this.reset(); |
| | | } |
| | | |
| | | /** |
| | | * Creates a shortcut function to a hasher's object interface. |
| | | * |
| | | * @param {Hasher} SubHasher The hasher to create a helper for. |
| | | * |
| | | * @return {Function} The shortcut function. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); |
| | | */ |
| | | static _createHelper(SubHasher) { |
| | | return (message, cfg) => new SubHasher(cfg).finalize(message); |
| | | } |
| | | |
| | | /** |
| | | * Creates a shortcut function to the HMAC's object interface. |
| | | * |
| | | * @param {Hasher} SubHasher The hasher to use in this HMAC helper. |
| | | * |
| | | * @return {Function} The shortcut function. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); |
| | | */ |
| | | static _createHmacHelper(SubHasher) { |
| | | return (message, key) => new HMAC(SubHasher, key).finalize(message); |
| | | } |
| | | |
| | | /** |
| | | * Resets this hasher to its initial state. |
| | | * |
| | | * @example |
| | | * |
| | | * hasher.reset(); |
| | | */ |
| | | reset() { |
| | | // Reset data buffer |
| | | super.reset.call(this); |
| | | |
| | | // Perform concrete-hasher logic |
| | | this._doReset(); |
| | | } |
| | | |
| | | /** |
| | | * Updates this hasher with a message. |
| | | * |
| | | * @param {WordArray|string} messageUpdate The message to append. |
| | | * |
| | | * @return {Hasher} This hasher. |
| | | * |
| | | * @example |
| | | * |
| | | * hasher.update('message'); |
| | | * hasher.update(wordArray); |
| | | */ |
| | | update(messageUpdate) { |
| | | // Append |
| | | this._append(messageUpdate); |
| | | |
| | | // Update the hash |
| | | this._process(); |
| | | |
| | | // Chainable |
| | | return this; |
| | | } |
| | | |
| | | /** |
| | | * Finalizes the hash computation. |
| | | * Note that the finalize operation is effectively a destructive, read-once operation. |
| | | * |
| | | * @param {WordArray|string} messageUpdate (Optional) A final message update. |
| | | * |
| | | * @return {WordArray} The hash. |
| | | * |
| | | * @example |
| | | * |
| | | * var hash = hasher.finalize(); |
| | | * var hash = hasher.finalize('message'); |
| | | * var hash = hasher.finalize(wordArray); |
| | | */ |
| | | finalize(messageUpdate) { |
| | | // Final message update |
| | | if (messageUpdate) { |
| | | this._append(messageUpdate); |
| | | } |
| | | |
| | | // Perform concrete-hasher logic |
| | | const hash = this._doFinalize(); |
| | | |
| | | return hash; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * HMAC algorithm. |
| | | */ |
| | | export class HMAC extends Base { |
| | | /** |
| | | * Initializes a newly created HMAC. |
| | | * |
| | | * @param {Hasher} SubHasher The hash algorithm to use. |
| | | * @param {WordArray|string} key The secret key. |
| | | * |
| | | * @example |
| | | * |
| | | * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); |
| | | */ |
| | | constructor(SubHasher, key) { |
| | | super(); |
| | | |
| | | const hasher = new SubHasher(); |
| | | this._hasher = hasher; |
| | | |
| | | // Convert string to WordArray, else assume WordArray already |
| | | let _key = key; |
| | | if (typeof _key === 'string') { |
| | | _key = Utf8.parse(_key); |
| | | } |
| | | |
| | | // Shortcuts |
| | | const hasherBlockSize = hasher.blockSize; |
| | | const hasherBlockSizeBytes = hasherBlockSize * 4; |
| | | |
| | | // Allow arbitrary length keys |
| | | if (_key.sigBytes > hasherBlockSizeBytes) { |
| | | _key = hasher.finalize(key); |
| | | } |
| | | |
| | | // Clamp excess bits |
| | | _key.clamp(); |
| | | |
| | | // Clone key for inner and outer pads |
| | | const oKey = _key.clone(); |
| | | this._oKey = oKey; |
| | | const iKey = _key.clone(); |
| | | this._iKey = iKey; |
| | | |
| | | // Shortcuts |
| | | const oKeyWords = oKey.words; |
| | | const iKeyWords = iKey.words; |
| | | |
| | | // XOR keys with pad constants |
| | | for (let i = 0; i < hasherBlockSize; i += 1) { |
| | | oKeyWords[i] ^= 0x5c5c5c5c; |
| | | iKeyWords[i] ^= 0x36363636; |
| | | } |
| | | oKey.sigBytes = hasherBlockSizeBytes; |
| | | iKey.sigBytes = hasherBlockSizeBytes; |
| | | |
| | | // Set initial values |
| | | this.reset(); |
| | | } |
| | | |
| | | /** |
| | | * Resets this HMAC to its initial state. |
| | | * |
| | | * @example |
| | | * |
| | | * hmacHasher.reset(); |
| | | */ |
| | | reset() { |
| | | // Shortcut |
| | | const hasher = this._hasher; |
| | | |
| | | // Reset |
| | | hasher.reset(); |
| | | hasher.update(this._iKey); |
| | | } |
| | | |
| | | /** |
| | | * Updates this HMAC with a message. |
| | | * |
| | | * @param {WordArray|string} messageUpdate The message to append. |
| | | * |
| | | * @return {HMAC} This HMAC instance. |
| | | * |
| | | * @example |
| | | * |
| | | * hmacHasher.update('message'); |
| | | * hmacHasher.update(wordArray); |
| | | */ |
| | | update(messageUpdate) { |
| | | this._hasher.update(messageUpdate); |
| | | |
| | | // Chainable |
| | | return this; |
| | | } |
| | | |
| | | /** |
| | | * Finalizes the HMAC computation. |
| | | * Note that the finalize operation is effectively a destructive, read-once operation. |
| | | * |
| | | * @param {WordArray|string} messageUpdate (Optional) A final message update. |
| | | * |
| | | * @return {WordArray} The HMAC. |
| | | * |
| | | * @example |
| | | * |
| | | * var hmac = hmacHasher.finalize(); |
| | | * var hmac = hmacHasher.finalize('message'); |
| | | * var hmac = hmacHasher.finalize(wordArray); |
| | | */ |
| | | finalize(messageUpdate) { |
| | | // Shortcut |
| | | const hasher = this._hasher; |
| | | |
| | | // Compute HMAC |
| | | const innerHash = hasher.finalize(messageUpdate); |
| | | hasher.reset(); |
| | | const hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); |
| | | |
| | | return hmac; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | WordArray, |
| | | } from './core.js'; |
| | | |
| | | export const parseLoop = (base64Str, base64StrLength, reverseMap) => { |
| | | const words = []; |
| | | let nBytes = 0; |
| | | for (let i = 0; i < base64StrLength; i += 1) { |
| | | if (i % 4) { |
| | | const bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); |
| | | const bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); |
| | | const bitsCombined = bits1 | bits2; |
| | | words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); |
| | | nBytes += 1; |
| | | } |
| | | } |
| | | return WordArray.create(words, nBytes); |
| | | }; |
| | | |
| | | /** |
| | | * Base64 encoding strategy. |
| | | */ |
| | | export const Base64 = { |
| | | /** |
| | | * Converts a word array to a Base64 string. |
| | | * |
| | | * @param {WordArray} wordArray The word array. |
| | | * |
| | | * @return {string} The Base64 string. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const base64String = CryptoJS.enc.Base64.stringify(wordArray); |
| | | */ |
| | | stringify(wordArray) { |
| | | // Shortcuts |
| | | const { words, sigBytes } = wordArray; |
| | | const map = this._map; |
| | | |
| | | // Clamp excess bits |
| | | wordArray.clamp(); |
| | | |
| | | // Convert |
| | | const base64Chars = []; |
| | | for (let i = 0; i < sigBytes; i += 3) { |
| | | const byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; |
| | | const byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; |
| | | const byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; |
| | | |
| | | const triplet = (byte1 << 16) | (byte2 << 8) | byte3; |
| | | |
| | | for (let j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j += 1) { |
| | | base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); |
| | | } |
| | | } |
| | | |
| | | // Add padding |
| | | const paddingChar = map.charAt(64); |
| | | if (paddingChar) { |
| | | while (base64Chars.length % 4) { |
| | | base64Chars.push(paddingChar); |
| | | } |
| | | } |
| | | |
| | | return base64Chars.join(''); |
| | | }, |
| | | |
| | | /** |
| | | * Converts a Base64 string to a word array. |
| | | * |
| | | * @param {string} base64Str The Base64 string. |
| | | * |
| | | * @return {WordArray} The word array. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const wordArray = CryptoJS.enc.Base64.parse(base64String); |
| | | */ |
| | | parse(base64Str) { |
| | | // Shortcuts |
| | | let base64StrLength = base64Str.length; |
| | | const map = this._map; |
| | | let reverseMap = this._reverseMap; |
| | | |
| | | if (!reverseMap) { |
| | | this._reverseMap = []; |
| | | reverseMap = this._reverseMap; |
| | | for (let j = 0; j < map.length; j += 1) { |
| | | reverseMap[map.charCodeAt(j)] = j; |
| | | } |
| | | } |
| | | |
| | | // Ignore padding |
| | | const paddingChar = map.charAt(64); |
| | | if (paddingChar) { |
| | | const paddingIndex = base64Str.indexOf(paddingChar); |
| | | if (paddingIndex !== -1) { |
| | | base64StrLength = paddingIndex; |
| | | } |
| | | } |
| | | |
| | | // Convert |
| | | return parseLoop(base64Str, base64StrLength, reverseMap); |
| | | }, |
| | | |
| | | _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | WordArray, |
| | | } from './core.js'; |
| | | import { |
| | | parseLoop, |
| | | } from './enc-base64.js' |
| | | |
| | | /** |
| | | * Base64url encoding strategy. |
| | | */ |
| | | export const Base64url = { |
| | | /** |
| | | * Converts a word array to a Base64url string. |
| | | * |
| | | * @param {WordArray} wordArray The word array. |
| | | * |
| | | * @param {boolean} urlSafe Whether to use url safe. |
| | | * |
| | | * @return {string} The Base64url string. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const base64String = CryptoJS.enc.Base64.stringify(wordArray); |
| | | */ |
| | | stringify(wordArray, urlSafe = true) { |
| | | // Shortcuts |
| | | const { words, sigBytes } = wordArray; |
| | | const map = urlSafe ? this._safeMap : this._map; |
| | | |
| | | // Clamp excess bits |
| | | wordArray.clamp(); |
| | | |
| | | // Convert |
| | | const base64Chars = []; |
| | | for (let i = 0; i < sigBytes; i += 3) { |
| | | const byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; |
| | | const byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; |
| | | const byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; |
| | | |
| | | const triplet = (byte1 << 16) | (byte2 << 8) | byte3; |
| | | |
| | | for (let j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j += 1) { |
| | | base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); |
| | | } |
| | | } |
| | | |
| | | // Add padding |
| | | const paddingChar = map.charAt(64); |
| | | if (paddingChar) { |
| | | while (base64Chars.length % 4) { |
| | | base64Chars.push(paddingChar); |
| | | } |
| | | } |
| | | |
| | | return base64Chars.join(''); |
| | | }, |
| | | |
| | | /** |
| | | * Converts a Base64url string to a word array. |
| | | * |
| | | * @param {string} base64Str The Base64url string. |
| | | * |
| | | * @param {boolean} urlSafe Whether to use url safe. |
| | | * |
| | | * @return {WordArray} The word array. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const wordArray = CryptoJS.enc.Base64.parse(base64String); |
| | | */ |
| | | parse(base64Str, urlSafe = true) { |
| | | // Shortcuts |
| | | let base64StrLength = base64Str.length; |
| | | const map = urlSafe ? this._safeMap : this._map; |
| | | let reverseMap = this._reverseMap; |
| | | |
| | | if (!reverseMap) { |
| | | this._reverseMap = []; |
| | | reverseMap = this._reverseMap; |
| | | for (let j = 0; j < map.length; j += 1) { |
| | | reverseMap[map.charCodeAt(j)] = j; |
| | | } |
| | | } |
| | | |
| | | // Ignore padding |
| | | const paddingChar = map.charAt(64); |
| | | if (paddingChar) { |
| | | const paddingIndex = base64Str.indexOf(paddingChar); |
| | | if (paddingIndex !== -1) { |
| | | base64StrLength = paddingIndex; |
| | | } |
| | | } |
| | | |
| | | // Convert |
| | | return parseLoop(base64Str, base64StrLength, reverseMap); |
| | | }, |
| | | |
| | | _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', |
| | | |
| | | _safeMap: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | WordArray, |
| | | } from './core.js'; |
| | | |
| | | const swapEndian = word => ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); |
| | | |
| | | /** |
| | | * UTF-16 BE encoding strategy. |
| | | */ |
| | | export const Utf16BE = { |
| | | /** |
| | | * Converts a word array to a UTF-16 BE string. |
| | | * |
| | | * @param {WordArray} wordArray The word array. |
| | | * |
| | | * @return {string} The UTF-16 BE string. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const utf16String = CryptoJS.enc.Utf16.stringify(wordArray); |
| | | */ |
| | | stringify(wordArray) { |
| | | // Shortcuts |
| | | const { words, sigBytes } = wordArray; |
| | | |
| | | // Convert |
| | | const utf16Chars = []; |
| | | for (let i = 0; i < sigBytes; i += 2) { |
| | | const codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; |
| | | utf16Chars.push(String.fromCharCode(codePoint)); |
| | | } |
| | | |
| | | return utf16Chars.join(''); |
| | | }, |
| | | |
| | | /** |
| | | * Converts a UTF-16 BE string to a word array. |
| | | * |
| | | * @param {string} utf16Str The UTF-16 BE string. |
| | | * |
| | | * @return {WordArray} The word array. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const wordArray = CryptoJS.enc.Utf16.parse(utf16String); |
| | | */ |
| | | parse(utf16Str) { |
| | | // Shortcut |
| | | const utf16StrLength = utf16Str.length; |
| | | |
| | | // Convert |
| | | const words = []; |
| | | for (let i = 0; i < utf16StrLength; i += 1) { |
| | | words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); |
| | | } |
| | | |
| | | return WordArray.create(words, utf16StrLength * 2); |
| | | }, |
| | | }; |
| | | export const Utf16 = Utf16BE; |
| | | |
| | | /** |
| | | * UTF-16 LE encoding strategy. |
| | | */ |
| | | export const Utf16LE = { |
| | | /** |
| | | * Converts a word array to a UTF-16 LE string. |
| | | * |
| | | * @param {WordArray} wordArray The word array. |
| | | * |
| | | * @return {string} The UTF-16 LE string. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); |
| | | */ |
| | | stringify(wordArray) { |
| | | // Shortcuts |
| | | const { words, sigBytes } = wordArray; |
| | | |
| | | // Convert |
| | | const utf16Chars = []; |
| | | for (let i = 0; i < sigBytes; i += 2) { |
| | | const codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); |
| | | utf16Chars.push(String.fromCharCode(codePoint)); |
| | | } |
| | | |
| | | return utf16Chars.join(''); |
| | | }, |
| | | |
| | | /** |
| | | * Converts a UTF-16 LE string to a word array. |
| | | * |
| | | * @param {string} utf16Str The UTF-16 LE string. |
| | | * |
| | | * @return {WordArray} The word array. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * const wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); |
| | | */ |
| | | parse(utf16Str) { |
| | | // Shortcut |
| | | const utf16StrLength = utf16Str.length; |
| | | |
| | | // Convert |
| | | const words = []; |
| | | for (let i = 0; i < utf16StrLength; i += 1) { |
| | | words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); |
| | | } |
| | | |
| | | return WordArray.create(words, utf16StrLength * 2); |
| | | }, |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | Base, |
| | | WordArray, |
| | | } from './core.js'; |
| | | import { MD5Algo } from './md5.js'; |
| | | |
| | | /** |
| | | * This key derivation function is meant to conform with EVP_BytesToKey. |
| | | * www.openssl.org/docs/crypto/EVP_BytesToKey.html |
| | | */ |
| | | export class EvpKDFAlgo extends Base { |
| | | /** |
| | | * Initializes a newly created key derivation function. |
| | | * |
| | | * @param {Object} cfg (Optional) The configuration options to use for the derivation. |
| | | * |
| | | * @example |
| | | * |
| | | * const kdf = CryptoJS.algo.EvpKDF.create(); |
| | | * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); |
| | | * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); |
| | | */ |
| | | constructor(cfg) { |
| | | super(); |
| | | |
| | | /** |
| | | * Configuration options. |
| | | * |
| | | * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) |
| | | * @property {Hasher} hasher The hash algorithm to use. Default: MD5 |
| | | * @property {number} iterations The number of iterations to perform. Default: 1 |
| | | */ |
| | | this.cfg = Object.assign( |
| | | new Base(), |
| | | { |
| | | keySize: 128 / 32, |
| | | hasher: MD5Algo, |
| | | iterations: 1, |
| | | }, |
| | | cfg, |
| | | ); |
| | | } |
| | | |
| | | /** |
| | | * Derives a key from a password. |
| | | * |
| | | * @param {WordArray|string} password The password. |
| | | * @param {WordArray|string} salt A salt. |
| | | * |
| | | * @return {WordArray} The derived key. |
| | | * |
| | | * @example |
| | | * |
| | | * const key = kdf.compute(password, salt); |
| | | */ |
| | | compute(password, salt) { |
| | | let block; |
| | | |
| | | // Shortcut |
| | | const { cfg } = this; |
| | | |
| | | // Init hasher |
| | | const hasher = cfg.hasher.create(); |
| | | |
| | | // Initial values |
| | | const derivedKey = WordArray.create(); |
| | | |
| | | // Shortcuts |
| | | const derivedKeyWords = derivedKey.words; |
| | | const { keySize, iterations } = cfg; |
| | | |
| | | // Generate key |
| | | while (derivedKeyWords.length < keySize) { |
| | | if (block) { |
| | | hasher.update(block); |
| | | } |
| | | block = hasher.update(password).finalize(salt); |
| | | hasher.reset(); |
| | | |
| | | // Iterations |
| | | for (let i = 1; i < iterations; i += 1) { |
| | | block = hasher.finalize(block); |
| | | hasher.reset(); |
| | | } |
| | | |
| | | derivedKey.concat(block); |
| | | } |
| | | derivedKey.sigBytes = keySize * 4; |
| | | |
| | | return derivedKey; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Derives a key from a password. |
| | | * |
| | | * @param {WordArray|string} password The password. |
| | | * @param {WordArray|string} salt A salt. |
| | | * @param {Object} cfg (Optional) The configuration options to use for this computation. |
| | | * |
| | | * @return {WordArray} The derived key. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var key = CryptoJS.EvpKDF(password, salt); |
| | | * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); |
| | | * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); |
| | | */ |
| | | export const EvpKDF = (password, salt, cfg) => EvpKDFAlgo.create(cfg).compute(password, salt); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | CipherParams, |
| | | } from './cipher-core.js'; |
| | | import { |
| | | Hex, |
| | | } from './core.js'; |
| | | |
| | | export const HexFormatter = { |
| | | /** |
| | | * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. |
| | | * |
| | | * @param {CipherParams} cipherParams The cipher params object. |
| | | * |
| | | * @return {string} The hexadecimally encoded string. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hexString = CryptoJS.format.Hex.stringify(cipherParams); |
| | | */ |
| | | stringify(cipherParams) { |
| | | return cipherParams.ciphertext.toString(Hex); |
| | | }, |
| | | |
| | | /** |
| | | * Converts a hexadecimally encoded ciphertext string to a cipher params object. |
| | | * |
| | | * @param {string} input The hexadecimally encoded string. |
| | | * |
| | | * @return {CipherParams} The cipher params object. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var cipherParams = CryptoJS.format.Hex.parse(hexString); |
| | | */ |
| | | parse(input) { |
| | | const ciphertext = Hex.parse(input); |
| | | return CipherParams.create({ ciphertext }); |
| | | }, |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | export { |
| | | HMAC, |
| | | } from './core.js'; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | Base, |
| | | WordArray, |
| | | Hex, |
| | | Latin1, |
| | | Utf8, |
| | | BufferedBlockAlgorithm, |
| | | Hasher, |
| | | } from './core.js'; |
| | | import { |
| | | X64Word, |
| | | X64WordArray, |
| | | } from './x64-core.js'; |
| | | import { |
| | | Cipher, |
| | | StreamCipher, |
| | | BlockCipherMode, |
| | | CBC, |
| | | Pkcs7, |
| | | BlockCipher, |
| | | CipherParams, |
| | | OpenSSLFormatter, |
| | | SerializableCipher, |
| | | OpenSSLKdf, |
| | | PasswordBasedCipher, |
| | | } from './cipher-core.js'; |
| | | |
| | | import { Utf16, Utf16BE, Utf16LE } from './enc-utf16.js'; |
| | | import { Base64 } from './enc-base64.js'; |
| | | import { Base64url } from './enc-base64url.js'; |
| | | import { HMAC } from './hmac.js'; |
| | | import { MD5Algo, MD5, HmacMD5 } from './md5.js'; |
| | | import { SHA1Algo, SHA1, HmacSHA1 } from './sha1.js'; |
| | | import { SHA224Algo, SHA224, HmacSHA224 } from './sha224.js'; |
| | | import { SHA256Algo, SHA256, HmacSHA256 } from './sha256.js'; |
| | | import { SHA384Algo, SHA384, HmacSHA384 } from './sha384.js'; |
| | | import { SHA512Algo, SHA512, HmacSHA512 } from './sha512.js'; |
| | | import { SHA3Algo, SHA3, HmacSHA3 } from './sha3.js'; |
| | | import { RIPEMD160Algo, RIPEMD160, HmacRIPEMD160 } from './ripemd160.js'; |
| | | import { PBKDF2Algo, PBKDF2 } from './pbkdf2.js'; |
| | | import { EvpKDFAlgo, EvpKDF } from './evpkdf.js'; |
| | | import { AESAlgo, AES } from './aes.js'; |
| | | import { |
| | | DESAlgo, |
| | | DES, |
| | | TripleDESAlgo, |
| | | TripleDES, |
| | | } from './tripledes.js'; |
| | | import { RabbitAlgo, Rabbit } from './rabbit.js'; |
| | | import { RabbitLegacyAlgo, RabbitLegacy } from './rabbit-legacy.js'; |
| | | import { |
| | | RC4Algo, |
| | | RC4, |
| | | RC4DropAlgo, |
| | | RC4Drop, |
| | | } from './rc4.js'; |
| | | import { BlowfishAlgo, Blowfish } from './blowfish.js'; |
| | | import { CFB } from './mode-cfb.js'; |
| | | import { CTR } from './mode-ctr.js'; |
| | | import { CTRGladman } from './mode-ctr-gladman.js'; |
| | | import { ECB } from './mode-ecb.js'; |
| | | import { OFB } from './mode-ofb.js'; |
| | | import { AnsiX923 } from './pad-ansix923.js'; |
| | | import { Iso10126 } from './pad-iso10126.js'; |
| | | import { Iso97971 } from './pad-iso97971.js'; |
| | | import { NoPadding } from './pad-nopadding.js'; |
| | | import { ZeroPadding } from './pad-zeropadding.js'; |
| | | import { HexFormatter } from './format-hex.js'; |
| | | |
| | | export default { |
| | | lib: { |
| | | Base, |
| | | WordArray, |
| | | BufferedBlockAlgorithm, |
| | | Hasher, |
| | | Cipher, |
| | | StreamCipher, |
| | | BlockCipherMode, |
| | | BlockCipher, |
| | | CipherParams, |
| | | SerializableCipher, |
| | | PasswordBasedCipher, |
| | | }, |
| | | |
| | | x64: { |
| | | Word: X64Word, |
| | | WordArray: X64WordArray, |
| | | }, |
| | | |
| | | enc: { |
| | | Hex, |
| | | Latin1, |
| | | Utf8, |
| | | Utf16, |
| | | Utf16BE, |
| | | Utf16LE, |
| | | Base64, |
| | | Base64url, |
| | | }, |
| | | |
| | | algo: { |
| | | HMAC, |
| | | MD5: MD5Algo, |
| | | SHA1: SHA1Algo, |
| | | SHA224: SHA224Algo, |
| | | SHA256: SHA256Algo, |
| | | SHA384: SHA384Algo, |
| | | SHA512: SHA512Algo, |
| | | SHA3: SHA3Algo, |
| | | RIPEMD160: RIPEMD160Algo, |
| | | |
| | | PBKDF2: PBKDF2Algo, |
| | | EvpKDF: EvpKDFAlgo, |
| | | |
| | | AES: AESAlgo, |
| | | DES: DESAlgo, |
| | | TripleDES: TripleDESAlgo, |
| | | Rabbit: RabbitAlgo, |
| | | RabbitLegacy: RabbitLegacyAlgo, |
| | | RC4: RC4Algo, |
| | | RC4Drop: RC4DropAlgo, |
| | | Blowfish: BlowfishAlgo, |
| | | }, |
| | | |
| | | mode: { |
| | | CBC, |
| | | CFB, |
| | | CTR, |
| | | CTRGladman, |
| | | ECB, |
| | | OFB, |
| | | }, |
| | | |
| | | pad: { |
| | | Pkcs7, |
| | | AnsiX923, |
| | | Iso10126, |
| | | Iso97971, |
| | | NoPadding, |
| | | ZeroPadding, |
| | | }, |
| | | |
| | | format: { |
| | | OpenSSL: OpenSSLFormatter, |
| | | Hex: HexFormatter, |
| | | }, |
| | | |
| | | kdf: { |
| | | OpenSSL: OpenSSLKdf, |
| | | }, |
| | | |
| | | MD5, |
| | | HmacMD5, |
| | | SHA1, |
| | | HmacSHA1, |
| | | SHA224, |
| | | HmacSHA224, |
| | | SHA256, |
| | | HmacSHA256, |
| | | SHA384, |
| | | HmacSHA384, |
| | | SHA512, |
| | | HmacSHA512, |
| | | SHA3, |
| | | HmacSHA3, |
| | | RIPEMD160, |
| | | HmacRIPEMD160, |
| | | |
| | | PBKDF2, |
| | | EvpKDF, |
| | | |
| | | AES, |
| | | DES, |
| | | TripleDES, |
| | | Rabbit, |
| | | RabbitLegacy, |
| | | RC4, |
| | | RC4Drop, |
| | | Blowfish, |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | WordArray, |
| | | Hasher, |
| | | } from './core.js'; |
| | | |
| | | // Constants table |
| | | const T = []; |
| | | |
| | | // Compute constants |
| | | for (let i = 0; i < 64; i += 1) { |
| | | T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; |
| | | } |
| | | |
| | | const FF = (a, b, c, d, x, s, t) => { |
| | | const n = a + ((b & c) | (~b & d)) + x + t; |
| | | return ((n << s) | (n >>> (32 - s))) + b; |
| | | }; |
| | | |
| | | const GG = (a, b, c, d, x, s, t) => { |
| | | const n = a + ((b & d) | (c & ~d)) + x + t; |
| | | return ((n << s) | (n >>> (32 - s))) + b; |
| | | }; |
| | | |
| | | const HH = (a, b, c, d, x, s, t) => { |
| | | const n = a + (b ^ c ^ d) + x + t; |
| | | return ((n << s) | (n >>> (32 - s))) + b; |
| | | }; |
| | | |
| | | const II = (a, b, c, d, x, s, t) => { |
| | | const n = a + (c ^ (b | ~d)) + x + t; |
| | | return ((n << s) | (n >>> (32 - s))) + b; |
| | | }; |
| | | |
| | | /** |
| | | * MD5 hash algorithm. |
| | | */ |
| | | export class MD5Algo extends Hasher { |
| | | _doReset() { |
| | | this._hash = new WordArray([ |
| | | 0x67452301, |
| | | 0xefcdab89, |
| | | 0x98badcfe, |
| | | 0x10325476, |
| | | ]); |
| | | } |
| | | |
| | | _doProcessBlock(M, offset) { |
| | | const _M = M; |
| | | |
| | | // Swap endian |
| | | for (let i = 0; i < 16; i += 1) { |
| | | // Shortcuts |
| | | const offset_i = offset + i; |
| | | const M_offset_i = M[offset_i]; |
| | | |
| | | _M[offset_i] = ( |
| | | (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
| | | | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) |
| | | ); |
| | | } |
| | | |
| | | // Shortcuts |
| | | const H = this._hash.words; |
| | | |
| | | const M_offset_0 = _M[offset + 0]; |
| | | const M_offset_1 = _M[offset + 1]; |
| | | const M_offset_2 = _M[offset + 2]; |
| | | const M_offset_3 = _M[offset + 3]; |
| | | const M_offset_4 = _M[offset + 4]; |
| | | const M_offset_5 = _M[offset + 5]; |
| | | const M_offset_6 = _M[offset + 6]; |
| | | const M_offset_7 = _M[offset + 7]; |
| | | const M_offset_8 = _M[offset + 8]; |
| | | const M_offset_9 = _M[offset + 9]; |
| | | const M_offset_10 = _M[offset + 10]; |
| | | const M_offset_11 = _M[offset + 11]; |
| | | const M_offset_12 = _M[offset + 12]; |
| | | const M_offset_13 = _M[offset + 13]; |
| | | const M_offset_14 = _M[offset + 14]; |
| | | const M_offset_15 = _M[offset + 15]; |
| | | |
| | | // Working varialbes |
| | | let a = H[0]; |
| | | let b = H[1]; |
| | | let c = H[2]; |
| | | let d = H[3]; |
| | | |
| | | // Computation |
| | | a = FF(a, b, c, d, M_offset_0, 7, T[0]); |
| | | d = FF(d, a, b, c, M_offset_1, 12, T[1]); |
| | | c = FF(c, d, a, b, M_offset_2, 17, T[2]); |
| | | b = FF(b, c, d, a, M_offset_3, 22, T[3]); |
| | | a = FF(a, b, c, d, M_offset_4, 7, T[4]); |
| | | d = FF(d, a, b, c, M_offset_5, 12, T[5]); |
| | | c = FF(c, d, a, b, M_offset_6, 17, T[6]); |
| | | b = FF(b, c, d, a, M_offset_7, 22, T[7]); |
| | | a = FF(a, b, c, d, M_offset_8, 7, T[8]); |
| | | d = FF(d, a, b, c, M_offset_9, 12, T[9]); |
| | | c = FF(c, d, a, b, M_offset_10, 17, T[10]); |
| | | b = FF(b, c, d, a, M_offset_11, 22, T[11]); |
| | | a = FF(a, b, c, d, M_offset_12, 7, T[12]); |
| | | d = FF(d, a, b, c, M_offset_13, 12, T[13]); |
| | | c = FF(c, d, a, b, M_offset_14, 17, T[14]); |
| | | b = FF(b, c, d, a, M_offset_15, 22, T[15]); |
| | | |
| | | a = GG(a, b, c, d, M_offset_1, 5, T[16]); |
| | | d = GG(d, a, b, c, M_offset_6, 9, T[17]); |
| | | c = GG(c, d, a, b, M_offset_11, 14, T[18]); |
| | | b = GG(b, c, d, a, M_offset_0, 20, T[19]); |
| | | a = GG(a, b, c, d, M_offset_5, 5, T[20]); |
| | | d = GG(d, a, b, c, M_offset_10, 9, T[21]); |
| | | c = GG(c, d, a, b, M_offset_15, 14, T[22]); |
| | | b = GG(b, c, d, a, M_offset_4, 20, T[23]); |
| | | a = GG(a, b, c, d, M_offset_9, 5, T[24]); |
| | | d = GG(d, a, b, c, M_offset_14, 9, T[25]); |
| | | c = GG(c, d, a, b, M_offset_3, 14, T[26]); |
| | | b = GG(b, c, d, a, M_offset_8, 20, T[27]); |
| | | a = GG(a, b, c, d, M_offset_13, 5, T[28]); |
| | | d = GG(d, a, b, c, M_offset_2, 9, T[29]); |
| | | c = GG(c, d, a, b, M_offset_7, 14, T[30]); |
| | | b = GG(b, c, d, a, M_offset_12, 20, T[31]); |
| | | |
| | | a = HH(a, b, c, d, M_offset_5, 4, T[32]); |
| | | d = HH(d, a, b, c, M_offset_8, 11, T[33]); |
| | | c = HH(c, d, a, b, M_offset_11, 16, T[34]); |
| | | b = HH(b, c, d, a, M_offset_14, 23, T[35]); |
| | | a = HH(a, b, c, d, M_offset_1, 4, T[36]); |
| | | d = HH(d, a, b, c, M_offset_4, 11, T[37]); |
| | | c = HH(c, d, a, b, M_offset_7, 16, T[38]); |
| | | b = HH(b, c, d, a, M_offset_10, 23, T[39]); |
| | | a = HH(a, b, c, d, M_offset_13, 4, T[40]); |
| | | d = HH(d, a, b, c, M_offset_0, 11, T[41]); |
| | | c = HH(c, d, a, b, M_offset_3, 16, T[42]); |
| | | b = HH(b, c, d, a, M_offset_6, 23, T[43]); |
| | | a = HH(a, b, c, d, M_offset_9, 4, T[44]); |
| | | d = HH(d, a, b, c, M_offset_12, 11, T[45]); |
| | | c = HH(c, d, a, b, M_offset_15, 16, T[46]); |
| | | b = HH(b, c, d, a, M_offset_2, 23, T[47]); |
| | | |
| | | a = II(a, b, c, d, M_offset_0, 6, T[48]); |
| | | d = II(d, a, b, c, M_offset_7, 10, T[49]); |
| | | c = II(c, d, a, b, M_offset_14, 15, T[50]); |
| | | b = II(b, c, d, a, M_offset_5, 21, T[51]); |
| | | a = II(a, b, c, d, M_offset_12, 6, T[52]); |
| | | d = II(d, a, b, c, M_offset_3, 10, T[53]); |
| | | c = II(c, d, a, b, M_offset_10, 15, T[54]); |
| | | b = II(b, c, d, a, M_offset_1, 21, T[55]); |
| | | a = II(a, b, c, d, M_offset_8, 6, T[56]); |
| | | d = II(d, a, b, c, M_offset_15, 10, T[57]); |
| | | c = II(c, d, a, b, M_offset_6, 15, T[58]); |
| | | b = II(b, c, d, a, M_offset_13, 21, T[59]); |
| | | a = II(a, b, c, d, M_offset_4, 6, T[60]); |
| | | d = II(d, a, b, c, M_offset_11, 10, T[61]); |
| | | c = II(c, d, a, b, M_offset_2, 15, T[62]); |
| | | b = II(b, c, d, a, M_offset_9, 21, T[63]); |
| | | |
| | | // Intermediate hash value |
| | | H[0] = (H[0] + a) | 0; |
| | | H[1] = (H[1] + b) | 0; |
| | | H[2] = (H[2] + c) | 0; |
| | | H[3] = (H[3] + d) | 0; |
| | | } |
| | | /* eslint-ensable no-param-reassign */ |
| | | |
| | | _doFinalize() { |
| | | // Shortcuts |
| | | const data = this._data; |
| | | const dataWords = data.words; |
| | | |
| | | const nBitsTotal = this._nDataBytes * 8; |
| | | const nBitsLeft = data.sigBytes * 8; |
| | | |
| | | // Add padding |
| | | dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32)); |
| | | |
| | | const nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); |
| | | const nBitsTotalL = nBitsTotal; |
| | | dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( |
| | | (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
| | | | (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) |
| | | ); |
| | | dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( |
| | | (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
| | | | (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) |
| | | ); |
| | | |
| | | data.sigBytes = (dataWords.length + 1) * 4; |
| | | |
| | | // Hash final blocks |
| | | this._process(); |
| | | |
| | | // Shortcuts |
| | | const hash = this._hash; |
| | | const H = hash.words; |
| | | |
| | | // Swap endian |
| | | for (let i = 0; i < 4; i += 1) { |
| | | // Shortcut |
| | | const H_i = H[i]; |
| | | |
| | | H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
| | | | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); |
| | | } |
| | | |
| | | // Return final computed hash |
| | | return hash; |
| | | } |
| | | |
| | | clone() { |
| | | const clone = super.clone.call(this); |
| | | clone._hash = this._hash.clone(); |
| | | |
| | | return clone; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Shortcut function to the hasher's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * |
| | | * @return {WordArray} The hash. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hash = CryptoJS.MD5('message'); |
| | | * var hash = CryptoJS.MD5(wordArray); |
| | | */ |
| | | export const MD5 = Hasher._createHelper(MD5Algo); |
| | | |
| | | /** |
| | | * Shortcut function to the HMAC's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * @param {WordArray|string} key The secret key. |
| | | * |
| | | * @return {WordArray} The HMAC. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hmac = CryptoJS.HmacMD5(message, key); |
| | | */ |
| | | export const HmacMD5 = Hasher._createHmacHelper(MD5Algo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | BlockCipherMode, |
| | | } from './cipher-core.js'; |
| | | |
| | | function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { |
| | | const _words = words; |
| | | let keystream; |
| | | |
| | | // Shortcut |
| | | const iv = this._iv; |
| | | |
| | | // Generate keystream |
| | | if (iv) { |
| | | keystream = iv.slice(0); |
| | | |
| | | // Remove IV for subsequent blocks |
| | | this._iv = undefined; |
| | | } else { |
| | | keystream = this._prevBlock; |
| | | } |
| | | cipher.encryptBlock(keystream, 0); |
| | | |
| | | // Encrypt |
| | | for (let i = 0; i < blockSize; i += 1) { |
| | | _words[offset + i] ^= keystream[i]; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Cipher Feedback block mode. |
| | | */ |
| | | export class CFB extends BlockCipherMode { |
| | | } |
| | | CFB.Encryptor = class extends CFB { |
| | | processBlock(words, offset) { |
| | | // Shortcuts |
| | | const cipher = this._cipher; |
| | | const { blockSize } = cipher; |
| | | |
| | | generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); |
| | | |
| | | // Remember this block to use with next block |
| | | this._prevBlock = words.slice(offset, offset + blockSize); |
| | | } |
| | | }; |
| | | CFB.Decryptor = class extends CFB { |
| | | processBlock(words, offset) { |
| | | // Shortcuts |
| | | const cipher = this._cipher; |
| | | const { blockSize } = cipher; |
| | | |
| | | // Remember this block to use with next block |
| | | const thisBlock = words.slice(offset, offset + blockSize); |
| | | |
| | | generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); |
| | | |
| | | // This block becomes the previous block |
| | | this._prevBlock = thisBlock; |
| | | } |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | BlockCipherMode, |
| | | } from './cipher-core.js'; |
| | | |
| | | const incWord = (word) => { |
| | | let _word = word; |
| | | |
| | | if (((word >> 24) & 0xff) === 0xff) { // overflow |
| | | let b1 = (word >> 16) & 0xff; |
| | | let b2 = (word >> 8) & 0xff; |
| | | let b3 = word & 0xff; |
| | | |
| | | if (b1 === 0xff) { // overflow b1 |
| | | b1 = 0; |
| | | if (b2 === 0xff) { |
| | | b2 = 0; |
| | | if (b3 === 0xff) { |
| | | b3 = 0; |
| | | } else { |
| | | b3 += 1; |
| | | } |
| | | } else { |
| | | b2 += 1; |
| | | } |
| | | } else { |
| | | b1 += 1; |
| | | } |
| | | |
| | | _word = 0; |
| | | _word += (b1 << 16); |
| | | _word += (b2 << 8); |
| | | _word += b3; |
| | | } else { |
| | | _word += (0x01 << 24); |
| | | } |
| | | return _word; |
| | | }; |
| | | |
| | | const incCounter = (counter) => { |
| | | const _counter = counter; |
| | | _counter[0] = incWord(_counter[0]); |
| | | |
| | | if (_counter[0] === 0) { |
| | | // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 |
| | | _counter[1] = incWord(_counter[1]); |
| | | } |
| | | return _counter; |
| | | }; |
| | | |
| | | /** @preserve |
| | | * Counter block mode compatible with Dr Brian Gladman fileenc.c |
| | | * derived from CryptoJS.mode.CTR |
| | | * Jan Hruby jhruby.web@gmail.com |
| | | */ |
| | | export class CTRGladman extends BlockCipherMode { |
| | | } |
| | | CTRGladman.Encryptor = class extends CTRGladman { |
| | | processBlock(words, offset) { |
| | | const _words = words; |
| | | |
| | | // Shortcuts |
| | | const cipher = this._cipher; |
| | | const { blockSize } = cipher; |
| | | const iv = this._iv; |
| | | let counter = this._counter; |
| | | |
| | | // Generate keystream |
| | | if (iv) { |
| | | this._counter = iv.slice(0); |
| | | counter = this._counter; |
| | | |
| | | // Remove IV for subsequent blocks |
| | | this._iv = undefined; |
| | | } |
| | | |
| | | incCounter(counter); |
| | | |
| | | const keystream = counter.slice(0); |
| | | cipher.encryptBlock(keystream, 0); |
| | | |
| | | // Encrypt |
| | | for (let i = 0; i < blockSize; i += 1) { |
| | | _words[offset + i] ^= keystream[i]; |
| | | } |
| | | } |
| | | }; |
| | | CTRGladman.Decryptor = CTRGladman.Encryptor; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | BlockCipherMode, |
| | | } from './cipher-core.js'; |
| | | |
| | | /** |
| | | * Counter block mode. |
| | | */ |
| | | export class CTR extends BlockCipherMode { |
| | | } |
| | | CTR.Encryptor = class extends CTR { |
| | | processBlock(words, offset) { |
| | | const _words = words; |
| | | |
| | | // Shortcuts |
| | | const cipher = this._cipher; |
| | | const { blockSize } = cipher; |
| | | const iv = this._iv; |
| | | let counter = this._counter; |
| | | |
| | | // Generate keystream |
| | | if (iv) { |
| | | this._counter = iv.slice(0); |
| | | counter = this._counter; |
| | | |
| | | // Remove IV for subsequent blocks |
| | | this._iv = undefined; |
| | | } |
| | | const keystream = counter.slice(0); |
| | | cipher.encryptBlock(keystream, 0); |
| | | |
| | | // Increment counter |
| | | counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0; |
| | | |
| | | // Encrypt |
| | | for (let i = 0; i < blockSize; i += 1) { |
| | | _words[offset + i] ^= keystream[i]; |
| | | } |
| | | } |
| | | }; |
| | | CTR.Decryptor = CTR.Encryptor; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | BlockCipherMode, |
| | | } from './cipher-core.js'; |
| | | |
| | | /** |
| | | * Electronic Codebook block mode. |
| | | */ |
| | | export class ECB extends BlockCipherMode { |
| | | } |
| | | ECB.Encryptor = class extends ECB { |
| | | processBlock(words, offset) { |
| | | this._cipher.encryptBlock(words, offset); |
| | | } |
| | | }; |
| | | ECB.Decryptor = class extends ECB { |
| | | processBlock(words, offset) { |
| | | this._cipher.decryptBlock(words, offset); |
| | | } |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | BlockCipherMode, |
| | | } from './cipher-core.js'; |
| | | |
| | | /** |
| | | * Output Feedback block mode. |
| | | */ |
| | | export class OFB extends BlockCipherMode { |
| | | } |
| | | OFB.Encryptor = class extends OFB { |
| | | processBlock(words, offset) { |
| | | const _words = words; |
| | | |
| | | // Shortcuts |
| | | const cipher = this._cipher; |
| | | const { blockSize } = cipher; |
| | | const iv = this._iv; |
| | | let keystream = this._keystream; |
| | | |
| | | // Generate keystream |
| | | if (iv) { |
| | | this._keystream = iv.slice(0); |
| | | keystream = this._keystream; |
| | | |
| | | // Remove IV for subsequent blocks |
| | | this._iv = undefined; |
| | | } |
| | | cipher.encryptBlock(keystream, 0); |
| | | |
| | | // Encrypt |
| | | for (let i = 0; i < blockSize; i += 1) { |
| | | _words[offset + i] ^= keystream[i]; |
| | | } |
| | | } |
| | | }; |
| | | OFB.Decryptor = OFB.Encryptor; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * ANSI X.923 padding strategy. |
| | | */ |
| | | export const AnsiX923 = { |
| | | pad(data, blockSize) { |
| | | const _data = data; |
| | | |
| | | // Shortcuts |
| | | const dataSigBytes = _data.sigBytes; |
| | | const blockSizeBytes = blockSize * 4; |
| | | |
| | | // Count padding bytes |
| | | const nPaddingBytes = blockSizeBytes - (dataSigBytes % blockSizeBytes); |
| | | |
| | | // Compute last byte position |
| | | const lastBytePos = dataSigBytes + nPaddingBytes - 1; |
| | | |
| | | // Pad |
| | | _data.clamp(); |
| | | _data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); |
| | | _data.sigBytes += nPaddingBytes; |
| | | }, |
| | | |
| | | unpad(data) { |
| | | const _data = data; |
| | | |
| | | // Get number of padding bytes from last byte |
| | | const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff; |
| | | |
| | | // Remove padding |
| | | _data.sigBytes -= nPaddingBytes; |
| | | }, |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | WordArray, |
| | | } from './core.js'; |
| | | |
| | | /** |
| | | * ISO 10126 padding strategy. |
| | | */ |
| | | export const Iso10126 = { |
| | | pad(data, blockSize) { |
| | | // Shortcut |
| | | const blockSizeBytes = blockSize * 4; |
| | | |
| | | // Count padding bytes |
| | | const nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes); |
| | | |
| | | // Pad |
| | | data |
| | | .concat(WordArray.random(nPaddingBytes - 1)) |
| | | .concat(WordArray.create([nPaddingBytes << 24], 1)); |
| | | }, |
| | | |
| | | unpad(data) { |
| | | const _data = data; |
| | | // Get number of padding bytes from last byte |
| | | const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff; |
| | | |
| | | // Remove padding |
| | | _data.sigBytes -= nPaddingBytes; |
| | | }, |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | WordArray, |
| | | } from './core.js'; |
| | | import { |
| | | ZeroPadding, |
| | | } from './pad-zeropadding.js'; |
| | | |
| | | /** |
| | | * ISO/IEC 9797-1 Padding Method 2. |
| | | */ |
| | | export const Iso97971 = { |
| | | pad(data, blockSize) { |
| | | // Add 0x80 byte |
| | | data.concat(WordArray.create([0x80000000], 1)); |
| | | |
| | | // Zero pad the rest |
| | | ZeroPadding.pad(data, blockSize); |
| | | }, |
| | | |
| | | unpad(data) { |
| | | const _data = data; |
| | | |
| | | // Remove zero padding |
| | | ZeroPadding.unpad(_data); |
| | | |
| | | // Remove one more byte -- the 0x80 byte |
| | | _data.sigBytes -= 1; |
| | | }, |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * A noop padding strategy. |
| | | */ |
| | | export const NoPadding = { |
| | | pad() { |
| | | }, |
| | | |
| | | unpad() { |
| | | }, |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * Zero padding strategy. |
| | | */ |
| | | export const ZeroPadding = { |
| | | pad(data, blockSize) { |
| | | const _data = data; |
| | | |
| | | // Shortcut |
| | | const blockSizeBytes = blockSize * 4; |
| | | |
| | | // Pad |
| | | _data.clamp(); |
| | | _data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); |
| | | }, |
| | | |
| | | unpad(data) { |
| | | const _data = data; |
| | | |
| | | // Shortcut |
| | | const dataWords = _data.words; |
| | | |
| | | // Unpad |
| | | for (let i = _data.sigBytes - 1; i >= 0; i -= 1) { |
| | | if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { |
| | | _data.sigBytes = i + 1; |
| | | break; |
| | | } |
| | | } |
| | | }, |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | Base, |
| | | WordArray, |
| | | } from './core.js'; |
| | | import { SHA256Algo } from './sha256.js'; |
| | | import { HMAC } from './hmac.js'; |
| | | |
| | | /** |
| | | * Password-Based Key Derivation Function 2 algorithm. |
| | | */ |
| | | export class PBKDF2Algo extends Base { |
| | | /** |
| | | * Initializes a newly created key derivation function. |
| | | * |
| | | * @param {Object} cfg (Optional) The configuration options to use for the derivation. |
| | | * |
| | | * @example |
| | | * |
| | | * const kdf = CryptoJS.algo.PBKDF2.create(); |
| | | * const kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); |
| | | * const kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); |
| | | */ |
| | | constructor(cfg) { |
| | | super(); |
| | | |
| | | /** |
| | | * Configuration options. |
| | | * |
| | | * The default `hasher` and `interations` is different from CryptoJs to enhance security: |
| | | * https://github.com/entronad/crypto-es/security/advisories/GHSA-mpj8-q39x-wq5h |
| | | * |
| | | * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) |
| | | * @property {Hasher} hasher The hasher to use. Default: SHA256 |
| | | * @property {number} iterations The number of iterations to perform. Default: 250000 |
| | | */ |
| | | this.cfg = Object.assign( |
| | | new Base(), |
| | | { |
| | | keySize: 128 / 32, |
| | | hasher: SHA256Algo, |
| | | iterations: 250000, |
| | | }, |
| | | cfg, |
| | | ); |
| | | } |
| | | |
| | | /** |
| | | * Computes the Password-Based Key Derivation Function 2. |
| | | * |
| | | * @param {WordArray|string} password The password. |
| | | * @param {WordArray|string} salt A salt. |
| | | * |
| | | * @return {WordArray} The derived key. |
| | | * |
| | | * @example |
| | | * |
| | | * const key = kdf.compute(password, salt); |
| | | */ |
| | | compute(password, salt) { |
| | | // Shortcut |
| | | const { cfg } = this; |
| | | |
| | | // Init HMAC |
| | | const hmac = HMAC.create(cfg.hasher, password); |
| | | |
| | | // Initial values |
| | | const derivedKey = WordArray.create(); |
| | | const blockIndex = WordArray.create([0x00000001]); |
| | | |
| | | // Shortcuts |
| | | const derivedKeyWords = derivedKey.words; |
| | | const blockIndexWords = blockIndex.words; |
| | | const { keySize, iterations } = cfg; |
| | | |
| | | // Generate key |
| | | while (derivedKeyWords.length < keySize) { |
| | | const block = hmac.update(salt).finalize(blockIndex); |
| | | hmac.reset(); |
| | | |
| | | // Shortcuts |
| | | const blockWords = block.words; |
| | | const blockWordsLength = blockWords.length; |
| | | |
| | | // Iterations |
| | | let intermediate = block; |
| | | for (let i = 1; i < iterations; i += 1) { |
| | | intermediate = hmac.finalize(intermediate); |
| | | hmac.reset(); |
| | | |
| | | // Shortcut |
| | | const intermediateWords = intermediate.words; |
| | | |
| | | // XOR intermediate with block |
| | | for (let j = 0; j < blockWordsLength; j += 1) { |
| | | blockWords[j] ^= intermediateWords[j]; |
| | | } |
| | | } |
| | | |
| | | derivedKey.concat(block); |
| | | blockIndexWords[0] += 1; |
| | | } |
| | | derivedKey.sigBytes = keySize * 4; |
| | | |
| | | return derivedKey; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Computes the Password-Based Key Derivation Function 2. |
| | | * |
| | | * @param {WordArray|string} password The password. |
| | | * @param {WordArray|string} salt A salt. |
| | | * @param {Object} cfg (Optional) The configuration options to use for this computation. |
| | | * |
| | | * @return {WordArray} The derived key. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var key = CryptoJS.PBKDF2(password, salt); |
| | | * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); |
| | | * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); |
| | | */ |
| | | export const PBKDF2 = (password, salt, cfg) => PBKDF2Algo.create(cfg).compute(password, salt); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | StreamCipher, |
| | | } from './cipher-core.js'; |
| | | |
| | | // Reusable objects |
| | | const S = []; |
| | | const C_ = []; |
| | | const G = []; |
| | | |
| | | function nextState() { |
| | | // Shortcuts |
| | | const X = this._X; |
| | | const C = this._C; |
| | | |
| | | // Save old counter values |
| | | for (let i = 0; i < 8; i += 1) { |
| | | C_[i] = C[i]; |
| | | } |
| | | |
| | | // Calculate new counter values |
| | | C[0] = (C[0] + 0x4d34d34d + this._b) | 0; |
| | | C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; |
| | | C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; |
| | | C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; |
| | | C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; |
| | | C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; |
| | | C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; |
| | | C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; |
| | | this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; |
| | | |
| | | // Calculate the g-values |
| | | for (let i = 0; i < 8; i += 1) { |
| | | const gx = X[i] + C[i]; |
| | | |
| | | // Construct high and low argument for squaring |
| | | const ga = gx & 0xffff; |
| | | const gb = gx >>> 16; |
| | | |
| | | // Calculate high and low result of squaring |
| | | const gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; |
| | | const gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); |
| | | |
| | | // High XOR low |
| | | G[i] = gh ^ gl; |
| | | } |
| | | |
| | | // Calculate new state values |
| | | X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; |
| | | X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; |
| | | X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; |
| | | X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; |
| | | X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; |
| | | X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; |
| | | X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; |
| | | X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; |
| | | } |
| | | |
| | | /** |
| | | * Rabbit stream cipher algorithm. |
| | | * |
| | | * This is a legacy version that neglected to convert the key to little-endian. |
| | | * This error doesn't affect the cipher's security, |
| | | * but it does affect its compatibility with other implementations. |
| | | */ |
| | | export class RabbitLegacyAlgo extends StreamCipher { |
| | | constructor(...args) { |
| | | super(...args); |
| | | |
| | | this.blockSize = 128 / 32; |
| | | this.ivSize = 64 / 32; |
| | | } |
| | | |
| | | _doReset() { |
| | | // Shortcuts |
| | | const K = this._key.words; |
| | | const { iv } = this.cfg; |
| | | |
| | | // Generate initial state values |
| | | this._X = [ |
| | | K[0], (K[3] << 16) | (K[2] >>> 16), |
| | | K[1], (K[0] << 16) | (K[3] >>> 16), |
| | | K[2], (K[1] << 16) | (K[0] >>> 16), |
| | | K[3], (K[2] << 16) | (K[1] >>> 16), |
| | | ]; |
| | | const X = this._X; |
| | | |
| | | // Generate initial counter values |
| | | this._C = [ |
| | | (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), |
| | | (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), |
| | | (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), |
| | | (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff), |
| | | ]; |
| | | const C = this._C; |
| | | |
| | | // Carry bit |
| | | this._b = 0; |
| | | |
| | | // Iterate the system four times |
| | | for (let i = 0; i < 4; i += 1) { |
| | | nextState.call(this); |
| | | } |
| | | |
| | | // Modify the counters |
| | | for (let i = 0; i < 8; i += 1) { |
| | | C[i] ^= X[(i + 4) & 7]; |
| | | } |
| | | |
| | | // IV setup |
| | | if (iv) { |
| | | // Shortcuts |
| | | const IV = iv.words; |
| | | const IV_0 = IV[0]; |
| | | const IV_1 = IV[1]; |
| | | |
| | | // Generate four subvectors |
| | | const i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) |
| | | | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); |
| | | const i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) |
| | | | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); |
| | | const i1 = (i0 >>> 16) | (i2 & 0xffff0000); |
| | | const i3 = (i2 << 16) | (i0 & 0x0000ffff); |
| | | |
| | | // Modify counter values |
| | | C[0] ^= i0; |
| | | C[1] ^= i1; |
| | | C[2] ^= i2; |
| | | C[3] ^= i3; |
| | | C[4] ^= i0; |
| | | C[5] ^= i1; |
| | | C[6] ^= i2; |
| | | C[7] ^= i3; |
| | | |
| | | // Iterate the system four times |
| | | for (let i = 0; i < 4; i += 1) { |
| | | nextState.call(this); |
| | | } |
| | | } |
| | | } |
| | | |
| | | _doProcessBlock(M, offset) { |
| | | const _M = M; |
| | | |
| | | // Shortcut |
| | | const X = this._X; |
| | | |
| | | // Iterate the system |
| | | nextState.call(this); |
| | | |
| | | // Generate four keystream words |
| | | S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); |
| | | S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); |
| | | S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); |
| | | S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); |
| | | |
| | | for (let i = 0; i < 4; i += 1) { |
| | | // Swap endian |
| | | S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
| | | | (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); |
| | | |
| | | // Encrypt |
| | | _M[offset + i] ^= S[i]; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Shortcut functions to the cipher's object interface. |
| | | * |
| | | * @example |
| | | * |
| | | * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); |
| | | * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); |
| | | */ |
| | | export const RabbitLegacy = StreamCipher._createHelper(RabbitLegacyAlgo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | StreamCipher, |
| | | } from './cipher-core.js'; |
| | | |
| | | // Reusable objects |
| | | const S = []; |
| | | const C_ = []; |
| | | const G = []; |
| | | |
| | | function nextState() { |
| | | // Shortcuts |
| | | const X = this._X; |
| | | const C = this._C; |
| | | |
| | | // Save old counter values |
| | | for (let i = 0; i < 8; i += 1) { |
| | | C_[i] = C[i]; |
| | | } |
| | | |
| | | // Calculate new counter values |
| | | C[0] = (C[0] + 0x4d34d34d + this._b) | 0; |
| | | C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; |
| | | C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; |
| | | C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; |
| | | C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; |
| | | C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; |
| | | C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; |
| | | C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; |
| | | this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; |
| | | |
| | | // Calculate the g-values |
| | | for (let i = 0; i < 8; i += 1) { |
| | | const gx = X[i] + C[i]; |
| | | |
| | | // Construct high and low argument for squaring |
| | | const ga = gx & 0xffff; |
| | | const gb = gx >>> 16; |
| | | |
| | | // Calculate high and low result of squaring |
| | | const gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; |
| | | const gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); |
| | | |
| | | // High XOR low |
| | | G[i] = gh ^ gl; |
| | | } |
| | | |
| | | // Calculate new state values |
| | | X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; |
| | | X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; |
| | | X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; |
| | | X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; |
| | | X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; |
| | | X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; |
| | | X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; |
| | | X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; |
| | | } |
| | | |
| | | /** |
| | | * Rabbit stream cipher algorithm |
| | | */ |
| | | export class RabbitAlgo extends StreamCipher { |
| | | constructor(...args) { |
| | | super(...args); |
| | | |
| | | this.blockSize = 128 / 32; |
| | | this.ivSize = 64 / 32; |
| | | } |
| | | |
| | | _doReset() { |
| | | // Shortcuts |
| | | const K = this._key.words; |
| | | const { iv } = this.cfg; |
| | | |
| | | // Swap endian |
| | | for (let i = 0; i < 4; i += 1) { |
| | | K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) |
| | | | (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); |
| | | } |
| | | |
| | | // Generate initial state values |
| | | this._X = [ |
| | | K[0], (K[3] << 16) | (K[2] >>> 16), |
| | | K[1], (K[0] << 16) | (K[3] >>> 16), |
| | | K[2], (K[1] << 16) | (K[0] >>> 16), |
| | | K[3], (K[2] << 16) | (K[1] >>> 16), |
| | | ]; |
| | | const X = this._X; |
| | | |
| | | // Generate initial counter values |
| | | this._C = [ |
| | | (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), |
| | | (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), |
| | | (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), |
| | | (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff), |
| | | ]; |
| | | const C = this._C; |
| | | |
| | | // Carry bit |
| | | this._b = 0; |
| | | |
| | | // Iterate the system four times |
| | | for (let i = 0; i < 4; i += 1) { |
| | | nextState.call(this); |
| | | } |
| | | |
| | | // Modify the counters |
| | | for (let i = 0; i < 8; i += 1) { |
| | | C[i] ^= X[(i + 4) & 7]; |
| | | } |
| | | |
| | | // IV setup |
| | | if (iv) { |
| | | // Shortcuts |
| | | const IV = iv.words; |
| | | const IV_0 = IV[0]; |
| | | const IV_1 = IV[1]; |
| | | |
| | | // Generate four subvectors |
| | | const i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) |
| | | | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); |
| | | const i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) |
| | | | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); |
| | | const i1 = (i0 >>> 16) | (i2 & 0xffff0000); |
| | | const i3 = (i2 << 16) | (i0 & 0x0000ffff); |
| | | |
| | | // Modify counter values |
| | | C[0] ^= i0; |
| | | C[1] ^= i1; |
| | | C[2] ^= i2; |
| | | C[3] ^= i3; |
| | | C[4] ^= i0; |
| | | C[5] ^= i1; |
| | | C[6] ^= i2; |
| | | C[7] ^= i3; |
| | | |
| | | // Iterate the system four times |
| | | for (let i = 0; i < 4; i += 1) { |
| | | nextState.call(this); |
| | | } |
| | | } |
| | | } |
| | | |
| | | _doProcessBlock(M, offset) { |
| | | const _M = M; |
| | | |
| | | // Shortcut |
| | | const X = this._X; |
| | | |
| | | // Iterate the system |
| | | nextState.call(this); |
| | | |
| | | // Generate four keystream words |
| | | S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); |
| | | S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); |
| | | S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); |
| | | S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); |
| | | |
| | | for (let i = 0; i < 4; i += 1) { |
| | | // Swap endian |
| | | S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
| | | | (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); |
| | | |
| | | // Encrypt |
| | | _M[offset + i] ^= S[i]; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Shortcut functions to the cipher's object interface. |
| | | * |
| | | * @example |
| | | * |
| | | * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); |
| | | * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); |
| | | */ |
| | | export const Rabbit = StreamCipher._createHelper(RabbitAlgo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | StreamCipher, |
| | | } from './cipher-core.js'; |
| | | |
| | | function generateKeystreamWord() { |
| | | // Shortcuts |
| | | const S = this._S; |
| | | let i = this._i; |
| | | let j = this._j; |
| | | |
| | | // Generate keystream word |
| | | let keystreamWord = 0; |
| | | for (let n = 0; n < 4; n += 1) { |
| | | i = (i + 1) % 256; |
| | | j = (j + S[i]) % 256; |
| | | |
| | | // Swap |
| | | const t = S[i]; |
| | | S[i] = S[j]; |
| | | S[j] = t; |
| | | |
| | | keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); |
| | | } |
| | | |
| | | // Update counters |
| | | this._i = i; |
| | | this._j = j; |
| | | |
| | | return keystreamWord; |
| | | } |
| | | |
| | | /** |
| | | * RC4 stream cipher algorithm. |
| | | */ |
| | | export class RC4Algo extends StreamCipher { |
| | | _doReset() { |
| | | // Shortcuts |
| | | const key = this._key; |
| | | const keyWords = key.words; |
| | | const keySigBytes = key.sigBytes; |
| | | |
| | | // Init sbox |
| | | this._S = []; |
| | | const S = this._S; |
| | | for (let i = 0; i < 256; i += 1) { |
| | | S[i] = i; |
| | | } |
| | | |
| | | // Key setup |
| | | for (let i = 0, j = 0; i < 256; i += 1) { |
| | | const keyByteIndex = i % keySigBytes; |
| | | const keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; |
| | | |
| | | j = (j + S[i] + keyByte) % 256; |
| | | |
| | | // Swap |
| | | const t = S[i]; |
| | | S[i] = S[j]; |
| | | S[j] = t; |
| | | } |
| | | |
| | | // Counters |
| | | this._j = 0; |
| | | this._i = this._j; |
| | | } |
| | | |
| | | _doProcessBlock(M, offset) { |
| | | const _M = M; |
| | | |
| | | _M[offset] ^= generateKeystreamWord.call(this); |
| | | } |
| | | } |
| | | RC4Algo.keySize = 256 / 32; |
| | | RC4Algo.ivSize = 0; |
| | | |
| | | /** |
| | | * Shortcut functions to the cipher's object interface. |
| | | * |
| | | * @example |
| | | * |
| | | * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); |
| | | * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); |
| | | */ |
| | | export const RC4 = StreamCipher._createHelper(RC4Algo); |
| | | |
| | | /** |
| | | * Modified RC4 stream cipher algorithm. |
| | | */ |
| | | export class RC4DropAlgo extends RC4Algo { |
| | | constructor(...args) { |
| | | super(...args); |
| | | |
| | | /** |
| | | * Configuration options. |
| | | * |
| | | * @property {number} drop The number of keystream words to drop. Default 192 |
| | | */ |
| | | Object.assign(this.cfg, { drop: 192 }); |
| | | } |
| | | |
| | | _doReset() { |
| | | super._doReset.call(this); |
| | | |
| | | // Drop |
| | | for (let i = this.cfg.drop; i > 0; i -= 1) { |
| | | generateKeystreamWord.call(this); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Shortcut functions to the cipher's object interface. |
| | | * |
| | | * @example |
| | | * |
| | | * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); |
| | | * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); |
| | | */ |
| | | export const RC4Drop = StreamCipher._createHelper(RC4DropAlgo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** @preserve |
| | | (c) 2012 by Cédric Mesnil. All rights reserved. |
| | | |
| | | Redistribution and use in source and binary forms, with or without modification, are permitted |
| | | provided that the following conditions are met: |
| | | |
| | | - Redistributions of source code must retain the above copyright notice, this list of |
| | | conditions and the following disclaimer. |
| | | - Redistributions in binary form must reproduce the above copyright notice, this list |
| | | of conditions and the following disclaimer in the documentation and/or other materials |
| | | provided with the distribution. |
| | | |
| | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS |
| | | OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY |
| | | AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
| | | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| | | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| | | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY |
| | | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| | | */ |
| | | |
| | | import { |
| | | WordArray, |
| | | Hasher, |
| | | } from './core.js'; |
| | | |
| | | // Constants table |
| | | const _zl = WordArray.create([ |
| | | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, |
| | | 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, |
| | | 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, |
| | | 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, |
| | | 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); |
| | | const _zr = WordArray.create([ |
| | | 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, |
| | | 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, |
| | | 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, |
| | | 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, |
| | | 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); |
| | | const _sl = WordArray.create([ |
| | | 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, |
| | | 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, |
| | | 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, |
| | | 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, |
| | | 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]); |
| | | const _sr = WordArray.create([ |
| | | 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, |
| | | 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, |
| | | 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, |
| | | 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, |
| | | 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]); |
| | | |
| | | const _hl = WordArray.create([0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); |
| | | const _hr = WordArray.create([0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); |
| | | |
| | | const f1 = (x, y, z) => (x) ^ (y) ^ (z); |
| | | |
| | | const f2 = (x, y, z) => ((x) & (y)) | ((~x) & (z)); |
| | | |
| | | const f3 = (x, y, z) => ((x) | (~(y))) ^ (z); |
| | | |
| | | const f4 = (x, y, z) => ((x) & (z)) | ((y) & (~(z))); |
| | | |
| | | const f5 = (x, y, z) => (x) ^ ((y) | (~(z))); |
| | | |
| | | const rotl = (x, n) => (x << n) | (x >>> (32 - n)); |
| | | |
| | | /** |
| | | * RIPEMD160 hash algorithm. |
| | | */ |
| | | export class RIPEMD160Algo extends Hasher { |
| | | _doReset() { |
| | | this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); |
| | | } |
| | | |
| | | _doProcessBlock(M, offset) { |
| | | const _M = M; |
| | | |
| | | // Swap endian |
| | | for (let i = 0; i < 16; i += 1) { |
| | | // Shortcuts |
| | | const offset_i = offset + i; |
| | | const M_offset_i = _M[offset_i]; |
| | | |
| | | // Swap |
| | | _M[offset_i] = ( |
| | | (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
| | | | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) |
| | | ); |
| | | } |
| | | // Shortcut |
| | | const H = this._hash.words; |
| | | const hl = _hl.words; |
| | | const hr = _hr.words; |
| | | const zl = _zl.words; |
| | | const zr = _zr.words; |
| | | const sl = _sl.words; |
| | | const sr = _sr.words; |
| | | |
| | | // Working variables |
| | | let al = H[0]; |
| | | let bl = H[1]; |
| | | let cl = H[2]; |
| | | let dl = H[3]; |
| | | let el = H[4]; |
| | | let ar = H[0]; |
| | | let br = H[1]; |
| | | let cr = H[2]; |
| | | let dr = H[3]; |
| | | let er = H[4]; |
| | | |
| | | // Computation |
| | | let t; |
| | | for (let i = 0; i < 80; i += 1) { |
| | | t = (al + _M[offset + zl[i]]) | 0; |
| | | if (i < 16) { |
| | | t += f1(bl, cl, dl) + hl[0]; |
| | | } else if (i < 32) { |
| | | t += f2(bl, cl, dl) + hl[1]; |
| | | } else if (i < 48) { |
| | | t += f3(bl, cl, dl) + hl[2]; |
| | | } else if (i < 64) { |
| | | t += f4(bl, cl, dl) + hl[3]; |
| | | } else { // if (i<80) { |
| | | t += f5(bl, cl, dl) + hl[4]; |
| | | } |
| | | t |= 0; |
| | | t = rotl(t, sl[i]); |
| | | t = (t + el) | 0; |
| | | al = el; |
| | | el = dl; |
| | | dl = rotl(cl, 10); |
| | | cl = bl; |
| | | bl = t; |
| | | |
| | | t = (ar + _M[offset + zr[i]]) | 0; |
| | | if (i < 16) { |
| | | t += f5(br, cr, dr) + hr[0]; |
| | | } else if (i < 32) { |
| | | t += f4(br, cr, dr) + hr[1]; |
| | | } else if (i < 48) { |
| | | t += f3(br, cr, dr) + hr[2]; |
| | | } else if (i < 64) { |
| | | t += f2(br, cr, dr) + hr[3]; |
| | | } else { // if (i<80) { |
| | | t += f1(br, cr, dr) + hr[4]; |
| | | } |
| | | t |= 0; |
| | | t = rotl(t, sr[i]); |
| | | t = (t + er) | 0; |
| | | ar = er; |
| | | er = dr; |
| | | dr = rotl(cr, 10); |
| | | cr = br; |
| | | br = t; |
| | | } |
| | | // Intermediate hash value |
| | | t = (H[1] + cl + dr) | 0; |
| | | H[1] = (H[2] + dl + er) | 0; |
| | | H[2] = (H[3] + el + ar) | 0; |
| | | H[3] = (H[4] + al + br) | 0; |
| | | H[4] = (H[0] + bl + cr) | 0; |
| | | H[0] = t; |
| | | } |
| | | |
| | | _doFinalize() { |
| | | // Shortcuts |
| | | const data = this._data; |
| | | const dataWords = data.words; |
| | | |
| | | const nBitsTotal = this._nDataBytes * 8; |
| | | const nBitsLeft = data.sigBytes * 8; |
| | | |
| | | // Add padding |
| | | dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32)); |
| | | dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( |
| | | (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) |
| | | | (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) |
| | | ); |
| | | data.sigBytes = (dataWords.length + 1) * 4; |
| | | |
| | | // Hash final blocks |
| | | this._process(); |
| | | |
| | | // Shortcuts |
| | | const hash = this._hash; |
| | | const H = hash.words; |
| | | |
| | | // Swap endian |
| | | for (let i = 0; i < 5; i += 1) { |
| | | // Shortcut |
| | | const H_i = H[i]; |
| | | |
| | | // Swap |
| | | H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
| | | | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); |
| | | } |
| | | |
| | | // Return final computed hash |
| | | return hash; |
| | | } |
| | | |
| | | clone() { |
| | | const clone = super.clone.call(this); |
| | | clone._hash = this._hash.clone(); |
| | | |
| | | return clone; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Shortcut function to the hasher's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * |
| | | * @return {WordArray} The hash. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hash = CryptoJS.RIPEMD160('message'); |
| | | * var hash = CryptoJS.RIPEMD160(wordArray); |
| | | */ |
| | | export const RIPEMD160 = Hasher._createHelper(RIPEMD160Algo); |
| | | |
| | | /** |
| | | * Shortcut function to the HMAC's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * @param {WordArray|string} key The secret key. |
| | | * |
| | | * @return {WordArray} The HMAC. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hmac = CryptoJS.HmacRIPEMD160(message, key); |
| | | */ |
| | | export const HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160Algo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | WordArray, |
| | | Hasher, |
| | | } from './core.js'; |
| | | |
| | | // Reusable object |
| | | const W = []; |
| | | |
| | | /** |
| | | * SHA-1 hash algorithm. |
| | | */ |
| | | export class SHA1Algo extends Hasher { |
| | | _doReset() { |
| | | this._hash = new WordArray([ |
| | | 0x67452301, |
| | | 0xefcdab89, |
| | | 0x98badcfe, |
| | | 0x10325476, |
| | | 0xc3d2e1f0, |
| | | ]); |
| | | } |
| | | |
| | | _doProcessBlock(M, offset) { |
| | | // Shortcut |
| | | const H = this._hash.words; |
| | | |
| | | // Working variables |
| | | let a = H[0]; |
| | | let b = H[1]; |
| | | let c = H[2]; |
| | | let d = H[3]; |
| | | let e = H[4]; |
| | | |
| | | // Computation |
| | | for (let i = 0; i < 80; i += 1) { |
| | | if (i < 16) { |
| | | W[i] = M[offset + i] | 0; |
| | | } else { |
| | | const n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; |
| | | W[i] = (n << 1) | (n >>> 31); |
| | | } |
| | | |
| | | let t = ((a << 5) | (a >>> 27)) + e + W[i]; |
| | | if (i < 20) { |
| | | t += ((b & c) | (~b & d)) + 0x5a827999; |
| | | } else if (i < 40) { |
| | | t += (b ^ c ^ d) + 0x6ed9eba1; |
| | | } else if (i < 60) { |
| | | t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; |
| | | } else /* if (i < 80) */ { |
| | | t += (b ^ c ^ d) - 0x359d3e2a; |
| | | } |
| | | |
| | | e = d; |
| | | d = c; |
| | | c = (b << 30) | (b >>> 2); |
| | | b = a; |
| | | a = t; |
| | | } |
| | | |
| | | // Intermediate hash value |
| | | H[0] = (H[0] + a) | 0; |
| | | H[1] = (H[1] + b) | 0; |
| | | H[2] = (H[2] + c) | 0; |
| | | H[3] = (H[3] + d) | 0; |
| | | H[4] = (H[4] + e) | 0; |
| | | } |
| | | |
| | | _doFinalize() { |
| | | // Shortcuts |
| | | const data = this._data; |
| | | const dataWords = data.words; |
| | | |
| | | const nBitsTotal = this._nDataBytes * 8; |
| | | const nBitsLeft = data.sigBytes * 8; |
| | | |
| | | // Add padding |
| | | dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32)); |
| | | dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); |
| | | dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; |
| | | data.sigBytes = dataWords.length * 4; |
| | | |
| | | // Hash final blocks |
| | | this._process(); |
| | | |
| | | // Return final computed hash |
| | | return this._hash; |
| | | } |
| | | |
| | | clone() { |
| | | const clone = super.clone.call(this); |
| | | clone._hash = this._hash.clone(); |
| | | |
| | | return clone; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Shortcut function to the hasher's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * |
| | | * @return {WordArray} The hash. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hash = CryptoJS.SHA1('message'); |
| | | * var hash = CryptoJS.SHA1(wordArray); |
| | | */ |
| | | export const SHA1 = Hasher._createHelper(SHA1Algo); |
| | | |
| | | /** |
| | | * Shortcut function to the HMAC's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * @param {WordArray|string} key The secret key. |
| | | * |
| | | * @return {WordArray} The HMAC. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hmac = CryptoJS.HmacSHA1(message, key); |
| | | */ |
| | | export const HmacSHA1 = Hasher._createHmacHelper(SHA1Algo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { WordArray } from './core.js'; |
| | | import { SHA256Algo } from './sha256.js'; |
| | | |
| | | /** |
| | | * SHA-224 hash algorithm. |
| | | */ |
| | | export class SHA224Algo extends SHA256Algo { |
| | | _doReset() { |
| | | this._hash = new WordArray([ |
| | | 0xc1059ed8, |
| | | 0x367cd507, |
| | | 0x3070dd17, |
| | | 0xf70e5939, |
| | | 0xffc00b31, |
| | | 0x68581511, |
| | | 0x64f98fa7, |
| | | 0xbefa4fa4, |
| | | ]); |
| | | } |
| | | |
| | | _doFinalize() { |
| | | const hash = super._doFinalize.call(this); |
| | | |
| | | hash.sigBytes -= 4; |
| | | |
| | | return hash; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Shortcut function to the hasher's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * |
| | | * @return {WordArray} The hash. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hash = CryptoJS.SHA224('message'); |
| | | * var hash = CryptoJS.SHA224(wordArray); |
| | | */ |
| | | export const SHA224 = SHA256Algo._createHelper(SHA224Algo); |
| | | |
| | | /** |
| | | * Shortcut function to the HMAC's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * @param {WordArray|string} key The secret key. |
| | | * |
| | | * @return {WordArray} The HMAC. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hmac = CryptoJS.HmacSHA224(message, key); |
| | | */ |
| | | export const HmacSHA224 = SHA256Algo._createHmacHelper(SHA224Algo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | WordArray, |
| | | Hasher, |
| | | } from './core.js'; |
| | | |
| | | // Initialization and round constants tables |
| | | const H = []; |
| | | const K = []; |
| | | |
| | | // Compute constants |
| | | const isPrime = (n) => { |
| | | const sqrtN = Math.sqrt(n); |
| | | for (let factor = 2; factor <= sqrtN; factor += 1) { |
| | | if (!(n % factor)) { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | }; |
| | | |
| | | const getFractionalBits = n => ((n - (n | 0)) * 0x100000000) | 0; |
| | | |
| | | let n = 2; |
| | | let nPrime = 0; |
| | | while (nPrime < 64) { |
| | | if (isPrime(n)) { |
| | | if (nPrime < 8) { |
| | | H[nPrime] = getFractionalBits(n ** (1 / 2)); |
| | | } |
| | | K[nPrime] = getFractionalBits(n ** (1 / 3)); |
| | | |
| | | nPrime += 1; |
| | | } |
| | | |
| | | n += 1; |
| | | } |
| | | |
| | | // Reusable object |
| | | const W = []; |
| | | |
| | | /** |
| | | * SHA-256 hash algorithm. |
| | | */ |
| | | export class SHA256Algo extends Hasher { |
| | | _doReset() { |
| | | this._hash = new WordArray(H.slice(0)); |
| | | } |
| | | |
| | | _doProcessBlock(M, offset) { |
| | | // Shortcut |
| | | const _H = this._hash.words; |
| | | |
| | | // Working variables |
| | | let a = _H[0]; |
| | | let b = _H[1]; |
| | | let c = _H[2]; |
| | | let d = _H[3]; |
| | | let e = _H[4]; |
| | | let f = _H[5]; |
| | | let g = _H[6]; |
| | | let h = _H[7]; |
| | | |
| | | // Computation |
| | | for (let i = 0; i < 64; i += 1) { |
| | | if (i < 16) { |
| | | W[i] = M[offset + i] | 0; |
| | | } else { |
| | | const gamma0x = W[i - 15]; |
| | | const gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) |
| | | ^ ((gamma0x << 14) | (gamma0x >>> 18)) |
| | | ^ (gamma0x >>> 3); |
| | | |
| | | const gamma1x = W[i - 2]; |
| | | const gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) |
| | | ^ ((gamma1x << 13) | (gamma1x >>> 19)) |
| | | ^ (gamma1x >>> 10); |
| | | |
| | | W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; |
| | | } |
| | | |
| | | const ch = (e & f) ^ (~e & g); |
| | | const maj = (a & b) ^ (a & c) ^ (b & c); |
| | | |
| | | const sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); |
| | | const sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); |
| | | |
| | | const t1 = h + sigma1 + ch + K[i] + W[i]; |
| | | const t2 = sigma0 + maj; |
| | | |
| | | h = g; |
| | | g = f; |
| | | f = e; |
| | | e = (d + t1) | 0; |
| | | d = c; |
| | | c = b; |
| | | b = a; |
| | | a = (t1 + t2) | 0; |
| | | } |
| | | |
| | | // Intermediate hash value |
| | | _H[0] = (_H[0] + a) | 0; |
| | | _H[1] = (_H[1] + b) | 0; |
| | | _H[2] = (_H[2] + c) | 0; |
| | | _H[3] = (_H[3] + d) | 0; |
| | | _H[4] = (_H[4] + e) | 0; |
| | | _H[5] = (_H[5] + f) | 0; |
| | | _H[6] = (_H[6] + g) | 0; |
| | | _H[7] = (_H[7] + h) | 0; |
| | | } |
| | | |
| | | _doFinalize() { |
| | | // Shortcuts |
| | | const data = this._data; |
| | | const dataWords = data.words; |
| | | |
| | | const nBitsTotal = this._nDataBytes * 8; |
| | | const nBitsLeft = data.sigBytes * 8; |
| | | |
| | | // Add padding |
| | | dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32)); |
| | | dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); |
| | | dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; |
| | | data.sigBytes = dataWords.length * 4; |
| | | |
| | | // Hash final blocks |
| | | this._process(); |
| | | |
| | | // Return final computed hash |
| | | return this._hash; |
| | | } |
| | | |
| | | clone() { |
| | | const clone = super.clone.call(this); |
| | | clone._hash = this._hash.clone(); |
| | | |
| | | return clone; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Shortcut function to the hasher's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * |
| | | * @return {WordArray} The hash. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hash = CryptoJS.SHA256('message'); |
| | | * var hash = CryptoJS.SHA256(wordArray); |
| | | */ |
| | | export const SHA256 = Hasher._createHelper(SHA256Algo); |
| | | |
| | | /** |
| | | * Shortcut function to the HMAC's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * @param {WordArray|string} key The secret key. |
| | | * |
| | | * @return {WordArray} The HMAC. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hmac = CryptoJS.HmacSHA256(message, key); |
| | | */ |
| | | export const HmacSHA256 = Hasher._createHmacHelper(SHA256Algo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | WordArray, |
| | | Hasher, |
| | | } from './core.js'; |
| | | import { X64Word } from './x64-core.js'; |
| | | |
| | | // Constants tables |
| | | const RHO_OFFSETS = []; |
| | | const PI_INDEXES = []; |
| | | const ROUND_CONSTANTS = []; |
| | | |
| | | // Compute Constants |
| | | // Compute rho offset constants |
| | | let _x = 1; |
| | | let _y = 0; |
| | | for (let t = 0; t < 24; t += 1) { |
| | | RHO_OFFSETS[_x + 5 * _y] = ((t + 1) * (t + 2) / 2) % 64; |
| | | |
| | | const newX = _y % 5; |
| | | const newY = (2 * _x + 3 * _y) % 5; |
| | | _x = newX; |
| | | _y = newY; |
| | | } |
| | | |
| | | // Compute pi index constants |
| | | for (let x = 0; x < 5; x += 1) { |
| | | for (let y = 0; y < 5; y += 1) { |
| | | PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; |
| | | } |
| | | } |
| | | |
| | | // Compute round constants |
| | | let LFSR = 0x01; |
| | | for (let i = 0; i < 24; i += 1) { |
| | | let roundConstantMsw = 0; |
| | | let roundConstantLsw = 0; |
| | | |
| | | for (let j = 0; j < 7; j += 1) { |
| | | if (LFSR & 0x01) { |
| | | const bitPosition = (1 << j) - 1; |
| | | if (bitPosition < 32) { |
| | | roundConstantLsw ^= 1 << bitPosition; |
| | | } else /* if (bitPosition >= 32) */ { |
| | | roundConstantMsw ^= 1 << (bitPosition - 32); |
| | | } |
| | | } |
| | | |
| | | // Compute next LFSR |
| | | if (LFSR & 0x80) { |
| | | // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 |
| | | LFSR = (LFSR << 1) ^ 0x71; |
| | | } else { |
| | | LFSR <<= 1; |
| | | } |
| | | } |
| | | |
| | | ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); |
| | | } |
| | | |
| | | // Reusable objects for temporary values |
| | | const T = []; |
| | | for (let i = 0; i < 25; i += 1) { |
| | | T[i] = X64Word.create(); |
| | | } |
| | | |
| | | /** |
| | | * SHA-3 hash algorithm. |
| | | */ |
| | | export class SHA3Algo extends Hasher { |
| | | constructor(cfg) { |
| | | /** |
| | | * Configuration options. |
| | | * |
| | | * @property {number} outputLength |
| | | * The desired number of bits in the output hash. |
| | | * Only values permitted are: 224, 256, 384, 512. |
| | | * Default: 512 |
| | | */ |
| | | super(Object.assign( |
| | | { outputLength: 512 }, |
| | | cfg, |
| | | )); |
| | | } |
| | | |
| | | _doReset() { |
| | | this._state = []; |
| | | const state = this._state; |
| | | for (let i = 0; i < 25; i += 1) { |
| | | state[i] = new X64Word(); |
| | | } |
| | | |
| | | this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; |
| | | } |
| | | |
| | | _doProcessBlock(M, offset) { |
| | | // Shortcuts |
| | | const state = this._state; |
| | | const nBlockSizeLanes = this.blockSize / 2; |
| | | |
| | | // Absorb |
| | | for (let i = 0; i < nBlockSizeLanes; i += 1) { |
| | | // Shortcuts |
| | | let M2i = M[offset + 2 * i]; |
| | | let M2i1 = M[offset + 2 * i + 1]; |
| | | |
| | | // Swap endian |
| | | M2i = (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |
| | | | (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00); |
| | | M2i1 = (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |
| | | | (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00); |
| | | |
| | | // Absorb message into state |
| | | const lane = state[i]; |
| | | lane.high ^= M2i1; |
| | | lane.low ^= M2i; |
| | | } |
| | | |
| | | // Rounds |
| | | for (let round = 0; round < 24; round += 1) { |
| | | // Theta |
| | | for (let x = 0; x < 5; x += 1) { |
| | | // Mix column lanes |
| | | let tMsw = 0; |
| | | let tLsw = 0; |
| | | for (let y = 0; y < 5; y += 1) { |
| | | const lane = state[x + 5 * y]; |
| | | tMsw ^= lane.high; |
| | | tLsw ^= lane.low; |
| | | } |
| | | |
| | | // Temporary values |
| | | const Tx = T[x]; |
| | | Tx.high = tMsw; |
| | | Tx.low = tLsw; |
| | | } |
| | | for (let x = 0; x < 5; x += 1) { |
| | | // Shortcuts |
| | | const Tx4 = T[(x + 4) % 5]; |
| | | const Tx1 = T[(x + 1) % 5]; |
| | | const Tx1Msw = Tx1.high; |
| | | const Tx1Lsw = Tx1.low; |
| | | |
| | | // Mix surrounding columns |
| | | const tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); |
| | | const tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); |
| | | for (let y = 0; y < 5; y += 1) { |
| | | const lane = state[x + 5 * y]; |
| | | lane.high ^= tMsw; |
| | | lane.low ^= tLsw; |
| | | } |
| | | } |
| | | |
| | | // Rho Pi |
| | | for (let laneIndex = 1; laneIndex < 25; laneIndex += 1) { |
| | | let tMsw; |
| | | let tLsw; |
| | | |
| | | // Shortcuts |
| | | const lane = state[laneIndex]; |
| | | const laneMsw = lane.high; |
| | | const laneLsw = lane.low; |
| | | const rhoOffset = RHO_OFFSETS[laneIndex]; |
| | | |
| | | // Rotate lanes |
| | | if (rhoOffset < 32) { |
| | | tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); |
| | | tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); |
| | | } else /* if (rhoOffset >= 32) */ { |
| | | tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); |
| | | tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); |
| | | } |
| | | |
| | | // Transpose lanes |
| | | const TPiLane = T[PI_INDEXES[laneIndex]]; |
| | | TPiLane.high = tMsw; |
| | | TPiLane.low = tLsw; |
| | | } |
| | | |
| | | // Rho pi at x = y = 0 |
| | | const T0 = T[0]; |
| | | const state0 = state[0]; |
| | | T0.high = state0.high; |
| | | T0.low = state0.low; |
| | | |
| | | // Chi |
| | | for (let x = 0; x < 5; x += 1) { |
| | | for (let y = 0; y < 5; y += 1) { |
| | | // Shortcuts |
| | | const laneIndex = x + 5 * y; |
| | | const lane = state[laneIndex]; |
| | | const TLane = T[laneIndex]; |
| | | const Tx1Lane = T[((x + 1) % 5) + 5 * y]; |
| | | const Tx2Lane = T[((x + 2) % 5) + 5 * y]; |
| | | |
| | | // Mix rows |
| | | lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); |
| | | lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); |
| | | } |
| | | } |
| | | |
| | | // Iota |
| | | const lane = state[0]; |
| | | const roundConstant = ROUND_CONSTANTS[round]; |
| | | lane.high ^= roundConstant.high; |
| | | lane.low ^= roundConstant.low; |
| | | } |
| | | } |
| | | |
| | | _doFinalize() { |
| | | // Shortcuts |
| | | const data = this._data; |
| | | const dataWords = data.words; |
| | | const nBitsLeft = data.sigBytes * 8; |
| | | const blockSizeBits = this.blockSize * 32; |
| | | |
| | | // Add padding |
| | | dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - (nBitsLeft % 32)); |
| | | dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; |
| | | data.sigBytes = dataWords.length * 4; |
| | | |
| | | // Hash final blocks |
| | | this._process(); |
| | | |
| | | // Shortcuts |
| | | const state = this._state; |
| | | const outputLengthBytes = this.cfg.outputLength / 8; |
| | | const outputLengthLanes = outputLengthBytes / 8; |
| | | |
| | | // Squeeze |
| | | const hashWords = []; |
| | | for (let i = 0; i < outputLengthLanes; i += 1) { |
| | | // Shortcuts |
| | | const lane = state[i]; |
| | | let laneMsw = lane.high; |
| | | let laneLsw = lane.low; |
| | | |
| | | // Swap endian |
| | | laneMsw = (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |
| | | | (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00); |
| | | laneLsw = (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |
| | | | (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00); |
| | | |
| | | // Squeeze state to retrieve hash |
| | | hashWords.push(laneLsw); |
| | | hashWords.push(laneMsw); |
| | | } |
| | | |
| | | // Return final computed hash |
| | | return new WordArray(hashWords, outputLengthBytes); |
| | | } |
| | | |
| | | clone() { |
| | | const clone = super.clone.call(this); |
| | | |
| | | clone._state = this._state.slice(0); |
| | | const state = clone._state; |
| | | for (let i = 0; i < 25; i += 1) { |
| | | state[i] = state[i].clone(); |
| | | } |
| | | |
| | | return clone; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Shortcut function to the hasher's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * |
| | | * @return {WordArray} The hash. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hash = CryptoJS.SHA3('message'); |
| | | * var hash = CryptoJS.SHA3(wordArray); |
| | | */ |
| | | export const SHA3 = Hasher._createHelper(SHA3Algo); |
| | | |
| | | /** |
| | | * Shortcut function to the HMAC's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * @param {WordArray|string} key The secret key. |
| | | * |
| | | * @return {WordArray} The HMAC. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hmac = CryptoJS.HmacSHA3(message, key); |
| | | */ |
| | | export const HmacSHA3 = Hasher._createHmacHelper(SHA3Algo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | X64Word, |
| | | X64WordArray, |
| | | } from './x64-core.js'; |
| | | import { SHA512Algo } from './sha512.js'; |
| | | |
| | | /** |
| | | * SHA-384 hash algorithm. |
| | | */ |
| | | export class SHA384Algo extends SHA512Algo { |
| | | _doReset() { |
| | | this._hash = new X64WordArray([ |
| | | new X64Word(0xcbbb9d5d, 0xc1059ed8), |
| | | new X64Word(0x629a292a, 0x367cd507), |
| | | new X64Word(0x9159015a, 0x3070dd17), |
| | | new X64Word(0x152fecd8, 0xf70e5939), |
| | | new X64Word(0x67332667, 0xffc00b31), |
| | | new X64Word(0x8eb44a87, 0x68581511), |
| | | new X64Word(0xdb0c2e0d, 0x64f98fa7), |
| | | new X64Word(0x47b5481d, 0xbefa4fa4), |
| | | ]); |
| | | } |
| | | |
| | | _doFinalize() { |
| | | const hash = super._doFinalize.call(this); |
| | | |
| | | hash.sigBytes -= 16; |
| | | |
| | | return hash; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Shortcut function to the hasher's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * |
| | | * @return {WordArray} The hash. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hash = CryptoJS.SHA384('message'); |
| | | * var hash = CryptoJS.SHA384(wordArray); |
| | | */ |
| | | export const SHA384 = SHA512Algo._createHelper(SHA384Algo); |
| | | |
| | | /** |
| | | * Shortcut function to the HMAC's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * @param {WordArray|string} key The secret key. |
| | | * |
| | | * @return {WordArray} The HMAC. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hmac = CryptoJS.HmacSHA384(message, key); |
| | | */ |
| | | export const HmacSHA384 = SHA512Algo._createHmacHelper(SHA384Algo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { Hasher } from './core.js'; |
| | | import { |
| | | X64Word, |
| | | X64WordArray, |
| | | } from './x64-core.js'; |
| | | |
| | | // Constants |
| | | const K = [ |
| | | new X64Word(0x428a2f98, 0xd728ae22), |
| | | new X64Word(0x71374491, 0x23ef65cd), |
| | | new X64Word(0xb5c0fbcf, 0xec4d3b2f), |
| | | new X64Word(0xe9b5dba5, 0x8189dbbc), |
| | | new X64Word(0x3956c25b, 0xf348b538), |
| | | new X64Word(0x59f111f1, 0xb605d019), |
| | | new X64Word(0x923f82a4, 0xaf194f9b), |
| | | new X64Word(0xab1c5ed5, 0xda6d8118), |
| | | new X64Word(0xd807aa98, 0xa3030242), |
| | | new X64Word(0x12835b01, 0x45706fbe), |
| | | new X64Word(0x243185be, 0x4ee4b28c), |
| | | new X64Word(0x550c7dc3, 0xd5ffb4e2), |
| | | new X64Word(0x72be5d74, 0xf27b896f), |
| | | new X64Word(0x80deb1fe, 0x3b1696b1), |
| | | new X64Word(0x9bdc06a7, 0x25c71235), |
| | | new X64Word(0xc19bf174, 0xcf692694), |
| | | new X64Word(0xe49b69c1, 0x9ef14ad2), |
| | | new X64Word(0xefbe4786, 0x384f25e3), |
| | | new X64Word(0x0fc19dc6, 0x8b8cd5b5), |
| | | new X64Word(0x240ca1cc, 0x77ac9c65), |
| | | new X64Word(0x2de92c6f, 0x592b0275), |
| | | new X64Word(0x4a7484aa, 0x6ea6e483), |
| | | new X64Word(0x5cb0a9dc, 0xbd41fbd4), |
| | | new X64Word(0x76f988da, 0x831153b5), |
| | | new X64Word(0x983e5152, 0xee66dfab), |
| | | new X64Word(0xa831c66d, 0x2db43210), |
| | | new X64Word(0xb00327c8, 0x98fb213f), |
| | | new X64Word(0xbf597fc7, 0xbeef0ee4), |
| | | new X64Word(0xc6e00bf3, 0x3da88fc2), |
| | | new X64Word(0xd5a79147, 0x930aa725), |
| | | new X64Word(0x06ca6351, 0xe003826f), |
| | | new X64Word(0x14292967, 0x0a0e6e70), |
| | | new X64Word(0x27b70a85, 0x46d22ffc), |
| | | new X64Word(0x2e1b2138, 0x5c26c926), |
| | | new X64Word(0x4d2c6dfc, 0x5ac42aed), |
| | | new X64Word(0x53380d13, 0x9d95b3df), |
| | | new X64Word(0x650a7354, 0x8baf63de), |
| | | new X64Word(0x766a0abb, 0x3c77b2a8), |
| | | new X64Word(0x81c2c92e, 0x47edaee6), |
| | | new X64Word(0x92722c85, 0x1482353b), |
| | | new X64Word(0xa2bfe8a1, 0x4cf10364), |
| | | new X64Word(0xa81a664b, 0xbc423001), |
| | | new X64Word(0xc24b8b70, 0xd0f89791), |
| | | new X64Word(0xc76c51a3, 0x0654be30), |
| | | new X64Word(0xd192e819, 0xd6ef5218), |
| | | new X64Word(0xd6990624, 0x5565a910), |
| | | new X64Word(0xf40e3585, 0x5771202a), |
| | | new X64Word(0x106aa070, 0x32bbd1b8), |
| | | new X64Word(0x19a4c116, 0xb8d2d0c8), |
| | | new X64Word(0x1e376c08, 0x5141ab53), |
| | | new X64Word(0x2748774c, 0xdf8eeb99), |
| | | new X64Word(0x34b0bcb5, 0xe19b48a8), |
| | | new X64Word(0x391c0cb3, 0xc5c95a63), |
| | | new X64Word(0x4ed8aa4a, 0xe3418acb), |
| | | new X64Word(0x5b9cca4f, 0x7763e373), |
| | | new X64Word(0x682e6ff3, 0xd6b2b8a3), |
| | | new X64Word(0x748f82ee, 0x5defb2fc), |
| | | new X64Word(0x78a5636f, 0x43172f60), |
| | | new X64Word(0x84c87814, 0xa1f0ab72), |
| | | new X64Word(0x8cc70208, 0x1a6439ec), |
| | | new X64Word(0x90befffa, 0x23631e28), |
| | | new X64Word(0xa4506ceb, 0xde82bde9), |
| | | new X64Word(0xbef9a3f7, 0xb2c67915), |
| | | new X64Word(0xc67178f2, 0xe372532b), |
| | | new X64Word(0xca273ece, 0xea26619c), |
| | | new X64Word(0xd186b8c7, 0x21c0c207), |
| | | new X64Word(0xeada7dd6, 0xcde0eb1e), |
| | | new X64Word(0xf57d4f7f, 0xee6ed178), |
| | | new X64Word(0x06f067aa, 0x72176fba), |
| | | new X64Word(0x0a637dc5, 0xa2c898a6), |
| | | new X64Word(0x113f9804, 0xbef90dae), |
| | | new X64Word(0x1b710b35, 0x131c471b), |
| | | new X64Word(0x28db77f5, 0x23047d84), |
| | | new X64Word(0x32caab7b, 0x40c72493), |
| | | new X64Word(0x3c9ebe0a, 0x15c9bebc), |
| | | new X64Word(0x431d67c4, 0x9c100d4c), |
| | | new X64Word(0x4cc5d4be, 0xcb3e42b6), |
| | | new X64Word(0x597f299c, 0xfc657e2a), |
| | | new X64Word(0x5fcb6fab, 0x3ad6faec), |
| | | new X64Word(0x6c44198c, 0x4a475817), |
| | | ]; |
| | | |
| | | // Reusable objects |
| | | const W = []; |
| | | for (let i = 0; i < 80; i += 1) { |
| | | W[i] = new X64Word(); |
| | | } |
| | | |
| | | /** |
| | | * SHA-512 hash algorithm. |
| | | */ |
| | | export class SHA512Algo extends Hasher { |
| | | constructor() { |
| | | super(); |
| | | |
| | | this.blockSize = 1024 / 32; |
| | | } |
| | | |
| | | _doReset() { |
| | | this._hash = new X64WordArray([ |
| | | new X64Word(0x6a09e667, 0xf3bcc908), |
| | | new X64Word(0xbb67ae85, 0x84caa73b), |
| | | new X64Word(0x3c6ef372, 0xfe94f82b), |
| | | new X64Word(0xa54ff53a, 0x5f1d36f1), |
| | | new X64Word(0x510e527f, 0xade682d1), |
| | | new X64Word(0x9b05688c, 0x2b3e6c1f), |
| | | new X64Word(0x1f83d9ab, 0xfb41bd6b), |
| | | new X64Word(0x5be0cd19, 0x137e2179), |
| | | ]); |
| | | } |
| | | |
| | | _doProcessBlock(M, offset) { |
| | | // Shortcuts |
| | | const H = this._hash.words; |
| | | |
| | | const H0 = H[0]; |
| | | const H1 = H[1]; |
| | | const H2 = H[2]; |
| | | const H3 = H[3]; |
| | | const H4 = H[4]; |
| | | const H5 = H[5]; |
| | | const H6 = H[6]; |
| | | const H7 = H[7]; |
| | | |
| | | const H0h = H0.high; |
| | | let H0l = H0.low; |
| | | const H1h = H1.high; |
| | | let H1l = H1.low; |
| | | const H2h = H2.high; |
| | | let H2l = H2.low; |
| | | const H3h = H3.high; |
| | | let H3l = H3.low; |
| | | const H4h = H4.high; |
| | | let H4l = H4.low; |
| | | const H5h = H5.high; |
| | | let H5l = H5.low; |
| | | const H6h = H6.high; |
| | | let H6l = H6.low; |
| | | const H7h = H7.high; |
| | | let H7l = H7.low; |
| | | |
| | | // Working variables |
| | | let ah = H0h; |
| | | let al = H0l; |
| | | let bh = H1h; |
| | | let bl = H1l; |
| | | let ch = H2h; |
| | | let cl = H2l; |
| | | let dh = H3h; |
| | | let dl = H3l; |
| | | let eh = H4h; |
| | | let el = H4l; |
| | | let fh = H5h; |
| | | let fl = H5l; |
| | | let gh = H6h; |
| | | let gl = H6l; |
| | | let hh = H7h; |
| | | let hl = H7l; |
| | | |
| | | // Rounds |
| | | for (let i = 0; i < 80; i += 1) { |
| | | let Wil; |
| | | let Wih; |
| | | |
| | | // Shortcut |
| | | const Wi = W[i]; |
| | | |
| | | // Extend message |
| | | if (i < 16) { |
| | | Wi.high = M[offset + i * 2] | 0; |
| | | Wih = Wi.high; |
| | | Wi.low = M[offset + i * 2 + 1] | 0; |
| | | Wil = Wi.low; |
| | | } else { |
| | | // Gamma0 |
| | | const gamma0x = W[i - 15]; |
| | | const gamma0xh = gamma0x.high; |
| | | const gamma0xl = gamma0x.low; |
| | | const gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) |
| | | ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) |
| | | ^ (gamma0xh >>> 7); |
| | | const gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) |
| | | ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) |
| | | ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); |
| | | |
| | | // Gamma1 |
| | | const gamma1x = W[i - 2]; |
| | | const gamma1xh = gamma1x.high; |
| | | const gamma1xl = gamma1x.low; |
| | | const gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) |
| | | ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) |
| | | ^ (gamma1xh >>> 6); |
| | | const gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) |
| | | ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) |
| | | ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); |
| | | |
| | | // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] |
| | | const Wi7 = W[i - 7]; |
| | | const Wi7h = Wi7.high; |
| | | const Wi7l = Wi7.low; |
| | | |
| | | const Wi16 = W[i - 16]; |
| | | const Wi16h = Wi16.high; |
| | | const Wi16l = Wi16.low; |
| | | |
| | | Wil = gamma0l + Wi7l; |
| | | Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); |
| | | Wil += gamma1l; |
| | | Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); |
| | | Wil += Wi16l; |
| | | Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); |
| | | |
| | | Wi.high = Wih; |
| | | Wi.low = Wil; |
| | | } |
| | | |
| | | const chh = (eh & fh) ^ (~eh & gh); |
| | | const chl = (el & fl) ^ (~el & gl); |
| | | const majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); |
| | | const majl = (al & bl) ^ (al & cl) ^ (bl & cl); |
| | | |
| | | const sigma0h = ((ah >>> 28) | (al << 4)) |
| | | ^ ((ah << 30) | (al >>> 2)) |
| | | ^ ((ah << 25) | (al >>> 7)); |
| | | const sigma0l = ((al >>> 28) | (ah << 4)) |
| | | ^ ((al << 30) | (ah >>> 2)) |
| | | ^ ((al << 25) | (ah >>> 7)); |
| | | const sigma1h = ((eh >>> 14) | (el << 18)) |
| | | ^ ((eh >>> 18) | (el << 14)) |
| | | ^ ((eh << 23) | (el >>> 9)); |
| | | const sigma1l = ((el >>> 14) | (eh << 18)) |
| | | ^ ((el >>> 18) | (eh << 14)) |
| | | ^ ((el << 23) | (eh >>> 9)); |
| | | |
| | | // t1 = h + sigma1 + ch + K[i] + W[i] |
| | | const Ki = K[i]; |
| | | const Kih = Ki.high; |
| | | const Kil = Ki.low; |
| | | |
| | | let t1l = hl + sigma1l; |
| | | let t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); |
| | | t1l += chl; |
| | | t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); |
| | | t1l += Kil; |
| | | t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); |
| | | t1l += Wil; |
| | | t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); |
| | | |
| | | // t2 = sigma0 + maj |
| | | const t2l = sigma0l + majl; |
| | | const t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); |
| | | |
| | | // Update working variables |
| | | hh = gh; |
| | | hl = gl; |
| | | gh = fh; |
| | | gl = fl; |
| | | fh = eh; |
| | | fl = el; |
| | | el = (dl + t1l) | 0; |
| | | eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; |
| | | dh = ch; |
| | | dl = cl; |
| | | ch = bh; |
| | | cl = bl; |
| | | bh = ah; |
| | | bl = al; |
| | | al = (t1l + t2l) | 0; |
| | | ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; |
| | | } |
| | | |
| | | // Intermediate hash value |
| | | H0.low = (H0l + al); |
| | | H0l = H0.low; |
| | | H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); |
| | | H1.low = (H1l + bl); |
| | | H1l = H1.low; |
| | | H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); |
| | | H2.low = (H2l + cl); |
| | | H2l = H2.low; |
| | | H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); |
| | | H3.low = (H3l + dl); |
| | | H3l = H3.low; |
| | | H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); |
| | | H4.low = (H4l + el); |
| | | H4l = H4.low; |
| | | H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); |
| | | H5.low = (H5l + fl); |
| | | H5l = H5.low; |
| | | H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); |
| | | H6.low = (H6l + gl); |
| | | H6l = H6.low; |
| | | H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); |
| | | H7.low = (H7l + hl); |
| | | H7l = H7.low; |
| | | H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); |
| | | } |
| | | |
| | | _doFinalize() { |
| | | // Shortcuts |
| | | const data = this._data; |
| | | const dataWords = data.words; |
| | | |
| | | const nBitsTotal = this._nDataBytes * 8; |
| | | const nBitsLeft = data.sigBytes * 8; |
| | | |
| | | // Add padding |
| | | dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32)); |
| | | dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); |
| | | dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; |
| | | data.sigBytes = dataWords.length * 4; |
| | | |
| | | // Hash final blocks |
| | | this._process(); |
| | | |
| | | // Convert hash to 32-bit word array before returning |
| | | const hash = this._hash.toX32(); |
| | | |
| | | // Return final computed hash |
| | | return hash; |
| | | } |
| | | |
| | | clone() { |
| | | const clone = super.clone.call(this); |
| | | clone._hash = this._hash.clone(); |
| | | |
| | | return clone; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Shortcut function to the hasher's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * |
| | | * @return {WordArray} The hash. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hash = CryptoJS.SHA512('message'); |
| | | * var hash = CryptoJS.SHA512(wordArray); |
| | | */ |
| | | export const SHA512 = Hasher._createHelper(SHA512Algo); |
| | | |
| | | /** |
| | | * Shortcut function to the HMAC's object interface. |
| | | * |
| | | * @param {WordArray|string} message The message to hash. |
| | | * @param {WordArray|string} key The secret key. |
| | | * |
| | | * @return {WordArray} The HMAC. |
| | | * |
| | | * @static |
| | | * |
| | | * @example |
| | | * |
| | | * var hmac = CryptoJS.HmacSHA512(message, key); |
| | | */ |
| | | export const HmacSHA512 = Hasher._createHmacHelper(SHA512Algo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | WordArray, |
| | | } from './core.js'; |
| | | import { |
| | | BlockCipher, |
| | | } from './cipher-core.js'; |
| | | |
| | | // Permuted Choice 1 constants |
| | | const PC1 = [ |
| | | 57, 49, 41, 33, 25, 17, 9, 1, |
| | | 58, 50, 42, 34, 26, 18, 10, 2, |
| | | 59, 51, 43, 35, 27, 19, 11, 3, |
| | | 60, 52, 44, 36, 63, 55, 47, 39, |
| | | 31, 23, 15, 7, 62, 54, 46, 38, |
| | | 30, 22, 14, 6, 61, 53, 45, 37, |
| | | 29, 21, 13, 5, 28, 20, 12, 4, |
| | | ]; |
| | | |
| | | // Permuted Choice 2 constants |
| | | const PC2 = [ |
| | | 14, 17, 11, 24, 1, 5, |
| | | 3, 28, 15, 6, 21, 10, |
| | | 23, 19, 12, 4, 26, 8, |
| | | 16, 7, 27, 20, 13, 2, |
| | | 41, 52, 31, 37, 47, 55, |
| | | 30, 40, 51, 45, 33, 48, |
| | | 44, 49, 39, 56, 34, 53, |
| | | 46, 42, 50, 36, 29, 32, |
| | | ]; |
| | | |
| | | // Cumulative bit shift constants |
| | | const BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; |
| | | |
| | | // SBOXes and round permutation constants |
| | | const SBOX_P = [ |
| | | { |
| | | 0x0: 0x808200, |
| | | 0x10000000: 0x8000, |
| | | 0x20000000: 0x808002, |
| | | 0x30000000: 0x2, |
| | | 0x40000000: 0x200, |
| | | 0x50000000: 0x808202, |
| | | 0x60000000: 0x800202, |
| | | 0x70000000: 0x800000, |
| | | 0x80000000: 0x202, |
| | | 0x90000000: 0x800200, |
| | | 0xa0000000: 0x8200, |
| | | 0xb0000000: 0x808000, |
| | | 0xc0000000: 0x8002, |
| | | 0xd0000000: 0x800002, |
| | | 0xe0000000: 0x0, |
| | | 0xf0000000: 0x8202, |
| | | 0x8000000: 0x0, |
| | | 0x18000000: 0x808202, |
| | | 0x28000000: 0x8202, |
| | | 0x38000000: 0x8000, |
| | | 0x48000000: 0x808200, |
| | | 0x58000000: 0x200, |
| | | 0x68000000: 0x808002, |
| | | 0x78000000: 0x2, |
| | | 0x88000000: 0x800200, |
| | | 0x98000000: 0x8200, |
| | | 0xa8000000: 0x808000, |
| | | 0xb8000000: 0x800202, |
| | | 0xc8000000: 0x800002, |
| | | 0xd8000000: 0x8002, |
| | | 0xe8000000: 0x202, |
| | | 0xf8000000: 0x800000, |
| | | 0x1: 0x8000, |
| | | 0x10000001: 0x2, |
| | | 0x20000001: 0x808200, |
| | | 0x30000001: 0x800000, |
| | | 0x40000001: 0x808002, |
| | | 0x50000001: 0x8200, |
| | | 0x60000001: 0x200, |
| | | 0x70000001: 0x800202, |
| | | 0x80000001: 0x808202, |
| | | 0x90000001: 0x808000, |
| | | 0xa0000001: 0x800002, |
| | | 0xb0000001: 0x8202, |
| | | 0xc0000001: 0x202, |
| | | 0xd0000001: 0x800200, |
| | | 0xe0000001: 0x8002, |
| | | 0xf0000001: 0x0, |
| | | 0x8000001: 0x808202, |
| | | 0x18000001: 0x808000, |
| | | 0x28000001: 0x800000, |
| | | 0x38000001: 0x200, |
| | | 0x48000001: 0x8000, |
| | | 0x58000001: 0x800002, |
| | | 0x68000001: 0x2, |
| | | 0x78000001: 0x8202, |
| | | 0x88000001: 0x8002, |
| | | 0x98000001: 0x800202, |
| | | 0xa8000001: 0x202, |
| | | 0xb8000001: 0x808200, |
| | | 0xc8000001: 0x800200, |
| | | 0xd8000001: 0x0, |
| | | 0xe8000001: 0x8200, |
| | | 0xf8000001: 0x808002, |
| | | }, |
| | | { |
| | | 0x0: 0x40084010, |
| | | 0x1000000: 0x4000, |
| | | 0x2000000: 0x80000, |
| | | 0x3000000: 0x40080010, |
| | | 0x4000000: 0x40000010, |
| | | 0x5000000: 0x40084000, |
| | | 0x6000000: 0x40004000, |
| | | 0x7000000: 0x10, |
| | | 0x8000000: 0x84000, |
| | | 0x9000000: 0x40004010, |
| | | 0xa000000: 0x40000000, |
| | | 0xb000000: 0x84010, |
| | | 0xc000000: 0x80010, |
| | | 0xd000000: 0x0, |
| | | 0xe000000: 0x4010, |
| | | 0xf000000: 0x40080000, |
| | | 0x800000: 0x40004000, |
| | | 0x1800000: 0x84010, |
| | | 0x2800000: 0x10, |
| | | 0x3800000: 0x40004010, |
| | | 0x4800000: 0x40084010, |
| | | 0x5800000: 0x40000000, |
| | | 0x6800000: 0x80000, |
| | | 0x7800000: 0x40080010, |
| | | 0x8800000: 0x80010, |
| | | 0x9800000: 0x0, |
| | | 0xa800000: 0x4000, |
| | | 0xb800000: 0x40080000, |
| | | 0xc800000: 0x40000010, |
| | | 0xd800000: 0x84000, |
| | | 0xe800000: 0x40084000, |
| | | 0xf800000: 0x4010, |
| | | 0x10000000: 0x0, |
| | | 0x11000000: 0x40080010, |
| | | 0x12000000: 0x40004010, |
| | | 0x13000000: 0x40084000, |
| | | 0x14000000: 0x40080000, |
| | | 0x15000000: 0x10, |
| | | 0x16000000: 0x84010, |
| | | 0x17000000: 0x4000, |
| | | 0x18000000: 0x4010, |
| | | 0x19000000: 0x80000, |
| | | 0x1a000000: 0x80010, |
| | | 0x1b000000: 0x40000010, |
| | | 0x1c000000: 0x84000, |
| | | 0x1d000000: 0x40004000, |
| | | 0x1e000000: 0x40000000, |
| | | 0x1f000000: 0x40084010, |
| | | 0x10800000: 0x84010, |
| | | 0x11800000: 0x80000, |
| | | 0x12800000: 0x40080000, |
| | | 0x13800000: 0x4000, |
| | | 0x14800000: 0x40004000, |
| | | 0x15800000: 0x40084010, |
| | | 0x16800000: 0x10, |
| | | 0x17800000: 0x40000000, |
| | | 0x18800000: 0x40084000, |
| | | 0x19800000: 0x40000010, |
| | | 0x1a800000: 0x40004010, |
| | | 0x1b800000: 0x80010, |
| | | 0x1c800000: 0x0, |
| | | 0x1d800000: 0x4010, |
| | | 0x1e800000: 0x40080010, |
| | | 0x1f800000: 0x84000, |
| | | }, |
| | | { |
| | | 0x0: 0x104, |
| | | 0x100000: 0x0, |
| | | 0x200000: 0x4000100, |
| | | 0x300000: 0x10104, |
| | | 0x400000: 0x10004, |
| | | 0x500000: 0x4000004, |
| | | 0x600000: 0x4010104, |
| | | 0x700000: 0x4010000, |
| | | 0x800000: 0x4000000, |
| | | 0x900000: 0x4010100, |
| | | 0xa00000: 0x10100, |
| | | 0xb00000: 0x4010004, |
| | | 0xc00000: 0x4000104, |
| | | 0xd00000: 0x10000, |
| | | 0xe00000: 0x4, |
| | | 0xf00000: 0x100, |
| | | 0x80000: 0x4010100, |
| | | 0x180000: 0x4010004, |
| | | 0x280000: 0x0, |
| | | 0x380000: 0x4000100, |
| | | 0x480000: 0x4000004, |
| | | 0x580000: 0x10000, |
| | | 0x680000: 0x10004, |
| | | 0x780000: 0x104, |
| | | 0x880000: 0x4, |
| | | 0x980000: 0x100, |
| | | 0xa80000: 0x4010000, |
| | | 0xb80000: 0x10104, |
| | | 0xc80000: 0x10100, |
| | | 0xd80000: 0x4000104, |
| | | 0xe80000: 0x4010104, |
| | | 0xf80000: 0x4000000, |
| | | 0x1000000: 0x4010100, |
| | | 0x1100000: 0x10004, |
| | | 0x1200000: 0x10000, |
| | | 0x1300000: 0x4000100, |
| | | 0x1400000: 0x100, |
| | | 0x1500000: 0x4010104, |
| | | 0x1600000: 0x4000004, |
| | | 0x1700000: 0x0, |
| | | 0x1800000: 0x4000104, |
| | | 0x1900000: 0x4000000, |
| | | 0x1a00000: 0x4, |
| | | 0x1b00000: 0x10100, |
| | | 0x1c00000: 0x4010000, |
| | | 0x1d00000: 0x104, |
| | | 0x1e00000: 0x10104, |
| | | 0x1f00000: 0x4010004, |
| | | 0x1080000: 0x4000000, |
| | | 0x1180000: 0x104, |
| | | 0x1280000: 0x4010100, |
| | | 0x1380000: 0x0, |
| | | 0x1480000: 0x10004, |
| | | 0x1580000: 0x4000100, |
| | | 0x1680000: 0x100, |
| | | 0x1780000: 0x4010004, |
| | | 0x1880000: 0x10000, |
| | | 0x1980000: 0x4010104, |
| | | 0x1a80000: 0x10104, |
| | | 0x1b80000: 0x4000004, |
| | | 0x1c80000: 0x4000104, |
| | | 0x1d80000: 0x4010000, |
| | | 0x1e80000: 0x4, |
| | | 0x1f80000: 0x10100, |
| | | }, |
| | | { |
| | | 0x0: 0x80401000, |
| | | 0x10000: 0x80001040, |
| | | 0x20000: 0x401040, |
| | | 0x30000: 0x80400000, |
| | | 0x40000: 0x0, |
| | | 0x50000: 0x401000, |
| | | 0x60000: 0x80000040, |
| | | 0x70000: 0x400040, |
| | | 0x80000: 0x80000000, |
| | | 0x90000: 0x400000, |
| | | 0xa0000: 0x40, |
| | | 0xb0000: 0x80001000, |
| | | 0xc0000: 0x80400040, |
| | | 0xd0000: 0x1040, |
| | | 0xe0000: 0x1000, |
| | | 0xf0000: 0x80401040, |
| | | 0x8000: 0x80001040, |
| | | 0x18000: 0x40, |
| | | 0x28000: 0x80400040, |
| | | 0x38000: 0x80001000, |
| | | 0x48000: 0x401000, |
| | | 0x58000: 0x80401040, |
| | | 0x68000: 0x0, |
| | | 0x78000: 0x80400000, |
| | | 0x88000: 0x1000, |
| | | 0x98000: 0x80401000, |
| | | 0xa8000: 0x400000, |
| | | 0xb8000: 0x1040, |
| | | 0xc8000: 0x80000000, |
| | | 0xd8000: 0x400040, |
| | | 0xe8000: 0x401040, |
| | | 0xf8000: 0x80000040, |
| | | 0x100000: 0x400040, |
| | | 0x110000: 0x401000, |
| | | 0x120000: 0x80000040, |
| | | 0x130000: 0x0, |
| | | 0x140000: 0x1040, |
| | | 0x150000: 0x80400040, |
| | | 0x160000: 0x80401000, |
| | | 0x170000: 0x80001040, |
| | | 0x180000: 0x80401040, |
| | | 0x190000: 0x80000000, |
| | | 0x1a0000: 0x80400000, |
| | | 0x1b0000: 0x401040, |
| | | 0x1c0000: 0x80001000, |
| | | 0x1d0000: 0x400000, |
| | | 0x1e0000: 0x40, |
| | | 0x1f0000: 0x1000, |
| | | 0x108000: 0x80400000, |
| | | 0x118000: 0x80401040, |
| | | 0x128000: 0x0, |
| | | 0x138000: 0x401000, |
| | | 0x148000: 0x400040, |
| | | 0x158000: 0x80000000, |
| | | 0x168000: 0x80001040, |
| | | 0x178000: 0x40, |
| | | 0x188000: 0x80000040, |
| | | 0x198000: 0x1000, |
| | | 0x1a8000: 0x80001000, |
| | | 0x1b8000: 0x80400040, |
| | | 0x1c8000: 0x1040, |
| | | 0x1d8000: 0x80401000, |
| | | 0x1e8000: 0x400000, |
| | | 0x1f8000: 0x401040, |
| | | }, |
| | | { |
| | | 0x0: 0x80, |
| | | 0x1000: 0x1040000, |
| | | 0x2000: 0x40000, |
| | | 0x3000: 0x20000000, |
| | | 0x4000: 0x20040080, |
| | | 0x5000: 0x1000080, |
| | | 0x6000: 0x21000080, |
| | | 0x7000: 0x40080, |
| | | 0x8000: 0x1000000, |
| | | 0x9000: 0x20040000, |
| | | 0xa000: 0x20000080, |
| | | 0xb000: 0x21040080, |
| | | 0xc000: 0x21040000, |
| | | 0xd000: 0x0, |
| | | 0xe000: 0x1040080, |
| | | 0xf000: 0x21000000, |
| | | 0x800: 0x1040080, |
| | | 0x1800: 0x21000080, |
| | | 0x2800: 0x80, |
| | | 0x3800: 0x1040000, |
| | | 0x4800: 0x40000, |
| | | 0x5800: 0x20040080, |
| | | 0x6800: 0x21040000, |
| | | 0x7800: 0x20000000, |
| | | 0x8800: 0x20040000, |
| | | 0x9800: 0x0, |
| | | 0xa800: 0x21040080, |
| | | 0xb800: 0x1000080, |
| | | 0xc800: 0x20000080, |
| | | 0xd800: 0x21000000, |
| | | 0xe800: 0x1000000, |
| | | 0xf800: 0x40080, |
| | | 0x10000: 0x40000, |
| | | 0x11000: 0x80, |
| | | 0x12000: 0x20000000, |
| | | 0x13000: 0x21000080, |
| | | 0x14000: 0x1000080, |
| | | 0x15000: 0x21040000, |
| | | 0x16000: 0x20040080, |
| | | 0x17000: 0x1000000, |
| | | 0x18000: 0x21040080, |
| | | 0x19000: 0x21000000, |
| | | 0x1a000: 0x1040000, |
| | | 0x1b000: 0x20040000, |
| | | 0x1c000: 0x40080, |
| | | 0x1d000: 0x20000080, |
| | | 0x1e000: 0x0, |
| | | 0x1f000: 0x1040080, |
| | | 0x10800: 0x21000080, |
| | | 0x11800: 0x1000000, |
| | | 0x12800: 0x1040000, |
| | | 0x13800: 0x20040080, |
| | | 0x14800: 0x20000000, |
| | | 0x15800: 0x1040080, |
| | | 0x16800: 0x80, |
| | | 0x17800: 0x21040000, |
| | | 0x18800: 0x40080, |
| | | 0x19800: 0x21040080, |
| | | 0x1a800: 0x0, |
| | | 0x1b800: 0x21000000, |
| | | 0x1c800: 0x1000080, |
| | | 0x1d800: 0x40000, |
| | | 0x1e800: 0x20040000, |
| | | 0x1f800: 0x20000080, |
| | | }, |
| | | { |
| | | 0x0: 0x10000008, |
| | | 0x100: 0x2000, |
| | | 0x200: 0x10200000, |
| | | 0x300: 0x10202008, |
| | | 0x400: 0x10002000, |
| | | 0x500: 0x200000, |
| | | 0x600: 0x200008, |
| | | 0x700: 0x10000000, |
| | | 0x800: 0x0, |
| | | 0x900: 0x10002008, |
| | | 0xa00: 0x202000, |
| | | 0xb00: 0x8, |
| | | 0xc00: 0x10200008, |
| | | 0xd00: 0x202008, |
| | | 0xe00: 0x2008, |
| | | 0xf00: 0x10202000, |
| | | 0x80: 0x10200000, |
| | | 0x180: 0x10202008, |
| | | 0x280: 0x8, |
| | | 0x380: 0x200000, |
| | | 0x480: 0x202008, |
| | | 0x580: 0x10000008, |
| | | 0x680: 0x10002000, |
| | | 0x780: 0x2008, |
| | | 0x880: 0x200008, |
| | | 0x980: 0x2000, |
| | | 0xa80: 0x10002008, |
| | | 0xb80: 0x10200008, |
| | | 0xc80: 0x0, |
| | | 0xd80: 0x10202000, |
| | | 0xe80: 0x202000, |
| | | 0xf80: 0x10000000, |
| | | 0x1000: 0x10002000, |
| | | 0x1100: 0x10200008, |
| | | 0x1200: 0x10202008, |
| | | 0x1300: 0x2008, |
| | | 0x1400: 0x200000, |
| | | 0x1500: 0x10000000, |
| | | 0x1600: 0x10000008, |
| | | 0x1700: 0x202000, |
| | | 0x1800: 0x202008, |
| | | 0x1900: 0x0, |
| | | 0x1a00: 0x8, |
| | | 0x1b00: 0x10200000, |
| | | 0x1c00: 0x2000, |
| | | 0x1d00: 0x10002008, |
| | | 0x1e00: 0x10202000, |
| | | 0x1f00: 0x200008, |
| | | 0x1080: 0x8, |
| | | 0x1180: 0x202000, |
| | | 0x1280: 0x200000, |
| | | 0x1380: 0x10000008, |
| | | 0x1480: 0x10002000, |
| | | 0x1580: 0x2008, |
| | | 0x1680: 0x10202008, |
| | | 0x1780: 0x10200000, |
| | | 0x1880: 0x10202000, |
| | | 0x1980: 0x10200008, |
| | | 0x1a80: 0x2000, |
| | | 0x1b80: 0x202008, |
| | | 0x1c80: 0x200008, |
| | | 0x1d80: 0x0, |
| | | 0x1e80: 0x10000000, |
| | | 0x1f80: 0x10002008, |
| | | }, |
| | | { |
| | | 0x0: 0x100000, |
| | | 0x10: 0x2000401, |
| | | 0x20: 0x400, |
| | | 0x30: 0x100401, |
| | | 0x40: 0x2100401, |
| | | 0x50: 0x0, |
| | | 0x60: 0x1, |
| | | 0x70: 0x2100001, |
| | | 0x80: 0x2000400, |
| | | 0x90: 0x100001, |
| | | 0xa0: 0x2000001, |
| | | 0xb0: 0x2100400, |
| | | 0xc0: 0x2100000, |
| | | 0xd0: 0x401, |
| | | 0xe0: 0x100400, |
| | | 0xf0: 0x2000000, |
| | | 0x8: 0x2100001, |
| | | 0x18: 0x0, |
| | | 0x28: 0x2000401, |
| | | 0x38: 0x2100400, |
| | | 0x48: 0x100000, |
| | | 0x58: 0x2000001, |
| | | 0x68: 0x2000000, |
| | | 0x78: 0x401, |
| | | 0x88: 0x100401, |
| | | 0x98: 0x2000400, |
| | | 0xa8: 0x2100000, |
| | | 0xb8: 0x100001, |
| | | 0xc8: 0x400, |
| | | 0xd8: 0x2100401, |
| | | 0xe8: 0x1, |
| | | 0xf8: 0x100400, |
| | | 0x100: 0x2000000, |
| | | 0x110: 0x100000, |
| | | 0x120: 0x2000401, |
| | | 0x130: 0x2100001, |
| | | 0x140: 0x100001, |
| | | 0x150: 0x2000400, |
| | | 0x160: 0x2100400, |
| | | 0x170: 0x100401, |
| | | 0x180: 0x401, |
| | | 0x190: 0x2100401, |
| | | 0x1a0: 0x100400, |
| | | 0x1b0: 0x1, |
| | | 0x1c0: 0x0, |
| | | 0x1d0: 0x2100000, |
| | | 0x1e0: 0x2000001, |
| | | 0x1f0: 0x400, |
| | | 0x108: 0x100400, |
| | | 0x118: 0x2000401, |
| | | 0x128: 0x2100001, |
| | | 0x138: 0x1, |
| | | 0x148: 0x2000000, |
| | | 0x158: 0x100000, |
| | | 0x168: 0x401, |
| | | 0x178: 0x2100400, |
| | | 0x188: 0x2000001, |
| | | 0x198: 0x2100000, |
| | | 0x1a8: 0x0, |
| | | 0x1b8: 0x2100401, |
| | | 0x1c8: 0x100401, |
| | | 0x1d8: 0x400, |
| | | 0x1e8: 0x2000400, |
| | | 0x1f8: 0x100001, |
| | | }, |
| | | { |
| | | 0x0: 0x8000820, |
| | | 0x1: 0x20000, |
| | | 0x2: 0x8000000, |
| | | 0x3: 0x20, |
| | | 0x4: 0x20020, |
| | | 0x5: 0x8020820, |
| | | 0x6: 0x8020800, |
| | | 0x7: 0x800, |
| | | 0x8: 0x8020000, |
| | | 0x9: 0x8000800, |
| | | 0xa: 0x20800, |
| | | 0xb: 0x8020020, |
| | | 0xc: 0x820, |
| | | 0xd: 0x0, |
| | | 0xe: 0x8000020, |
| | | 0xf: 0x20820, |
| | | 0x80000000: 0x800, |
| | | 0x80000001: 0x8020820, |
| | | 0x80000002: 0x8000820, |
| | | 0x80000003: 0x8000000, |
| | | 0x80000004: 0x8020000, |
| | | 0x80000005: 0x20800, |
| | | 0x80000006: 0x20820, |
| | | 0x80000007: 0x20, |
| | | 0x80000008: 0x8000020, |
| | | 0x80000009: 0x820, |
| | | 0x8000000a: 0x20020, |
| | | 0x8000000b: 0x8020800, |
| | | 0x8000000c: 0x0, |
| | | 0x8000000d: 0x8020020, |
| | | 0x8000000e: 0x8000800, |
| | | 0x8000000f: 0x20000, |
| | | 0x10: 0x20820, |
| | | 0x11: 0x8020800, |
| | | 0x12: 0x20, |
| | | 0x13: 0x800, |
| | | 0x14: 0x8000800, |
| | | 0x15: 0x8000020, |
| | | 0x16: 0x8020020, |
| | | 0x17: 0x20000, |
| | | 0x18: 0x0, |
| | | 0x19: 0x20020, |
| | | 0x1a: 0x8020000, |
| | | 0x1b: 0x8000820, |
| | | 0x1c: 0x8020820, |
| | | 0x1d: 0x20800, |
| | | 0x1e: 0x820, |
| | | 0x1f: 0x8000000, |
| | | 0x80000010: 0x20000, |
| | | 0x80000011: 0x800, |
| | | 0x80000012: 0x8020020, |
| | | 0x80000013: 0x20820, |
| | | 0x80000014: 0x20, |
| | | 0x80000015: 0x8020000, |
| | | 0x80000016: 0x8000000, |
| | | 0x80000017: 0x8000820, |
| | | 0x80000018: 0x8020820, |
| | | 0x80000019: 0x8000020, |
| | | 0x8000001a: 0x8000800, |
| | | 0x8000001b: 0x0, |
| | | 0x8000001c: 0x20800, |
| | | 0x8000001d: 0x820, |
| | | 0x8000001e: 0x20020, |
| | | 0x8000001f: 0x8020800, |
| | | }, |
| | | ]; |
| | | |
| | | // Masks that select the SBOX input |
| | | const SBOX_MASK = [ |
| | | 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, |
| | | 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f, |
| | | ]; |
| | | |
| | | // Swap bits across the left and right words |
| | | function exchangeLR(offset, mask) { |
| | | const t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; |
| | | this._rBlock ^= t; |
| | | this._lBlock ^= t << offset; |
| | | } |
| | | |
| | | function exchangeRL(offset, mask) { |
| | | const t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; |
| | | this._lBlock ^= t; |
| | | this._rBlock ^= t << offset; |
| | | } |
| | | |
| | | /** |
| | | * DES block cipher algorithm. |
| | | */ |
| | | export class DESAlgo extends BlockCipher { |
| | | constructor(xformMode, key, cfg) { |
| | | super(xformMode, key, cfg); |
| | | |
| | | // blickSize is an instance field and should set in constructor. |
| | | // Both DESAlgo and TripleDESAlgo. |
| | | this.blockSize = 64 / 32; |
| | | } |
| | | |
| | | _doReset() { |
| | | // Shortcuts |
| | | const key = this._key; |
| | | const keyWords = key.words; |
| | | |
| | | // Select 56 bits according to PC1 |
| | | const keyBits = []; |
| | | for (let i = 0; i < 56; i += 1) { |
| | | const keyBitPos = PC1[i] - 1; |
| | | keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - (keyBitPos % 32))) & 1; |
| | | } |
| | | |
| | | // Assemble 16 subkeys |
| | | this._subKeys = []; |
| | | const subKeys = this._subKeys; |
| | | for (let nSubKey = 0; nSubKey < 16; nSubKey += 1) { |
| | | // Create subkey |
| | | subKeys[nSubKey] = []; |
| | | const subKey = subKeys[nSubKey]; |
| | | |
| | | // Shortcut |
| | | const bitShift = BIT_SHIFTS[nSubKey]; |
| | | |
| | | // Select 48 bits according to PC2 |
| | | for (let i = 0; i < 24; i += 1) { |
| | | // Select from the left 28 key bits |
| | | subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - (i % 6)); |
| | | |
| | | // Select from the right 28 key bits |
| | | subKey[4 + ((i / 6) | 0)] |
| | | |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] |
| | | << (31 - (i % 6)); |
| | | } |
| | | |
| | | // Since each subkey is applied to an expanded 32-bit input, |
| | | // the subkey can be broken into 8 values scaled to 32-bits, |
| | | // which allows the key to be used without expansion |
| | | subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); |
| | | for (let i = 1; i < 7; i += 1) { |
| | | subKey[i] >>>= ((i - 1) * 4 + 3); |
| | | } |
| | | subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); |
| | | } |
| | | |
| | | // Compute inverse subkeys |
| | | this._invSubKeys = []; |
| | | const invSubKeys = this._invSubKeys; |
| | | for (let i = 0; i < 16; i += 1) { |
| | | invSubKeys[i] = subKeys[15 - i]; |
| | | } |
| | | } |
| | | |
| | | encryptBlock(M, offset) { |
| | | this._doCryptBlock(M, offset, this._subKeys); |
| | | } |
| | | |
| | | decryptBlock(M, offset) { |
| | | this._doCryptBlock(M, offset, this._invSubKeys); |
| | | } |
| | | |
| | | _doCryptBlock(M, offset, subKeys) { |
| | | const _M = M; |
| | | |
| | | // Get input |
| | | this._lBlock = M[offset]; |
| | | this._rBlock = M[offset + 1]; |
| | | |
| | | // Initial permutation |
| | | exchangeLR.call(this, 4, 0x0f0f0f0f); |
| | | exchangeLR.call(this, 16, 0x0000ffff); |
| | | exchangeRL.call(this, 2, 0x33333333); |
| | | exchangeRL.call(this, 8, 0x00ff00ff); |
| | | exchangeLR.call(this, 1, 0x55555555); |
| | | |
| | | // Rounds |
| | | for (let round = 0; round < 16; round += 1) { |
| | | // Shortcuts |
| | | const subKey = subKeys[round]; |
| | | const lBlock = this._lBlock; |
| | | const rBlock = this._rBlock; |
| | | |
| | | // Feistel function |
| | | let f = 0; |
| | | for (let i = 0; i < 8; i += 1) { |
| | | f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; |
| | | } |
| | | this._lBlock = rBlock; |
| | | this._rBlock = lBlock ^ f; |
| | | } |
| | | |
| | | // Undo swap from last round |
| | | const t = this._lBlock; |
| | | this._lBlock = this._rBlock; |
| | | this._rBlock = t; |
| | | |
| | | // Final permutation |
| | | exchangeLR.call(this, 1, 0x55555555); |
| | | exchangeRL.call(this, 8, 0x00ff00ff); |
| | | exchangeRL.call(this, 2, 0x33333333); |
| | | exchangeLR.call(this, 16, 0x0000ffff); |
| | | exchangeLR.call(this, 4, 0x0f0f0f0f); |
| | | |
| | | // Set output |
| | | _M[offset] = this._lBlock; |
| | | _M[offset + 1] = this._rBlock; |
| | | } |
| | | } |
| | | DESAlgo.keySize = 64 / 32; |
| | | DESAlgo.ivSize = 64 / 32; |
| | | // blickSize is an instance field and should set in constructor. |
| | | |
| | | /** |
| | | * Shortcut functions to the cipher's object interface. |
| | | * |
| | | * @example |
| | | * |
| | | * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); |
| | | * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); |
| | | */ |
| | | export const DES = BlockCipher._createHelper(DESAlgo); |
| | | |
| | | /** |
| | | * Triple-DES block cipher algorithm. |
| | | */ |
| | | export class TripleDESAlgo extends BlockCipher { |
| | | _doReset() { |
| | | // Shortcuts |
| | | const key = this._key; |
| | | const keyWords = key.words; |
| | | // Make sure the key length is valid (64, 128 or >= 192 bit) |
| | | if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) { |
| | | throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.'); |
| | | } |
| | | |
| | | // Extend the key according to the keying options defined in 3DES standard |
| | | const key1 = keyWords.slice(0, 2); |
| | | const key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4); |
| | | const key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6); |
| | | |
| | | // Create DES instances |
| | | this._des1 = DESAlgo.createEncryptor(WordArray.create(key1)); |
| | | this._des2 = DESAlgo.createEncryptor(WordArray.create(key2)); |
| | | this._des3 = DESAlgo.createEncryptor(WordArray.create(key3)); |
| | | } |
| | | |
| | | encryptBlock(M, offset) { |
| | | this._des1.encryptBlock(M, offset); |
| | | this._des2.decryptBlock(M, offset); |
| | | this._des3.encryptBlock(M, offset); |
| | | } |
| | | |
| | | decryptBlock(M, offset) { |
| | | this._des3.decryptBlock(M, offset); |
| | | this._des2.encryptBlock(M, offset); |
| | | this._des1.decryptBlock(M, offset); |
| | | } |
| | | } |
| | | TripleDESAlgo.keySize = 192 / 32; |
| | | TripleDESAlgo.ivSize = 64 / 32; |
| | | // blickSize is an instance field and should set in constructor. |
| | | |
| | | /** |
| | | * Shortcut functions to the cipher's object interface. |
| | | * |
| | | * @example |
| | | * |
| | | * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); |
| | | * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); |
| | | */ |
| | | export const TripleDES = BlockCipher._createHelper(TripleDESAlgo); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | Base, |
| | | WordArray, |
| | | } from './core.js'; |
| | | |
| | | const X32WordArray = WordArray; |
| | | |
| | | /** |
| | | * A 64-bit word. |
| | | */ |
| | | export class X64Word extends Base { |
| | | /** |
| | | * Initializes a newly created 64-bit word. |
| | | * |
| | | * @param {number} high The high 32 bits. |
| | | * @param {number} low The low 32 bits. |
| | | * |
| | | * @example |
| | | * |
| | | * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); |
| | | */ |
| | | constructor(high, low) { |
| | | super(); |
| | | |
| | | this.high = high; |
| | | this.low = low; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * An array of 64-bit words. |
| | | * |
| | | * @property {Array} words The array of CryptoJS.x64.Word objects. |
| | | * @property {number} sigBytes The number of significant bytes in this word array. |
| | | */ |
| | | export class X64WordArray extends Base { |
| | | /** |
| | | * Initializes a newly created word array. |
| | | * |
| | | * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. |
| | | * @param {number} sigBytes (Optional) The number of significant bytes in the words. |
| | | * |
| | | * @example |
| | | * |
| | | * var wordArray = CryptoJS.x64.WordArray.create(); |
| | | * |
| | | * var wordArray = CryptoJS.x64.WordArray.create([ |
| | | * CryptoJS.x64.Word.create(0x00010203, 0x04050607), |
| | | * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) |
| | | * ]); |
| | | * |
| | | * var wordArray = CryptoJS.x64.WordArray.create([ |
| | | * CryptoJS.x64.Word.create(0x00010203, 0x04050607), |
| | | * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) |
| | | * ], 10); |
| | | */ |
| | | constructor(words = [], sigBytes = words.length * 8) { |
| | | super(); |
| | | |
| | | this.words = words; |
| | | this.sigBytes = sigBytes; |
| | | } |
| | | |
| | | /** |
| | | * Converts this 64-bit word array to a 32-bit word array. |
| | | * |
| | | * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. |
| | | * |
| | | * @example |
| | | * |
| | | * var x32WordArray = x64WordArray.toX32(); |
| | | */ |
| | | toX32() { |
| | | // Shortcuts |
| | | const x64Words = this.words; |
| | | const x64WordsLength = x64Words.length; |
| | | |
| | | // Convert |
| | | const x32Words = []; |
| | | for (let i = 0; i < x64WordsLength; i += 1) { |
| | | const x64Word = x64Words[i]; |
| | | x32Words.push(x64Word.high); |
| | | x32Words.push(x64Word.low); |
| | | } |
| | | |
| | | return X32WordArray.create(x32Words, this.sigBytes); |
| | | } |
| | | |
| | | /** |
| | | * Creates a copy of this word array. |
| | | * |
| | | * @return {X64WordArray} The clone. |
| | | * |
| | | * @example |
| | | * |
| | | * var clone = x64WordArray.clone(); |
| | | */ |
| | | clone() { |
| | | const clone = super.clone.call(this); |
| | | |
| | | // Clone "words" array |
| | | clone.words = this.words.slice(0); |
| | | const { words } = clone; |
| | | |
| | | // Clone each X64Word object |
| | | const wordsLength = words.length; |
| | | for (let i = 0; i < wordsLength; i += 1) { |
| | | words[i] = words[i].clone(); |
| | | } |
| | | |
| | | return clone; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * Audio Module - Audio playback and management system |
| | | * |
| | | * Features: |
| | | * - Audio playback with WAV files - Support for standard WAV audio format |
| | | * - Audio streaming playback - Real-time audio stream processing |
| | | * - Text-to-speech playback - TTS functionality for text conversion |
| | | * - Volume control and range management - Precise volume control with range validation |
| | | * - Playback interruption and cache management - Advanced playback control and resource management |
| | | * |
| | | * Usage: |
| | | * - Audio playback service - Background music, sound effects, notifications |
| | | * - TTS service - Voice announcements, accessibility features (not all devices support) |
| | | * - Volume management - System-wide volume control with user-friendly interface |
| | | * - Support cross-thread audio playback |
| | | * - The WAV format should be Channels : 1, Sample Rate : approximately 24000, Precision : 16-bit, other formats need to be converted to this format |
| | | * |
| | | * Doc/Demo : https://github.com/DejaOS/DejaOS |
| | | */ |
| | | import { audioClass } from './libvbar-m-dxaudio.so' |
| | | |
| | | // Create audio object instance for native operations |
| | | const audioObj = new audioClass(); |
| | | // Export audio module interface |
| | | const audio = {} |
| | | |
| | | // Playback status code constants |
| | | audio.PLAY_CODE = { |
| | | SUCCESS: 0, // Playback completed successfully |
| | | FAILED: -1, // Playback operation failed |
| | | QUEUE_IS_FULL: -2 // Playback queue is full, cannot add more audio |
| | | } |
| | | |
| | | // Language type constants for TTS functionality |
| | | audio.PLAY_TYPE = { |
| | | CHINESE_DATA: 0, /** Chinese language TTS data */ |
| | | ENGLISH_DATA: 1, /** English language TTS data */ |
| | | } |
| | | |
| | | /** |
| | | * Audio system initialization |
| | | * @param {number} [volume=5] Volume level (0-10) - User-friendly volume range (0 means mute), default 5 |
| | | * @param {number} [periodSize=512] Period size in samples - Audio processing granularity, default 512 |
| | | * @param {number} [bufferSize=2048] Buffer size in samples - Audio buffer capacity, default 2048 |
| | | * @throws {Error} If initialization fails - Throws error when audio system cannot be initialized |
| | | * |
| | | * Technical Details: |
| | | * - periodSize: Controls audio processing latency. Smaller values (256,512) provide lower latency |
| | | * but higher CPU usage. Larger values (1024,2048) reduce CPU usage but increase latency. |
| | | * - bufferSize: Determines audio smoothness. Smaller values (1024,2048) use less memory but may |
| | | * cause audio stuttering. Larger values (4096,8192) provide smoother playback but use more memory. |
| | | * - Recommended configurations: |
| | | * * Low latency: (256, 1024) - For real-time communication |
| | | * * High quality: (1024, 4096) - For music playback |
| | | * * Balanced: (512, 2048) - For general applications |
| | | */ |
| | | audio.init = function (volume = 5, periodSize = 512, bufferSize = 2048) { |
| | | // Parameter validation |
| | | validateNumber(volume, 'volume'); |
| | | validateNumber(periodSize, 'periodSize'); |
| | | validateNumber(bufferSize, 'bufferSize'); |
| | | |
| | | // Validate volume range (0-10 for user-friendly interface; 0 means mute) |
| | | if (volume < 0 || volume > 10) { |
| | | throw new Error("audio.init: 'volume' must be between 0 and 10"); |
| | | } |
| | | |
| | | // Initialize audio system with specified parameters |
| | | audioObj.audioInit(volume, periodSize, bufferSize) |
| | | } |
| | | |
| | | /** |
| | | * Audio system deinitialization |
| | | * @returns {boolean} true if deinitialization successful, false otherwise |
| | | * |
| | | * Note: This function releases all audio resources and should be called |
| | | * when the audio system is no longer needed to prevent resource leaks. |
| | | */ |
| | | audio.deinit = function () { |
| | | return audioObj.audioDeinit() |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Get current audio volume level |
| | | * @returns {number} Current volume level (0-10) - Mapped from hardware volume to user-friendly range (0 means mute) |
| | | * |
| | | * The returned value is automatically mapped from the hardware volume range |
| | | * to the user-friendly 1-10 range for consistent interface experience. |
| | | */ |
| | | audio.getVolume = function () { |
| | | return audioObj.audioGetVolume() |
| | | } |
| | | |
| | | /** |
| | | * Set audio volume level |
| | | * @param {number} volume Volume level (0-10), required parameter (0 means mute) |
| | | * @returns {boolean} true if volume set successfully, false otherwise |
| | | * |
| | | * Volume levels outside the valid range (1-10) will be automatically clamped |
| | | * to the nearest valid value. The function maps user volume to hardware volume |
| | | * internally for optimal audio quality. |
| | | */ |
| | | audio.setVolume = function (volume) { |
| | | if (volume == undefined || volume == null) { |
| | | throw new Error("audio.setVolume: 'volume' parameter should not be null") |
| | | } |
| | | if (volume < 0 || volume > 10) { |
| | | throw new Error("audio.setVolume: 'volume' must be between 0 and 10") |
| | | } |
| | | return audioObj.audioSetVolume(volume) |
| | | } |
| | | |
| | | /** |
| | | * Play WAV audio file from file path |
| | | * @param {string} path Absolute path to WAV file, required parameter |
| | | * @returns {number} Playback status code (see audio.PLAY_CODE constants) |
| | | * |
| | | * File path should start with '/app/code/' and typically placed in the project's |
| | | * resource directory (same level as src directory). Supports standard WAV format. |
| | | * |
| | | * Return values: |
| | | * - 0: Playback started successfully |
| | | * - -1: Playback failed |
| | | * - -2: Playback queue is full |
| | | */ |
| | | audio.play = function (path) { |
| | | if (!path) { |
| | | throw new Error("audio.play: 'path' parameter should not be null") |
| | | } |
| | | return audioObj.audioPlayWav(path) |
| | | } |
| | | |
| | | /** |
| | | * Play audio from ArrayBuffer data (streaming audio) |
| | | * @param {ArrayBuffer} buffer Audio data buffer, required parameter |
| | | * @returns {number} Playback status code (see audio.PLAY_CODE constants) |
| | | * |
| | | * This function is useful for playing audio streams, real-time audio data, |
| | | * or audio data received from network sources. The buffer should contain |
| | | * valid WAV format audio data. |
| | | */ |
| | | audio.playWavData = function (buffer) { |
| | | if (!buffer) { |
| | | throw new Error("audio.playWavData: 'buffer' parameter should not be null") |
| | | } |
| | | return audioObj.audioPlayWavData(buffer) |
| | | } |
| | | |
| | | /** |
| | | * Play text using Text-to-Speech (TTS) functionality |
| | | * @param {string} txt Text to be converted to speech, required parameter |
| | | * @param {number} type Language type, required parameter (0: Chinese, 1: English) |
| | | * @returns {number} Playback status code (see audio.PLAY_CODE constants) |
| | | * |
| | | * TTS functionality may not be supported on all devices. The function converts |
| | | * the provided text to speech in the specified language and plays it through |
| | | * the audio system. |
| | | * |
| | | * Language types: |
| | | * - 0: Chinese (䏿) |
| | | * - 1: English (English) |
| | | */ |
| | | audio.playTxt = function (txt, type) { |
| | | if (!txt) { |
| | | throw new Error("audio.playTxt: 'txt' parameter should not be null") |
| | | } |
| | | if (typeof type !== 'number' || isNaN(type)) { |
| | | throw new Error("audio.playTxt: 'type' parameter should not be null") |
| | | } |
| | | return audioObj.audioPlayTxt(txt, type) |
| | | } |
| | | |
| | | /** |
| | | * Interrupt currently playing audio |
| | | * @returns {boolean} true if interruption successful, false otherwise |
| | | * |
| | | * This function immediately stops the currently playing audio without affecting |
| | | * the playback queue. It's useful for emergency stops or when switching |
| | | * between different audio sources. |
| | | */ |
| | | audio.interrupt = function () { |
| | | return audioObj.audioPlayingInterrupt() |
| | | } |
| | | |
| | | /** |
| | | * Clear audio playback cache and queue |
| | | * @returns {boolean} true if cache cleared successfully, false otherwise |
| | | * |
| | | * This function removes all pending audio from the playback queue and clears |
| | | * the audio cache. It should be used when you want to completely reset the |
| | | * audio playback state or free up memory resources. |
| | | * |
| | | * Note: This operation is mutually exclusive with playback functions and |
| | | * should not be called while audio is actively playing. |
| | | */ |
| | | audio.clearCache = function () { |
| | | return audioObj.audioClearPlayCache() |
| | | } |
| | | |
| | | |
| | | function validateNumber(value, name) { |
| | | if (typeof value !== 'number' || isNaN(value)) { |
| | | throw new TypeError(`${name} must be a valid number`); |
| | | } |
| | | } |
| | | |
| | | // Export audio module as default export |
| | | export default audio; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | //build:20240308 |
| | | //Base64ç¼è§£ç å·¥å
· |
| | | //ä¾èµç»ä»¶ï¼æ |
| | | //åºæ¬å
æ¬ä»¥ä¸å½æ°: |
| | | /** |
| | | * 1. encode(str): å符串转base64åç¬¦ä¸²ï¼æ¯å¦Base64.encode("aaçå¥åº·aab")å¾å°YWHnmoTlgaXlurdhYWI= |
| | | * 2. decode(b64): base64å符串转åå符串 |
| | | * 3. fromUint8Array(arr): byteæ°ç»è½¬base64å符串 |
| | | * 4. toUnit8Array(b64):base64å符串转byteæ°ç» |
| | | * 5. fromHexString(hex):16è¿å¶å符串ï¼å°åï¼æ ç©ºæ ¼ï¼è½¬base64å符串 |
| | | * 6. toHexString(b64):base64å符串转16è¿å¶å符串ï¼å°åï¼æ ç©ºæ ¼ |
| | | */ |
| | | /** |
| | | * base64.ts |
| | | * |
| | | * Licensed under the BSD 3-Clause License. |
| | | * http://opensource.org/licenses/BSD-3-Clause |
| | | * |
| | | * References: |
| | | * http://en.wikipedia.org/wiki/Base64 |
| | | * |
| | | * @author Dan Kogai (https://github.com/dankogai) |
| | | */ |
| | | let version = '3.7.7'; |
| | | /** |
| | | * @deprecated use lowercase `version`. |
| | | */ |
| | | let VERSION = version; |
| | | let _hasBuffer = typeof Buffer === 'function'; |
| | | let _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined; |
| | | let _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined; |
| | | let b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; |
| | | let b64chs = Array.prototype.slice.call(b64ch); |
| | | let b64tab = (function (a) { |
| | | let tab = {}; |
| | | a.forEach(function (c, i) { return tab[c] = i; }); |
| | | return tab; |
| | | })(b64chs); |
| | | let b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; |
| | | let _fromCC = String.fromCharCode.bind(String); |
| | | let _U8Afrom = typeof Uint8Array.from === 'function' |
| | | ? Uint8Array.from.bind(Uint8Array) |
| | | : function (it) { return new Uint8Array(Array.prototype.slice.call(it, 0)); }; |
| | | let _mkUriSafe = function (src) { |
| | | return src |
| | | .replace(/=/g, '').replace(/[+\/]/g, function (m0) { return m0 == '+' ? '-' : '_'; }); |
| | | }; |
| | | let _tidyB64 = function (s) { return s.replace(/[^A-Za-z0-9\+\/]/g, ''); }; |
| | | /** |
| | | * polyfill version of `btoa` |
| | | */ |
| | | let btoaPolyfill = function (bin) { |
| | | // console.log('polyfilled'); |
| | | let u32, c0, c1, c2, asc = ''; |
| | | let pad = bin.length % 3; |
| | | for (let i = 0; i < bin.length;) { |
| | | if ((c0 = bin.charCodeAt(i++)) > 255 || |
| | | (c1 = bin.charCodeAt(i++)) > 255 || |
| | | (c2 = bin.charCodeAt(i++)) > 255) |
| | | throw new TypeError('invalid character found'); |
| | | u32 = (c0 << 16) | (c1 << 8) | c2; |
| | | asc += b64chs[u32 >> 18 & 63] |
| | | + b64chs[u32 >> 12 & 63] |
| | | + b64chs[u32 >> 6 & 63] |
| | | + b64chs[u32 & 63]; |
| | | } |
| | | return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc; |
| | | }; |
| | | /** |
| | | * does what `window.btoa` of web browsers do. |
| | | * @param {String} bin binary string |
| | | * @returns {string} Base64-encoded string |
| | | */ |
| | | let _btoa = typeof btoa === 'function' ? function (bin) { return btoa(bin); } |
| | | : _hasBuffer ? function (bin) { return Buffer.from(bin, 'binary').toString('base64'); } |
| | | : btoaPolyfill; |
| | | let _fromUint8Array = _hasBuffer |
| | | ? function (u8a) { return Buffer.from(u8a).toString('base64'); } |
| | | : function (u8a) { |
| | | // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326 |
| | | let maxargs = 0x1000; |
| | | let strs = []; |
| | | for (let i = 0, l = u8a.length; i < l; i += maxargs) { |
| | | strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs))); |
| | | } |
| | | return _btoa(strs.join('')); |
| | | }; |
| | | /** |
| | | * converts a Uint8Array to a Base64 string. |
| | | * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5 |
| | | * @returns {string} Base64 string |
| | | */ |
| | | let fromUint8Array = function (u8a, urlsafe) { |
| | | if (urlsafe === void 0) { urlsafe = false; } |
| | | return urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a); |
| | | }; |
| | | let fromHexString = function (hexString) { |
| | | let byteString = hexString.match(/.{1,2}/g); |
| | | let byteArray = byteString.map(function (byte) { |
| | | return parseInt(byte, 16); |
| | | }); |
| | | let buffer = new Uint8Array(byteArray); |
| | | return fromUint8Array(buffer) |
| | | } |
| | | // This trick is found broken https://github.com/dankogai/js-base64/issues/130 |
| | | // const utob = (src: string) => unescape(encodeURIComponent(src)); |
| | | // reverting good old fationed regexp |
| | | let cb_utob = function (c) { |
| | | if (c.length < 2) { |
| | | let cc = c.charCodeAt(0); |
| | | return cc < 0x80 ? c |
| | | : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6)) |
| | | + _fromCC(0x80 | (cc & 0x3f))) |
| | | : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f)) |
| | | + _fromCC(0x80 | ((cc >>> 6) & 0x3f)) |
| | | + _fromCC(0x80 | (cc & 0x3f))); |
| | | } |
| | | else { |
| | | let cc = 0x10000 |
| | | + (c.charCodeAt(0) - 0xD800) * 0x400 |
| | | + (c.charCodeAt(1) - 0xDC00); |
| | | return (_fromCC(0xf0 | ((cc >>> 18) & 0x07)) |
| | | + _fromCC(0x80 | ((cc >>> 12) & 0x3f)) |
| | | + _fromCC(0x80 | ((cc >>> 6) & 0x3f)) |
| | | + _fromCC(0x80 | (cc & 0x3f))); |
| | | } |
| | | }; |
| | | let re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; |
| | | /** |
| | | * @deprecated should have been internal use only. |
| | | * @param {string} src UTF-8 string |
| | | * @returns {string} UTF-16 string |
| | | */ |
| | | let utob = function (u) { return u.replace(re_utob, cb_utob); }; |
| | | // |
| | | let _encode = _hasBuffer |
| | | ? function (s) { return Buffer.from(s, 'utf8').toString('base64'); } |
| | | : _TE |
| | | ? function (s) { return _fromUint8Array(_TE.encode(s)); } |
| | | : function (s) { return _btoa(utob(s)); }; |
| | | /** |
| | | * converts a UTF-8-encoded string to a Base64 string. |
| | | * @param {boolean} [urlsafe] if `true` make the result URL-safe |
| | | * @returns {string} Base64 string |
| | | */ |
| | | let encode = function (src, urlsafe) { |
| | | if (urlsafe === void 0) { urlsafe = false; } |
| | | return urlsafe |
| | | ? _mkUriSafe(_encode(src)) |
| | | : _encode(src); |
| | | }; |
| | | /** |
| | | * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5. |
| | | * @returns {string} Base64 string |
| | | */ |
| | | let encodeURI = function (src) { return encode(src, true); }; |
| | | // This trick is found broken https://github.com/dankogai/js-base64/issues/130 |
| | | // const btou = (src: string) => decodeURIComponent(escape(src)); |
| | | // reverting good old fationed regexp |
| | | let re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g; |
| | | let cb_btou = function (cccc) { |
| | | switch (cccc.length) { |
| | | case 4: |
| | | let cp = ((0x07 & cccc.charCodeAt(0)) << 18) |
| | | | ((0x3f & cccc.charCodeAt(1)) << 12) |
| | | | ((0x3f & cccc.charCodeAt(2)) << 6) |
| | | | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000; |
| | | return (_fromCC((offset >>> 10) + 0xD800) |
| | | + _fromCC((offset & 0x3FF) + 0xDC00)); |
| | | case 3: |
| | | return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12) |
| | | | ((0x3f & cccc.charCodeAt(1)) << 6) |
| | | | (0x3f & cccc.charCodeAt(2))); |
| | | default: |
| | | return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6) |
| | | | (0x3f & cccc.charCodeAt(1))); |
| | | } |
| | | }; |
| | | /** |
| | | * @deprecated should have been internal use only. |
| | | * @param {string} src UTF-16 string |
| | | * @returns {string} UTF-8 string |
| | | */ |
| | | let btou = function (b) { return b.replace(re_btou, cb_btou); }; |
| | | /** |
| | | * polyfill version of `atob` |
| | | */ |
| | | let atobPolyfill = function (asc) { |
| | | // console.log('polyfilled'); |
| | | asc = asc.replace(/\s+/g, ''); |
| | | if (!b64re.test(asc)) |
| | | throw new TypeError('malformed base64.'); |
| | | asc += '=='.slice(2 - (asc.length & 3)); |
| | | let u24, bin = '', r1, r2; |
| | | for (let i = 0; i < asc.length;) { |
| | | u24 = b64tab[asc.charAt(i++)] << 18 |
| | | | b64tab[asc.charAt(i++)] << 12 |
| | | | (r1 = b64tab[asc.charAt(i++)]) << 6 |
| | | | (r2 = b64tab[asc.charAt(i++)]); |
| | | bin += r1 === 64 ? _fromCC(u24 >> 16 & 255) |
| | | : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255) |
| | | : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255); |
| | | } |
| | | return bin; |
| | | }; |
| | | /** |
| | | * does what `window.atob` of web browsers do. |
| | | * @param {String} asc Base64-encoded string |
| | | * @returns {string} binary string |
| | | */ |
| | | let _atob = typeof atob === 'function' ? function (asc) { return atob(_tidyB64(asc)); } |
| | | : _hasBuffer ? function (asc) { return Buffer.from(asc, 'base64').toString('binary'); } |
| | | : atobPolyfill; |
| | | // |
| | | let _toUint8Array = _hasBuffer |
| | | ? function (a) { return _U8Afrom(Buffer.from(a, 'base64')); } |
| | | : function (a) { return _U8Afrom(_atob(a).split('').map(function (c) { return c.charCodeAt(0); })); }; |
| | | /** |
| | | * converts a Base64 string to a Uint8Array. |
| | | */ |
| | | let toUint8Array = function (a) { return _toUint8Array(_unURI(a)); }; |
| | | // |
| | | let toHexString = function (a) { |
| | | let uint8 = toUint8Array(a) |
| | | return Array.from(uint8) |
| | | .map((i) => i.toString(16).padStart(2, '0')) |
| | | .join('');; |
| | | } |
| | | let _decode = _hasBuffer |
| | | ? function (a) { return Buffer.from(a, 'base64').toString('utf8'); } |
| | | : _TD |
| | | ? function (a) { return _TD.decode(_toUint8Array(a)); } |
| | | : function (a) { return btou(_atob(a)); }; |
| | | let _unURI = function (a) { return _tidyB64(a.replace(/[-_]/g, function (m0) { return m0 == '-' ? '+' : '/'; })); }; |
| | | /** |
| | | * converts a Base64 string to a UTF-8 string. |
| | | * @param {String} src Base64 string. Both normal and URL-safe are supported |
| | | * @returns {string} UTF-8 string |
| | | */ |
| | | let decode = function (src) { return _decode(_unURI(src)); }; |
| | | /** |
| | | * check if a value is a valid Base64 string |
| | | * @param {String} src a value to check |
| | | */ |
| | | let isValid = function (src) { |
| | | if (typeof src !== 'string') |
| | | return false; |
| | | let s = src.replace(/\s+/g, '').replace(/={0,2}$/, ''); |
| | | return !/[^\s0-9a-zA-Z\+/]/.test(s) || !/[^\s0-9a-zA-Z\-_]/.test(s); |
| | | }; |
| | | // |
| | | let _noEnum = function (v) { |
| | | return { |
| | | value: v, enumerable: false, writable: true, configurable: true |
| | | }; |
| | | }; |
| | | /** |
| | | * extend String.prototype with relevant methods |
| | | */ |
| | | let extendString = function () { |
| | | let _add = function (name, body) { return Object.defineProperty(String.prototype, name, _noEnum(body)); }; |
| | | _add('fromBase64', function () { return decode(this); }); |
| | | _add('toBase64', function (urlsafe) { return encode(this, urlsafe); }); |
| | | _add('toBase64URI', function () { return encode(this, true); }); |
| | | _add('toBase64URL', function () { return encode(this, true); }); |
| | | _add('toUint8Array', function () { return toUint8Array(this); }); |
| | | }; |
| | | /** |
| | | * extend Uint8Array.prototype with relevant methods |
| | | */ |
| | | let extendUint8Array = function () { |
| | | let _add = function (name, body) { return Object.defineProperty(Uint8Array.prototype, name, _noEnum(body)); }; |
| | | _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); }); |
| | | _add('toBase64URI', function () { return fromUint8Array(this, true); }); |
| | | _add('toBase64URL', function () { return fromUint8Array(this, true); }); |
| | | }; |
| | | /** |
| | | * extend Builtin prototypes with relevant methods |
| | | */ |
| | | let extendBuiltins = function () { |
| | | extendString(); |
| | | extendUint8Array(); |
| | | }; |
| | | let gBase64 = { |
| | | version: version, |
| | | VERSION: VERSION, |
| | | atob: _atob, |
| | | atobPolyfill: atobPolyfill, |
| | | btoa: _btoa, |
| | | btoaPolyfill: btoaPolyfill, |
| | | fromBase64: decode, |
| | | toBase64: encode, |
| | | encode: encode, |
| | | encodeURI: encodeURI, |
| | | encodeURL: encodeURI, |
| | | utob: utob, |
| | | btou: btou, |
| | | decode: decode, |
| | | isValid: isValid, |
| | | fromUint8Array: fromUint8Array, |
| | | toUint8Array: toUint8Array, |
| | | fromHexString: fromHexString, |
| | | toHexString: toHexString, |
| | | extendString: extendString, |
| | | extendUint8Array: extendUint8Array, |
| | | extendBuiltins: extendBuiltins |
| | | }; |
| | | export default gBase64 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { Facial } from './libvbar-m-dxfacial.so'; // Placeholder for native module import |
| | | |
| | | const dxCamera = {}; |
| | | |
| | | // --- Constants & Enums --- |
| | | |
| | | |
| | | // Instantiate the native object immediately. |
| | | // Thanks to ES module caching, this will only run once. |
| | | const _native = new Facial(); |
| | | |
| | | |
| | | // --- Public API --- |
| | | |
| | | /** |
| | | * Set camera preview enable/disable |
| | | * @param {number} channel - Camera channel (0: RGB, 1: NIR) |
| | | * @param {number} enable - Switch state (0: disable, 1: enable) |
| | | */ |
| | | dxCamera.capPreviewEnable = function (channel, enable) { |
| | | _native.capPreviewEnable(channel, enable); // Throws on error |
| | | }; |
| | | |
| | | /** |
| | | * Capture and save a screenshot from the camera. |
| | | * @param {string} savePath - The file path where the screenshot will be saved. If not provided, a default path will be used. |
| | | * Throws an error if the operation fails. |
| | | */ |
| | | dxCamera.capPrintscreen = function (savePath = "/test.jpg") { |
| | | _native.capPrintscreen(savePath); |
| | | }; |
| | | |
| | | |
| | | export default dxCamera; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { Facial } from './libvbar-m-dxfacial.so'; // Placeholder for native module import |
| | | |
| | | const dxCapcal = {}; |
| | | |
| | | // --- Constants & Enums --- |
| | | |
| | | |
| | | // Instantiate the native object immediately. |
| | | // Thanks to ES module caching, this will only run once. |
| | | const _native = new Facial(); |
| | | |
| | | |
| | | // --- Public API --- |
| | | |
| | | dxCapcal.init = function () { |
| | | _native.initCapcal(); // Throws on error |
| | | }; |
| | | |
| | | dxCapcal.deinit = function () { |
| | | _native.deinitCapcal(); |
| | | }; |
| | | |
| | | dxCapcal.calculate = function (cnt) { |
| | | return _native.calculateCapcal(cnt); |
| | | }; |
| | | |
| | | dxCapcal.getBox = function (cnt) { |
| | | return _native.getBoxCapcal(cnt); |
| | | }; |
| | | |
| | | /** |
| | | * Gets the native module instance. |
| | | * @returns {object|null} |
| | | */ |
| | | dxCapcal.getNative = function () { |
| | | return _native; |
| | | }; |
| | | |
| | | export default dxCapcal; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * @file dxChannel.js |
| | | * @module dxChannel |
| | | * @description |
| | | * Data communication channel module based on the native dxChannel C library. |
| | | * This module provides a direct, handle-based interface for various communication channels, |
| | | * including Serial Port (UART), USB (HID, Keyboard Wedge), and Wiegand. |
| | | * |
| | | * It is designed for high-performance, multi-threaded environments, allowing different |
| | | * channels to be operated in parallel safely. |
| | | * |
| | | * @usage |
| | | * // 1. Import the module |
| | | * import channel from 'dxChannel.js'; |
| | | * |
| | | * // 2. Open a channel (e.g., a serial port) and get its handle |
| | | * let uart_handle = null; |
| | | * try { |
| | | * uart_handle = channel.open(channel.TYPE.UART, "/dev/ttyS2"); |
| | | * } catch (e) { |
| | | * console.error("Failed to open UART:", e); |
| | | * } |
| | | * |
| | | * if (uart_handle !== null) { |
| | | * try { |
| | | * // 3. Configure the channel |
| | | * channel.setUartParam(uart_handle, 9600, 8, 'N', 1); |
| | | * |
| | | * // 4. Send data |
| | | * const dataToSend = new Uint8Array([0x01, 0x02, 0x03, 0x04]).buffer; |
| | | * const success = channel.send(uart_handle, dataToSend); |
| | | * dxLogger.info("Send successful:", success); |
| | | * |
| | | * // 5. Receive data (this is a blocking call) |
| | | * const receivedData = channel.receive(uart_handle, 4, 1000); // Wait for 4 bytes for up to 1000ms |
| | | * if (receivedData) { |
| | | * dxLogger.info("Received data:", receivedData); |
| | | * } |
| | | * } catch (e) { |
| | | * console.error("Channel operation failed:", e); |
| | | * } finally { |
| | | * // 6. Close the handle when done |
| | | * channel.close(uart_handle); |
| | | * } |
| | | * } |
| | | */ |
| | | import { channel as nativeChannel } from './libvbar-m-dxchannel.so' |
| | | |
| | | const channel = {} |
| | | |
| | | /** |
| | | * @readonly |
| | | * @enum {number} |
| | | * Channel type enumeration. |
| | | */ |
| | | channel.TYPE = Object.freeze({ |
| | | USBKBW: 1, // USB Keyboard Wedge |
| | | USBHID: 2, // USB Human Interface Device |
| | | UART: 3, // Serial Port (UART) |
| | | WIEGAND: 4 // Wiegand interface |
| | | }); |
| | | |
| | | /** |
| | | * @readonly |
| | | * @enum {number} |
| | | * IO Control command enumeration for `channel.ioctl`. |
| | | */ |
| | | channel.IOC_SET_CMD = Object.freeze({ |
| | | /** Set KBW channel configuration parameters */ |
| | | CHANNEL_IOC_SET_KBW_CONFIG: 1, |
| | | /** Set KBW channel upper computer parameters */ |
| | | CHANNEL_IOC_SET_KBW_UPPER: 2, |
| | | /** Set KBW online time */ |
| | | CHANNEL_IOC_SET_KBW_UPTIME: 3, |
| | | /** Set KBW offline time */ |
| | | CHANNEL_IOC_SET_KBW_DOWNTIME: 4, |
| | | /** Set HID channel report length */ |
| | | CHANNEL_IOC_SET_HID_REPORT_LEN: 5, |
| | | /** Set UART channel parameters */ |
| | | CHANNEL_IOC_SET_UART_PARAM: 6, |
| | | /** Set Wiegand channel working mode */ |
| | | CHANNEL_IOC_SET_WIEGAND_MODE: 7, |
| | | /** Set Wiegand channel GPIO configuration */ |
| | | CHANNEL_IOC_SET_WIEGAND_GPIO: 8, |
| | | /** Set Wiegand channel delay time */ |
| | | CHANNEL_IOC_SET_WIEGAND_DELAY: 9, |
| | | /** Set Wiegand channel logging function */ |
| | | CHANNEL_IOC_SET_WIEGAND_LOG: 10 |
| | | }); |
| | | |
| | | /** |
| | | * @readonly |
| | | * @enum {number} |
| | | * Wiegand channel working modes. |
| | | */ |
| | | channel.WIEGAND_MODE = Object.freeze({ |
| | | /** Initial value for Wiegand mode */ |
| | | WIEGAND_MODE_INIT: 0, |
| | | /** Wiegand 26-bit mode */ |
| | | WIEGAND_MODE_26: 1, |
| | | /** Wiegand 34-bit mode */ |
| | | WIEGAND_MODE_34: 2, |
| | | /** Wiegand 128-bit mode */ |
| | | WIEGAND_MODE_128: 3, |
| | | /** Wiegand 256-bit mode */ |
| | | WIEGAND_MODE_256: 4, |
| | | /** Wiegand 2048-bit mode */ |
| | | WIEGAND_MODE_2048: 5, |
| | | /** Custom Wiegand mode, max 6400 bits */ |
| | | WIEGAND_MODE_CUSTOM: 6 |
| | | }); |
| | | |
| | | /** |
| | | * Opens a communication channel and returns its handle. |
| | | * @param {number} type - The channel type, from `channel.TYPE` enum. |
| | | * @param {string} path - The channel device path, e.g., "/dev/ttyS2". Note: The path may vary on different hardware. Please refer to `dxDriver.js` for device-specific constants. |
| | | * @returns {number} The numeric handle for the opened channel, used in all subsequent operations. |
| | | * @throws {Error} If the channel fails to open or if parameters are invalid. |
| | | */ |
| | | channel.open = function (type, path) { |
| | | if (type === undefined || type === null) { |
| | | throw new Error("channel.open: 'type' parameter is required.") |
| | | } |
| | | // Validate that the provided type is a valid value from the enum |
| | | if (!Object.values(channel.TYPE).includes(type)) { |
| | | throw new Error(`channel.open: invalid 'type' parameter. Please use a value from channel.TYPE.`); |
| | | } |
| | | if (path === undefined || path === null) { |
| | | throw new Error("channel.open: 'path' parameter is required.") |
| | | } |
| | | |
| | | try { |
| | | const handle_id = nativeChannel.open(type, path); |
| | | return handle_id; |
| | | } catch (e) { |
| | | // The C layer throws an exception on failure. We catch it and re-throw a more user-friendly JS error. |
| | | throw new Error(`channel.open: failed to open channel with type ${type} and path '${path}'. Reason: ${e.message}`); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Sends data to a specified channel. |
| | | * @param {number} handle_id - The channel handle returned by `open()`. |
| | | * @param {ArrayBuffer} buffer - The binary data to send. |
| | | * @returns {number} The number of bytes successfully sent, or a negative value on failure. |
| | | * Note: A successful return only indicates data has been sent from the local buffer, |
| | | * not that it has been received by the remote end. |
| | | */ |
| | | channel.send = function (handle_id, buffer) { |
| | | if (handle_id === undefined || handle_id === null) { |
| | | throw new Error("channel.send: 'handle_id' parameter is required.") |
| | | } |
| | | if (buffer === undefined || buffer === null) { |
| | | throw new Error("channel.send: 'buffer' parameter is required.") |
| | | } |
| | | return nativeChannel.send(handle_id, buffer); |
| | | } |
| | | |
| | | /** |
| | | * Receives data from a specified channel. This is a blocking call. |
| | | * @param {number} handle_id - The channel handle returned by `open()`. |
| | | * @param {number} size - The number of bytes to receive. |
| | | * @param {number} [timeout=10] - The maximum time to wait in milliseconds. Defaults to 10. |
| | | * @returns {Uint8Array|null} A `Uint8Array` containing the received data, or `null` if the operation timed out with no data. |
| | | */ |
| | | channel.receive = function (handle_id, size, timeout) { |
| | | if (handle_id === undefined || handle_id === null) { |
| | | throw new Error("channel.receive: 'handle_id' parameter is required.") |
| | | } |
| | | if (size === undefined || size === null) { |
| | | throw new Error("channel.receive: 'size' parameter is required.") |
| | | } |
| | | if (timeout === undefined || timeout === null) { |
| | | timeout = 10 |
| | | } |
| | | |
| | | const res = nativeChannel.receive(handle_id, size, timeout) |
| | | if (res === null) { |
| | | return null |
| | | } |
| | | return new Uint8Array(res) |
| | | } |
| | | |
| | | /** |
| | | * Performs a special I/O control operation on a specified channel. |
| | | * @param {number} handle_id - The channel handle returned by `open()`. |
| | | * @param {number} request - The control command code, from `channel.IOC_SET_CMD` enum. |
| | | * @param {*} arg - The argument for the request, which can be a number, string, or object. |
| | | * @returns {boolean} True on success, false on failure. |
| | | */ |
| | | channel.ioctl = function (handle_id, request, arg) { |
| | | if (handle_id === undefined || handle_id === null) { |
| | | throw new Error("channel.ioctl: 'handle_id' parameter is required.") |
| | | } |
| | | // Validate that the provided request is a valid value from the enum |
| | | if (!Object.values(channel.IOC_SET_CMD).includes(request)) { |
| | | throw new Error(`channel.ioctl: invalid 'request' parameter. Please use a value from channel.IOC_SET_CMD.`); |
| | | } |
| | | return nativeChannel.ioctl(handle_id, request, arg) |
| | | } |
| | | |
| | | /** |
| | | * Closes a communication channel. |
| | | * @param {number} handle_id - The channel handle returned by `open()`. |
| | | * @returns {boolean} Always returns true on success. |
| | | * @throws {Error} If the handle_id is invalid. |
| | | */ |
| | | channel.close = function (handle_id) { |
| | | if (handle_id === undefined || handle_id === null) { |
| | | throw new Error("channel.close: 'handle_id' parameter is required.") |
| | | } |
| | | return nativeChannel.close(handle_id) |
| | | } |
| | | |
| | | /** |
| | | * Flushes (clears) the input/output buffers of a specified channel. |
| | | * @param {number} handle_id - The channel handle returned by `open()`. |
| | | * @param {number} queue_selector - Which queue to flush. 0: Input, 1: Output, 2: Both. |
| | | * @returns {boolean} True on success, false on failure. |
| | | */ |
| | | channel.flush = function (handle_id, queue_selector) { |
| | | if (handle_id === undefined || handle_id === null) { |
| | | throw new Error("channel.flush: 'handle_id' parameter is required.") |
| | | } |
| | | if (queue_selector === undefined || queue_selector === null) { |
| | | throw new Error("channel.flush: 'queue_selector' parameter is required.") |
| | | } |
| | | return nativeChannel.flush(handle_id, queue_selector); |
| | | } |
| | | |
| | | /** |
| | | * Sets the communication parameters for a UART (serial) channel. |
| | | * @param {number} handle_id - The channel handle returned by `open()`. |
| | | * @param {number} baudrate - The baud rate, e.g., 9600, 115200. |
| | | * @param {number} [databits=8] - The number of data bits. |
| | | * @param {string} [parity='N'] - The parity: 'N' (None), 'O' (Odd), 'E' (Even). |
| | | * @param {number} [stopbits=1] - The number of stop bits. |
| | | * @returns {boolean} True on success, false on failure. |
| | | */ |
| | | channel.setUartParam = function (handle_id, baudrate, databits, parity, stopbits) { |
| | | if (baudrate === undefined || baudrate === null) { |
| | | throw new Error("channel.setUartParam: 'baudrate' parameter is required."); |
| | | } |
| | | // Set default values for optional parameters |
| | | const final_databits = (databits === undefined || databits === null) ? 8 : databits; |
| | | const final_parity = (parity === undefined || parity === null) ? 'N' : parity; |
| | | const final_stopbits = (stopbits === undefined || stopbits === null) ? 1 : stopbits; |
| | | |
| | | const param_string = `${baudrate}-${final_databits}-${final_parity}-${final_stopbits}`; |
| | | |
| | | return channel.ioctl(handle_id, channel.IOC_SET_CMD.CHANNEL_IOC_SET_UART_PARAM, param_string); |
| | | } |
| | | |
| | | /** |
| | | * @typedef {object} WiegandGpioConfig |
| | | * @property {number} [busy_time] - Busy time (in microseconds). Defaults to 50 in the C layer. |
| | | * @property {number} [free_time] - Free time (in microseconds). Defaults to 100 in the C layer. |
| | | * @property {number} [mode] - Working mode, see `channel.WIEGAND_MODE`. Defaults to 2 (34-bit) in the C layer. |
| | | * @property {number} [log_level] - Log level. Defaults to 1 in the C layer. |
| | | * @property {number} [wiegand_d0] - GPIO pin number for D0 data line. Defaults to 4 in the C layer. |
| | | * @property {number} [wiegand_d1] - GPIO pin number for D1 data line. Defaults to 5 in the C layer. |
| | | */ |
| | | |
| | | /** |
| | | * Sets the GPIO pins and working parameters for a Wiegand channel. |
| | | * @param {number} handle_id - The channel handle returned by `open()`. |
| | | * @param {WiegandGpioConfig} config - Wiegand configuration object. |
| | | * @returns {boolean} True on success, false on failure. |
| | | */ |
| | | channel.setWiegandGpio = function (handle_id, config) { |
| | | if (config === undefined || config === null) { |
| | | throw new Error("channel.setWiegandGpio: 'config' object is required."); |
| | | } |
| | | // The C layer provides default values, so passing a partial or empty object is safe. |
| | | return channel.ioctl(handle_id, channel.IOC_SET_CMD.CHANNEL_IOC_SET_WIEGAND_GPIO, config); |
| | | } |
| | | export default channel; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | //build: 20240617 |
| | | // ç³»ç»çä¸äºåºæ¬æä½ãè¿æä¸äºå¸¸ç¨çå·¥å
·å½æ°ï¼åºæ¬ä¸æ¯ä¸ªé¡¹ç®é½éè¦ä¾èµè¿ä¸ªç»ä»¶ï¼å¦å¤dxLoggerä¹ä¾èµè¿ä¸ªç»ä»¶ |
| | | // ä¾èµç»ä»¶ï¼dxDriverï¼dxMap |
| | | import { commonClass } from './libvbar-m-dxcommon.so' |
| | | import dxMap from './dxMap.js' |
| | | import * as std from 'std'; |
| | | import * as os from "os" |
| | | |
| | | const commonObj = new commonClass(); |
| | | |
| | | const common = {} |
| | | /** |
| | | * è·åç³»ç»å¯å¨çè¿è¡æ¶é´(å使¯ç§) |
| | | * @returns |
| | | */ |
| | | common.getUptime = function () { |
| | | return commonObj.getUptime(); |
| | | } |
| | | |
| | | /** |
| | | * è·åç³»ç»çæ»å
å(å使¯åè) |
| | | * @returns |
| | | */ |
| | | common.getTotalmem = function () { |
| | | return commonObj.getTotalmem(); |
| | | } |
| | | |
| | | /** |
| | | * è·åç³»ç»å©ä½å
å(å使¯åè) |
| | | * @returns |
| | | */ |
| | | common.getFreemem = function () { |
| | | return commonObj.getFreemem(); |
| | | } |
| | | |
| | | /** |
| | | * Deprcated, Please use `common.logMemory` instead. |
| | | */ |
| | | common.logMem = function (logger, interval = 10) { |
| | | if (logger) { |
| | | logger.debug("Deprcated, Please use `common.logMemory` instead.") |
| | | } |
| | | } |
| | | /** |
| | | * Logs the current memory usage at regular intervals for debugging and monitoring purposes. |
| | | * @param {object} logger The dxLogger module object. |
| | | * @param {number} interval The logging interval in seconds, defaulting to 10 seconds. |
| | | */ |
| | | common.logMemory = function (logger, interval = 10) { |
| | | if (!logger) return; |
| | | |
| | | let first = new Date().getTime(); |
| | | let min = common.getFreemem() / 1024; |
| | | let max = min; |
| | | const _logmemory = () => { |
| | | try { |
| | | const now = new Date().getTime(); |
| | | const pass = (now - first) / 1000; |
| | | const free = common.getFreemem() / 1024; |
| | | |
| | | min = Math.min(min, free); |
| | | max = Math.max(max, free); |
| | | |
| | | // Format time |
| | | let passStr; |
| | | if (pass > 1700000000) { |
| | | first = now; |
| | | passStr = 'time synced, 0s'; |
| | | } else if (pass >= 3600) { |
| | | const hours = Math.floor(pass / 3600); |
| | | const minutes = Math.floor((pass % 3600) / 60); |
| | | const seconds = Math.floor(pass % 60); |
| | | passStr = `${hours}h ${minutes}m ${seconds}s`; |
| | | } else if (pass >= 60) { |
| | | const minutes = Math.floor(pass / 60); |
| | | const seconds = Math.floor(pass % 60); |
| | | passStr = `${minutes}m ${seconds}s`; |
| | | } else { |
| | | passStr = `${Math.floor(pass)}s`; |
| | | } |
| | | const log = `------ ${passStr} passed, free memory (k): ${free}, min free memory (k): ${min}, max free memory (k): ${max} ------`; |
| | | logger.info(log); |
| | | } catch (err) { |
| | | logger.error('Error in logMemory:', err); |
| | | } finally { |
| | | os.setTimeout(_logmemory, interval * 1000); |
| | | } |
| | | }; |
| | | |
| | | os.setTimeout(_logmemory, interval * 1000); |
| | | }; |
| | | |
| | | /** |
| | | * The principle of converting asynchronous to synchronous is as follows: |
| | | * the `request` function periodically checks a designated variable in memory for a value. |
| | | * If the value is found within the timeout period, the result is returned; otherwise, |
| | | * it is considered a timeout. The `response` function is responsible for storing the result |
| | | * in the designated variable once the asynchronous request is completed. |
| | | */ |
| | | common.sync = { |
| | | /** |
| | | * Block and wait for data |
| | | * Usage: |
| | | common.sync.request(topic, 200) |
| | | .then((data) => { |
| | | log.info("Received data:", data); |
| | | }) |
| | | .catch((err) => { |
| | | log.error("Request failed:", err.message); |
| | | }); |
| | | * @param {string} topic The unique identifier for each request |
| | | * @param {int} timeout waitting timeout(microsecond)ï¼default is 200 ms |
| | | * @returns |
| | | */ |
| | | request: function (topic, timeout = 200) { |
| | | return new Promise((resolve, reject) => { |
| | | let map = dxMap.get("SYNC"); |
| | | let startTime = Date.now(); |
| | | |
| | | const checkData = () => { |
| | | let data = map.get(topic); |
| | | if (data) { |
| | | map.del(topic); //del data in map |
| | | resolve(data); //return data |
| | | } else if (Date.now() - startTime >= timeout) { |
| | | map.del(topic); // del data in map with timeout |
| | | reject(new Error(`Timeout exceeded for topic: ${topic}`)); |
| | | } else { |
| | | os.setTimeout(checkData, 10); //every 10 ms to check |
| | | } |
| | | }; |
| | | |
| | | os.setTimeout(checkData, 10); // first check |
| | | }); |
| | | }, |
| | | |
| | | /** |
| | | * notify data to requester |
| | | * @param {string} topic The unique identifier for each request |
| | | * @param {*} data |
| | | * @returns |
| | | */ |
| | | response: function (topic, data) { |
| | | let map = dxMap.get("SYNC"); |
| | | map.put(topic, data); // save data in map |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * è·åç³»ç»å¯ç¨ç£çæ»é(å使¯åè) |
| | | * @param {string} path ä¸åçç£çååºåç§°ï¼ä¸æ¯ç®å½åï¼ï¼éå¿
å¡«ï¼ç¼ºçæ¯'/' |
| | | */ |
| | | common.getTotaldisk = function (path) { |
| | | return commonObj.getTotaldisk(!path ? "/" : path); |
| | | } |
| | | |
| | | /** |
| | | * è·åç³»ç»ç£çå©ä½å¯ç¨é(å使¯åè) |
| | | * @param {string} path ä¸åçç£çååºåç§°ï¼ä¸æ¯ç®å½åï¼ï¼éå¿
å¡«ï¼ç¼ºçæ¯'/' |
| | | * @returns |
| | | */ |
| | | common.getFreedisk = function (path) { |
| | | return commonObj.getFreedisk(!path ? "/" : path); |
| | | } |
| | | |
| | | /** |
| | | * è·åCPU ID |
| | | * @param {number} len éå¿
å¡«ï¼ç¼ºçé¿åº¦æ¯33ä½é¿ |
| | | * @returns |
| | | */ |
| | | common.getCpuid = function () { |
| | | return commonObj.getCpuid(33); |
| | | } |
| | | |
| | | /** |
| | | * è·å设å¤uuidï¼åç¬¦ä¸²ï¼ |
| | | * @returns |
| | | */ |
| | | common.getUuid = function () { |
| | | return commonObj.getUuid(19); |
| | | } |
| | | |
| | | /** |
| | | * è·å设å¤å¯ä¸æ è¯ |
| | | * @returns |
| | | */ |
| | | common.getSn = function () { |
| | | let sn = std.loadFile('/etc/.sn') |
| | | if (sn) { |
| | | return sn |
| | | } else { |
| | | return commonObj.getUuid(19); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åéè¿uuid计ç®çmacå°åï¼è¿ä¸ªå¯ä»¥ç¨æ¥åå§åç½å¡çæ¶åç¨ |
| | | * @returns æ ¼å¼ç±»ä¼¼ï¼b2:a1:63:3f:99:b6 |
| | | */ |
| | | common.getUuid2mac = function () { |
| | | return commonObj.getUuid2mac(19); |
| | | } |
| | | |
| | | /** |
| | | * è·åcpuå ç¨çï¼ä¸å¤§äº100çæ°åï¼ |
| | | * @returns |
| | | */ |
| | | common.getFreecpu = function () { |
| | | return commonObj.getFreecpu(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * RSA è§£å¯ ï¼ç§é¥å å¯å
¬é¥è§£å¯ï¼ |
| | | * æ¯å¦å
¬é¥æ¯ |
| | | * @param {ArrayBuffer} data è¦è§£å¯çæ°æ®ï¼å¿
å¡« |
| | | * @param {string} publicKey å
¬é¥ï¼å¿
å¡« |
| | | * @returns |
| | | */ |
| | | common.arrayBufferRsaDecrypt = function (data, publicKey) { |
| | | if (data === undefined || data === null) { |
| | | throw new Error("dxCommon.arrayBufferRsaDecrypt:'data' parameter should not be null or empty") |
| | | } |
| | | if (publicKey === undefined || publicKey === null || publicKey.length < 1) { |
| | | throw new Error("dxCommon.arrayBufferRsaDecrypt:'publicKey' parameter should not be null or empty") |
| | | } |
| | | return commonObj.arrayBufferRsaDecrypt(data, publicKey) |
| | | } |
| | | |
| | | /** |
| | | * @brief Stirng aes å å¯ |
| | | */ |
| | | common.aes128EcbEncrypt = function (input, key) { |
| | | return commonObj.aes128EcbEncrypt(input, key) |
| | | } |
| | | /** |
| | | * @brief Stirng aes è§£å¯ |
| | | */ |
| | | common.aes128EcbDecrypt = function (input, key) { |
| | | return commonObj.aes128EcbDecrypt(input, key) |
| | | } |
| | | |
| | | /** |
| | | * arraybuffer ecb 128bit Pkcs5Padding aes å å¯ |
| | | * @param {ArrayBuffer} input ææ |
| | | * @param {ArrayBuffer} key å¯é¥ |
| | | * @returns ArrayBuffer 坿 |
| | | */ |
| | | common.aes128EcbPkcs5PaddingEncode = function (input, key) { |
| | | return commonObj.aes128Pkcs7PaddingEncode(input, key) |
| | | } |
| | | |
| | | /** |
| | | * arraybuffer ecb 128bit Pkcs5Padding aes è§£å¯ |
| | | * |
| | | * @param {ArrayBuffer} input 坿 |
| | | * @param {ArrayBuffer} key å¯é¥ |
| | | * @returns ArrayBuffer ææ |
| | | */ |
| | | common.aesEcb128Pkcs5PaddingDecode = function (input, key) { |
| | | return commonObj.aes128Pkcs7PaddingDecode(input, key) |
| | | } |
| | | |
| | | /** |
| | | * aes ECB Pkcs5Padding 128 å å¯ |
| | | * 示ä¾ï¼common.aes128EcbPkcs5PaddingEncrypt("stamp=202008æ&tic", "1234567890123456") |
| | | * ç»æï¼ef7c3cff9df57b3bcb0951938c574f969e13ffdcc1eadad298ddbd1fb1a4d2f7 |
| | | * åè https://www.devglan.com/online-tools/aes-encryption-decryption |
| | | * @param {string} input æææ°æ® |
| | | * @param {string} key å¯é¥ 16åèå符串 |
| | | * @return 坿 16è¿å¶å符串 |
| | | */ |
| | | common.aes128EcbPkcs5PaddingEncrypt = function (input, key) { |
| | | let data = common.hexStringToArrayBuffer(common.strToUtf8Hex(input)) |
| | | key = common.hexStringToArrayBuffer(common.strToUtf8Hex(key)) |
| | | // å å¯ |
| | | let hex = common.arrayBufferToHexString(common.aes128EcbPkcs5PaddingEncode(data, key)) |
| | | return hex |
| | | } |
| | | /** |
| | | * aes ECB Pkcs5Padding 128 è§£å¯ |
| | | * @param {string} input 坿 16è¿å¶å符串 |
| | | * @param {string} key å¯é¥ 16åèå符串 |
| | | * @return ææ |
| | | */ |
| | | common.aes128EcbPkcs5PaddingDecrypt = function (input, key) { |
| | | key = common.hexStringToArrayBuffer(common.strToUtf8Hex(key)) |
| | | let res = common.aesEcb128Pkcs5PaddingDecode(common.hexStringToArrayBuffer(input), key) |
| | | return common.utf8HexToStr(common.arrayBufferToHexString(res)) |
| | | } |
| | | |
| | | /** |
| | | * @brief Stirng aes gcm å å¯ |
| | | * @param {string} plainText ææ |
| | | * @param {string} key å¯é¥ |
| | | * @returns {object} {cipherData: ArrayBuffer, key: String, iv: ArrayBuffer, tag: ArrayBuffer} |
| | | */ |
| | | common.aes128GcmEncrypt = function (plainText, key) { |
| | | return commonObj.aes128GcmEncrypt(plainText, key) |
| | | } |
| | | |
| | | /** |
| | | * @brief Stirng aes gcm è§£å¯ |
| | | * @param {ArrayBuffer} cipherData 坿 |
| | | * @param {string} key å¯é¥ |
| | | * @param {ArrayBuffer} iv iv |
| | | * @param {ArrayBuffer} tag tag |
| | | */ |
| | | common.aes128GcmDecrypt = function (chiperData, key, iv, tag) { |
| | | return commonObj.aes128GcmDecrypt(chiperData, key, iv, tag) |
| | | } |
| | | |
| | | /** |
| | | * æ§è¡æä½ç³»ç»çå½ä»¤ |
| | | * @param {*} cmd å½ä»¤ |
| | | * @returns |
| | | */ |
| | | common.system = function (cmd) { |
| | | return commonObj.system(cmd) |
| | | } |
| | | |
| | | /** |
| | | * æ§è¡æä½ç³»ç»çå½ä»¤ |
| | | * @param {*} cmd å½ä»¤ æä½ç³»ç»å¸¸ç¨æä»¤(linuxç»å¤§é¨åæä»¤é½æ¯æ)ï¼å¿
å¡« |
| | | * @returns |
| | | */ |
| | | common.systemBrief = function (cmd) { |
| | | return commonObj.systemBrief(cmd) |
| | | } |
| | | |
| | | /** |
| | | * æ§è¡æä½ç³»ç»çå½ä»¤å¹¶è¿åç»æ |
| | | * @param {*} cmd å½ä»¤ æä½ç³»ç»å¸¸ç¨æä»¤(linuxç»å¤§é¨åæä»¤é½æ¯æ)ï¼å¿
å¡« |
| | | * @param {*} resLen æ¥æ¶æ°æ®é¿åº¦ ææ¶åè¿åçæ°æ®å¾å¤§ï¼å¯ä»¥éè¿è¿ä¸ªå¼æ¥è¿ååºå®é¿åº¦çæ°æ®ï¼å¿
å¡« |
| | | * @returns |
| | | */ |
| | | common.systemWithRes = function (cmd, resLen) { |
| | | return commonObj.systemWithRes(cmd, resLen) |
| | | } |
| | | |
| | | /** |
| | | * æ§è¡æä½ç³»ç»çå½ä»¤é»å¡æ§è¡ |
| | | * @param {*} cmd å½ä»¤ æä½ç³»ç»å¸¸ç¨æä»¤(linuxç»å¤§é¨åæä»¤é½æ¯æ)ï¼å¿
å¡« |
| | | * @returns |
| | | */ |
| | | common.systemBlocked = function (cmd) { |
| | | return commonObj.systemBlocked(cmd) |
| | | } |
| | | |
| | | /** |
| | | * 弿¥å»¶è¿éå¯ |
| | | * @param {*} delay_s å»¶è¿æ¶é´ |
| | | * @returns |
| | | */ |
| | | common.asyncReboot = function (delay_s) { |
| | | return commonObj.asyncReboot(delay_s) |
| | | } |
| | | |
| | | /** |
| | | * bccæ ¡éª |
| | | * @param {array} data eg:[49,50,51,52,53,54]对åºç弿¯7 |
| | | * @returns æ ¡éªè®¡ç®ç»æ |
| | | */ |
| | | common.calculateBcc = function (data) { |
| | | return commonObj.calculateBcc(data) |
| | | } |
| | | |
| | | /** |
| | | * crcæ ¡éª æ¯å¦å符串'123456'æ ¡éªè®¡ç®çç»ææ¯æ°å 158520161 |
| | | * @param {string} content è¦æ ¡éªçåç¬¦ä¸²æ°æ®ï¼ |
| | | * @returns |
| | | */ |
| | | common.crc32 = function (content) { |
| | | if (content === undefined || content === null || typeof (content) != "string" || content.length < 1) { |
| | | throw new Error("dxCommon.crc32:'content' paramter should not be empty") |
| | | } |
| | | return commonObj.crc32(content) |
| | | } |
| | | |
| | | /** |
| | | * 计ç®MD5åå¸ï¼æ¯å¦'123456'对åºçæ°åæ°ç»æ¯[49,50,51,52,53,54] 对åºçmd5æ¯'e10adc3949ba59abbe56e057f20f883e'ï¼ |
| | | * 使¯è¿åç䏿¯16è¿å¶åç¬¦ä¸²ï¼æ¯æ°åæ°ç»ï¼å¯ä»¥ä½¿ç¨arrToHex彿°è½¬æ¢ |
| | | * @param {array} arr æ°åæ°ç» |
| | | * @returns æ°åæ°ç» |
| | | */ |
| | | common.md5Hash = function (arr) { |
| | | return commonObj.md5Hash(arr) |
| | | } |
| | | |
| | | /** |
| | | * æä»¶è®¡ç®MD5åå¸,æ¯å¦æä»¶éçå
容æ¯'123456'ï¼å¯¹åºçmd5æ¯'e10adc3949ba59abbe56e057f20f883e' |
| | | * 使¯è¿åç䏿¯16è¿å¶åç¬¦ä¸²ï¼æ¯æ°åæ°ç»ï¼å¯ä»¥ä½¿ç¨arrToHex彿°è½¬æ¢ |
| | | * @param {string} æä»¶è·¯å¾ï¼ç»å¯¹è·¯å¾ï¼å¿
å¡«ï¼é常æ¯ä»¥/app/codeå¼å¤´ |
| | | * @returns æ°åæ°ç» |
| | | */ |
| | | common.md5HashFile = function (filePath) { |
| | | if (filePath === undefined || filePath === null || typeof (filePath) != "string") { |
| | | return null |
| | | } |
| | | return commonObj.md5HashFile(filePath) |
| | | } |
| | | |
| | | /** |
| | | * 计ç®HMAC MD5å å¯,æ¯å¦å å¯çæ°æ®æ¯'123456',å¯é¥æ¯'654321'ï¼å¯¹åºçç»ææ¯'357cbe6d81a8ec770799879dc8629a53' |
| | | * 使¯åæ°åè¿åçå¼é½æ¯ArrayBuffer |
| | | * @param {ArrayBuffer} data éè¦å å¯çå
容,å¿
å¡« |
| | | * @param {ArrayBuffer} key å¯é¥ ,å¿
å¡« |
| | | * @returns ArrayBuffer |
| | | */ |
| | | common.hmacMd5Hash = function (data, key) { |
| | | return commonObj.hmacMd5Hash(data, key) |
| | | } |
| | | |
| | | /** |
| | | * 计ç®HMAC MD5å å¯,æ¯å¦å å¯çæ°æ®æ¯'123456',å¯é¥æ¯'654321'ï¼å¯¹åºçç»ææ¯'357cbe6d81a8ec770799879dc8629a53' |
| | | * @param {string} data éè¦å å¯çå
容,å¿
å¡« |
| | | * @param {string} key å¯é¥ ,å¿
å¡« |
| | | * @returns ArrayBuffer |
| | | */ |
| | | common.hmac = function (data, key) { |
| | | return commonObj.hmac(data, key) |
| | | } |
| | | |
| | | /** |
| | | * æä»¶è®¡ç®HMAC MD5å å¯ï¼æ¯å¦æä»¶éçå
容æ¯'123456'ï¼å¯é¥æ¯'654321'ï¼å¯¹åºçç»ææ¯'357cbe6d81a8ec770799879dc8629a53' |
| | | * @param {string} filePath éè¦å å¯çå
容åå¨çæä»¶è·¯å¾ï¼ç»å¯¹è·¯å¾ï¼å¿
å¡«ï¼é常æ¯ä»¥/app/codeå¼å¤´ |
| | | * @param {array} key å¯é¥ ,æ°åæ°ç»,å¿
å¡« |
| | | * @returns æ°åæ°ç» |
| | | */ |
| | | common.hmacMd5HashFile = function (filePath, key) { |
| | | return commonObj.hmacMd5HashFile(filePath, key) |
| | | } |
| | | |
| | | |
| | | /** |
| | | * base64转binæä»¶ |
| | | * @param {string} file_path æä»¶è·¯å¾ï¼å¿
å¡« |
| | | * @param {string} base64Data base64æ°æ®ï¼å¿
å¡« |
| | | * @returns |
| | | */ |
| | | common.base64_2binfile = function (file_path, base64Data) { |
| | | return commonObj.base64_2binfile(file_path, base64Data); |
| | | } |
| | | |
| | | /** |
| | | * binæä»¶è½¬base64 |
| | | * @param {string} file_path æä»¶è·¯å¾ï¼å¿
å¡« |
| | | * @returns base64Data base64æ°æ®ï¼å¿
å¡« |
| | | */ |
| | | common.binfile_2base64 = function (file_path) { |
| | | return commonObj.binfile_2base64(file_path); |
| | | } |
| | | |
| | | /** |
| | | * åæ¢è®¾å¤æ¨¡å¼ |
| | | * @description 模å¼åæ¢åä¼éå¯è®¾å¤ï¼è¿å
¥æå®æ¨¡å¼ï¼ä½¿ç¨æ¹æ³æ¶é宿´ç»´æ¤ç¸äºåæ¢çé»è¾ï¼åæ¢ä¸ºä¸å¡æ¨¡å¼åä¸è½ä½¿ç¨IDEåè½ |
| | | * @param {number} mode 注æï¼æ§çæ¬æ¨¡å¼åæ¢ä½¿ç¨ï¼1ã2ã3ï¼ï¼æ°çæ¬æ¨¡å¼åæ¢ä½¿ç¨ï¼devãtestãprodãsafeï¼ |
| | | * @returns true false |
| | | */ |
| | | common.setMode = function (mode) { |
| | | // 注æï¼æ§çæ¬æ¨¡å¼åæ¢ä½¿ç¨ï¼1ã2ã3ï¼ |
| | | if (mode == 1) { |
| | | //çäº§æ¨¡å¼ |
| | | commonObj.systemWithRes(`echo 'app' > /etc/.mode`, 2) |
| | | // 1.0çæ¬åæ¢ä¸ºå
¶ä»æ¨¡å¼åå é¤å·¥åæ£æµï¼åç»çæ¬å¯è½ä¼è°æ´ï¼ |
| | | commonObj.systemWithRes(`rm -rf /test`, 2) |
| | | } else if (mode == 2) { |
| | | //è°è¯æ¨¡å¼ |
| | | commonObj.systemWithRes(`echo 'debug' > /etc/.mode`, 2) |
| | | // 1.0çæ¬åæ¢ä¸ºå
¶ä»æ¨¡å¼åå é¤å·¥åæ£æµï¼åç»çæ¬å¯è½ä¼è°æ´ï¼ |
| | | commonObj.systemWithRes(`rm -rf /test`, 2) |
| | | } else if (mode == 3) { |
| | | //è¯äº§æ¨¡å¼ |
| | | commonObj.systemWithRes(`echo 'pp' > /etc/.mode`, 2) |
| | | } |
| | | |
| | | // 注æï¼æ°çæ¬æ¨¡å¼åæ¢ä½¿ç¨ï¼devãtestãprodãsafeï¼ |
| | | else if (mode == "dev") { |
| | | //å¼åæ¨¡å¼ |
| | | commonObj.systemWithRes(`echo 'dev' > /etc/.mode_v1`, 2) |
| | | } else if (mode == "test") { |
| | | //æµè¯æ¨¡å¼ï¼è¯äº§æ¨¡å¼ï¼ |
| | | commonObj.systemWithRes(`echo 'test' > /etc/.mode_v1`, 2) |
| | | } else if (mode == "prod") { |
| | | //çäº§æ¨¡å¼ |
| | | commonObj.systemWithRes(`echo 'prod' > /etc/.mode_v1`, 2) |
| | | } else if (mode == "safe") { |
| | | //å®å
¨æ¨¡å¼ |
| | | commonObj.systemWithRes(`echo 'safe' > /etc/.mode_v1`, 2) |
| | | } else { |
| | | return false |
| | | } |
| | | commonObj.systemWithRes(`sync`, 2) |
| | | commonObj.asyncReboot(2) |
| | | return true |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢è®¾å¤æ¨¡å¼ |
| | | * @description è·å设å¤å½åæ¨¡å¼ |
| | | * @returns ä¸å¡æ¨¡å¼ï¼1ï¼å¼å模å¼ï¼2ï¼å·¥å模å¼ï¼28ï¼ å¼å¸¸æ¨¡å¼ï¼-1 |
| | | */ |
| | | common.getMode = function () { |
| | | let ret = commonObj.systemWithRes(`test -e "/etc/.mode" && echo "OK" || echo "NO"`, 2) |
| | | if (ret.includes('NO')) { |
| | | return 28 |
| | | } |
| | | let mode = commonObj.systemWithRes(`cat "/etc/.mode"`, 10) |
| | | if (mode.includes('app')) { |
| | | return 1 |
| | | } else if (mode.includes('debug')) { |
| | | return 2 |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | /** |
| | | * åå
è¿å¶è½¬åèæ°ç» eg:313233616263->[49,50,51,97,98,99] |
| | | * @param {string} str 16è¿å¶å符串 å°åä¸ä¸é´æ 空éçåå
è¿å¶å符串 |
| | | * @returns æ°åæ°å |
| | | */ |
| | | common.hexToArr = function (str) { |
| | | if (str === undefined || str === null || (typeof str) != 'string' || str.length < 1) { |
| | | throw new Error("dxCommon.hexToArr:'str' parameter should not be empty") |
| | | } |
| | | let regex = /.{2}/g; |
| | | let arr = str.match(regex); |
| | | return arr.map(item => parseInt(item, 16)); |
| | | } |
| | | /** |
| | | * åèæ°ç»è½¬åå
è¿å¶ eg:[49,50,51,97,98,99]->313233616263 |
| | | * @param {array}numbers æ°åæ°ç» |
| | | * @returns str 16è¿å¶å符串 å°åä¸ä¸é´æ 空éçåå
è¿å¶å符串 |
| | | */ |
| | | common.arrToHex = function (numbers) { |
| | | const hexArray = numbers.map(num => num.toString(16).padStart(2, '0').toLowerCase()); |
| | | const hexString = hexArray.join(''); |
| | | return hexString; |
| | | } |
| | | /** |
| | | * åå
è¿å¶è½¬å符串 eg:313233616263->123abc |
| | | * 注æå¦æ16è¿å¶å符串æ¯ç±ä¸æè½¬è¿å»çï¼å转å䏿åç¬¦ä¸²ä¼æä¹±ç ï¼å 为æ¯ä¸ä¸ªä¸ä¸ªåèçè½¬æ¢ |
| | | * @param {string} str è¦è½¬ç16è¿å¶å符串 |
| | | * @returns |
| | | */ |
| | | common.hexToString = function (str) { |
| | | let regex = /.{2}/g; |
| | | let arr = str.match(regex); |
| | | arr = arr.map(item => String.fromCharCode(parseInt(item, 16))); |
| | | return arr.join(""); |
| | | } |
| | | // å°å符串转æ¢ä¸º UTF-8 ç¼ç ç16è¿å¶å符串 |
| | | common.strToUtf8Hex = function (str) { |
| | | const bytes = []; |
| | | for (let i = 0; i < str.length; i++) { |
| | | let code = str.charCodeAt(i); |
| | | if (code < 0x80) { |
| | | bytes.push(code); |
| | | } else if (code < 0x800) { |
| | | bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f)); |
| | | } else if (code < 0xd800 || code >= 0xe000) { |
| | | bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f)); |
| | | } else { |
| | | // å¤ç Unicode ç¼ç |
| | | i++; |
| | | code = 0x10000 + (((code & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff)); |
| | | bytes.push( |
| | | 0xf0 | (code >> 18), |
| | | 0x80 | ((code >> 12) & 0x3f), |
| | | 0x80 | ((code >> 6) & 0x3f), |
| | | 0x80 | (code & 0x3f) |
| | | ); |
| | | } |
| | | } |
| | | return this.arrToHex(bytes); |
| | | } |
| | | /** |
| | | * ä¼ éè¿æ¥çutf-8ç16è¿å¶åç¬¦ä¸²è½¬æ¢æå符串 |
| | | * @param {string} hex |
| | | * @returns |
| | | */ |
| | | common.utf8HexToStr = function (hex) { |
| | | let array = this.hexToArr(hex) |
| | | var out, i, len, c; |
| | | var char2, char3; |
| | | |
| | | out = ""; |
| | | len = array.length; |
| | | i = 0; |
| | | while (i < len) { |
| | | c = array[i++]; |
| | | switch (c >> 4) { |
| | | case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: |
| | | // 0xxxxxxx |
| | | out += String.fromCharCode(c); |
| | | break; |
| | | case 12: case 13: |
| | | // 110x xxxx 10xx xxxx |
| | | char2 = array[i++]; |
| | | out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); |
| | | break; |
| | | case 14: |
| | | // 1110 xxxx 10xx xxxx 10xx xxxx |
| | | char2 = array[i++]; |
| | | char3 = array[i++]; |
| | | out += String.fromCharCode(((c & 0x0F) << 12) | |
| | | ((char2 & 0x3F) << 6) | |
| | | ((char3 & 0x3F) << 0)); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | return out; |
| | | } |
| | | /** |
| | | * å符串转åå
è¿å¶ eg:123abc->313233616263 |
| | | * @param {string} str è¦è½¬çå符串 |
| | | * @returns |
| | | */ |
| | | common.stringToHex = function (str) { |
| | | if (str === undefined || str === null || typeof (str) != "string") { |
| | | return null |
| | | } |
| | | let val = ""; |
| | | for (let i = 0; i < str.length; i++) { |
| | | val += str.charCodeAt(i).toString(16) |
| | | } |
| | | return val |
| | | } |
| | | |
| | | /** |
| | | * å°ç«¯æ ¼å¼è½¬åè¿å¶æ° eg:001001->69632 |
| | | * @param {string} hexString 16è¿å¶å符串 å°åä¸ä¸é´æ 空éçåå
è¿å¶å符串 |
| | | * @returns æ°å |
| | | */ |
| | | common.littleEndianToDecimal = function (hexString) { |
| | | // å°å°ç«¯æ ¼å¼çåå
è¿å¶å符串è¿è¡å转 |
| | | let reversedHexString = hexString |
| | | .match(/.{2}/g) // æ¯ä¸¤ä¸ªå符åé |
| | | .reverse() // å转æ°ç» |
| | | .join(""); // å并为å符串 |
| | | |
| | | // å°å转åçåå
è¿å¶å符串转æ¢ä¸ºåè¿å¶æ° |
| | | let decimal = parseInt(reversedHexString, 16); |
| | | return decimal; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * åè¿å¶æ°è½¬æ¢ä¸º16è¿å¶å°ç«¯æ ¼å¼å符串 |
| | | * eg:300->2c01 |
| | | * eg:230->e600 |
| | | * @param {number} decimalNumber åè¿å¶æ°å,å¿
å¡« |
| | | * @param {number} byteSize çæä½æ° åèç个æ°ï¼å¦æè¶
åºå®é
åè个æ°ï¼ä¼å¨å³è¾¹è¡¥0ï¼ä½äºä¼æªåï¼éå¿
å¡«ï¼ç¼ºçæ¯2 |
| | | * @returns |
| | | */ |
| | | common.decimalToLittleEndianHex = function (decimalNumber, byteSize) { |
| | | if (decimalNumber === undefined || decimalNumber === null || (typeof decimalNumber) != 'number') { |
| | | throw new Error("dxCommon.decimalToLittleEndianHex:'decimalNumber' parameter should be number") |
| | | } |
| | | if (byteSize === undefined || byteSize === null || (typeof byteSize) != 'number' || byteSize <= 0) { |
| | | byteSize = 2 |
| | | } |
| | | const littleEndianBytes = []; |
| | | for (let i = 0; i < byteSize; i++) { |
| | | littleEndianBytes.push(decimalNumber & 0xFF); |
| | | decimalNumber >>= 8;//ç¸å½äºé¤ä»¥256 |
| | | } |
| | | const littleEndianHex = littleEndianBytes |
| | | .map((byte) => byte.toString(16).padStart(2, '0')) |
| | | .join(''); |
| | | return littleEndianHex; |
| | | } |
| | | |
| | | /** |
| | | * å°16è¿å¶å符串转æ¢ä¸ºArrayBuffer |
| | | * @param {*} hexString è¦è½¬æ¢ç16è¿å¶å符串 |
| | | * @returns |
| | | */ |
| | | common.hexStringToArrayBuffer = function (hexString) { |
| | | return this.hexStringToUint8Array(hexString).buffer; |
| | | } |
| | | |
| | | /** |
| | | * å°16è¿å¶å符串转æ¢ä¸ºUint8Array |
| | | * @param {string} hexString è¦è½¬æ¢ç16è¿å¶å符串ï¼å°åä¸ä¸é´æ 空éçåå
è¿å¶å符串 |
| | | * @returns Uint8Array对象 |
| | | */ |
| | | common.hexStringToUint8Array = function (hexString) { |
| | | if (hexString === undefined || hexString === null || (typeof hexString) != 'string' || hexString.length <= 0) { |
| | | throw new Error("dxCommon.hexStringToUint8Array:'hexString' parameter should not be empty") |
| | | } |
| | | let byteString = hexString.match(/.{1,2}/g); |
| | | let byteArray = byteString.map(function (byte) { |
| | | return parseInt(byte, 16); |
| | | }); |
| | | let buffer = new Uint8Array(byteArray); |
| | | return buffer; |
| | | } |
| | | |
| | | /** |
| | | * å° ArrayBuffer 转æ¢ä¸ºåå
è¿å¶åç¬¦ä¸²æ ¼å¼ |
| | | * @param {ArrayBuffer} buffer |
| | | * @returns å°åä¸ä¸é´æ 空éçåå
è¿å¶å符串 |
| | | */ |
| | | common.arrayBufferToHexString = function (buffer) { |
| | | return this.uint8ArrayToHexString(new Uint8Array(buffer)) |
| | | } |
| | | /** |
| | | * å° Uint8Array 转æ¢ä¸ºåå
è¿å¶åç¬¦ä¸²æ ¼å¼ |
| | | * @param {Uint8Array} array |
| | | * @returns å°åä¸ä¸é´æ 空éçåå
è¿å¶å符串 |
| | | */ |
| | | common.uint8ArrayToHexString = function (array) { |
| | | let hexString = ''; |
| | | for (let i = 0; i < array.length; i++) { |
| | | const byte = array[i].toString(16).padStart(2, '0'); |
| | | hexString += byte; |
| | | } |
| | | return hexString |
| | | } |
| | | /** |
| | | * 设置/è·åç»ä»¶å¥æidéç¨æ¹æ³ |
| | | * @param {string} name ç»ä»¶åï¼å¿
å¡« |
| | | * @param {string} id 奿idï¼éå¿
å¡« |
| | | * @param {number} pointer 奿æéæ°åï¼éå¿
å¡« |
| | | * @returns |
| | | */ |
| | | common.handleId = function (name, id, pointer) { |
| | | // ç»ä»¶åä¸è½ä¸ºç©º |
| | | if (name === undefined || name === null || name === "" || typeof name !== 'string') { |
| | | return |
| | | } |
| | | let map = dxMap.get('handleIds') |
| | | // 奿id |
| | | if (id === undefined || id === null || id === "" || typeof id !== 'string') { |
| | | id = "__" + name + "_default" |
| | | } |
| | | if (pointer === undefined || pointer === null || typeof pointer !== 'number') { |
| | | // pointer为空å为è·å |
| | | return map.get(id) |
| | | } else { |
| | | // pointerä¸ä¸ºç©ºå为设置 |
| | | let isExist = map.get(id) |
| | | if (isExist) { |
| | | // 奿已åå¨ |
| | | return |
| | | } |
| | | map.put(id, pointer) |
| | | } |
| | | } |
| | | |
| | | |
| | | export default common |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * Common Utils Module based on the native common_utils_bridge C library. |
| | | * |
| | | * This module provides a collection of common utilities organized into namespaces. |
| | | * It is designed as a stateless, singleton-like utility library. |
| | | * |
| | | * Features: |
| | | * - `crypto`: Hashing (MD5, HMAC-MD5), symmetric encryption (AES), |
| | | * and asymmetric encryption (RSA). |
| | | * - `fs`: File system operations, such as converting files to/from Base64. |
| | | * - `codec`: Data encoding and decoding functions (Hex, Base64, UTF-8, etc.). |
| | | * - `random`: Generation of cryptographically secure random bytes and simple |
| | | * random strings. |
| | | * |
| | | * Usage: |
| | | * import dxCommonUtils from './dxCommonUtils.js'; |
| | | * const md5Hash = dxCommonUtils.crypto.md5('hello'); |
| | | * |
| | | * Doc/Demo: https://github.com/DejaOS/DejaOS |
| | | */ |
| | | import { commonUtilsClass } from './libvbar-m-dxcommonutils.so' |
| | | |
| | | const dxCommonUtils = {}; |
| | | |
| | | // ----------- Constants & Enums ------------------- |
| | | dxCommonUtils.AES_MODE = { |
| | | ECB: 'ECB', |
| | | CBC: 'CBC', |
| | | CFB: 'CFB', |
| | | OFB: 'OFB', |
| | | CTR: 'CTR' |
| | | }; |
| | | |
| | | dxCommonUtils.AES_KEY_SIZE = { |
| | | BITS_128: 128, |
| | | BITS_192: 192, |
| | | BITS_256: 256 |
| | | }; |
| | | |
| | | dxCommonUtils.AES_PADDING = { |
| | | PKCS7: 'PKCS7', |
| | | NONE: 'NoPadding' |
| | | }; |
| | | |
| | | dxCommonUtils.RSA_KEY_SIZE = { |
| | | BITS_1024: 1024, |
| | | BITS_2048: 2048, |
| | | BITS_4096: 4096 |
| | | }; |
| | | |
| | | const utils = new commonUtilsClass(); |
| | | |
| | | // ----------- Crypto Namespace ------------------- |
| | | dxCommonUtils.crypto = {}; |
| | | dxCommonUtils.crypto.aes = {}; |
| | | dxCommonUtils.crypto.rsa = {}; |
| | | |
| | | /** |
| | | * Calculates MD5 hash of the input string. |
| | | * @param {string|ArrayBuffer|Uint8Array} data - The data to hash. If a string is provided, it will be treated as UTF-8. |
| | | * @returns {string} MD5 hash in hexadecimal format. |
| | | */ |
| | | dxCommonUtils.crypto.md5 = function (data) { |
| | | const buffer = _normalizeDataToBuffer(data, false, 'Data'); |
| | | return utils.md5(buffer); |
| | | } |
| | | |
| | | /** |
| | | * Calculates HMAC-MD5 hash using the provided key. |
| | | * @param {string|ArrayBuffer|Uint8Array} data - The data to hash. If a string is provided, it will be treated as UTF-8. |
| | | * @param {string|ArrayBuffer|Uint8Array} key - The secret key for HMAC. If a string is provided, it will be treated as UTF-8. |
| | | * @returns {string} HMAC-MD5 hash in hexadecimal format. |
| | | */ |
| | | dxCommonUtils.crypto.hmacMd5 = function (data, key) { |
| | | const dataBuffer = _normalizeDataToBuffer(data, false, 'Data'); |
| | | const keyBuffer = _normalizeDataToBuffer(key, false, 'Key'); |
| | | return utils.hmacMd5(dataBuffer, keyBuffer); |
| | | } |
| | | |
| | | /** |
| | | * Calculates a hash of the input data using the specified algorithm. |
| | | * @param {string|ArrayBuffer|Uint8Array} data - The data to hash. If a string is provided, it will be treated as UTF-8. |
| | | * @param {string} [hashAlgorithm='SHA-256'] - The hash algorithm to use (e.g., 'SHA-256', 'MD5', 'SHA1', 'SHA-384', 'SHA-512'). |
| | | * @returns {string} The hash in hexadecimal format. |
| | | */ |
| | | dxCommonUtils.crypto.hash = function (data, hashAlgorithm = 'SHA-256') { |
| | | const buffer = _normalizeDataToBuffer(data, false, 'Data'); |
| | | return utils.hash(buffer, hashAlgorithm); |
| | | } |
| | | |
| | | /** |
| | | * Encrypts data using AES encryption. |
| | | * @param {string|ArrayBuffer|Uint8Array} data - The data to encrypt. If a string is provided, it will be treated as UTF-8. |
| | | * @param {string|ArrayBuffer|Uint8Array} key - The encryption key. Can be a hex string, an ArrayBuffer, or a Uint8Array. |
| | | * @param {object} options - Encryption options. |
| | | * @param {string} [options.mode='CBC'] - The AES mode, from dxCommonUtils.AES_MODE. |
| | | * @param {number} [options.keySize=256] - The key size in bits (128, 192, or 256), from dxCommonUtils.AES_KEY_SIZE. |
| | | * @param {string|ArrayBuffer|Uint8Array} [options.iv] - The initialization vector (required for non-ECB modes). This is ignored if useSalt is true. |
| | | * @param {string} [options.padding='PKCS7'] - The padding scheme, from dxCommonUtils.AES_PADDING. Defaults to PKCS7. |
| | | * @param {boolean} [options.useSalt=false] - If true, generates an OpenSSL-compatible salted ciphertext. The provided 'key' is used as a password (UTF-8 string) to derive the actual key and IV. |
| | | * @returns {string} The encrypted data as a Base64 string. |
| | | */ |
| | | dxCommonUtils.crypto.aes.encrypt = function (data, key, options = {}) { |
| | | // Set default options, including PKCS7 padding by default |
| | | const finalOptions = Object.assign({ |
| | | mode: dxCommonUtils.AES_MODE.CBC, |
| | | keySize: 256, |
| | | padding: dxCommonUtils.AES_PADDING.PKCS7, |
| | | useSalt: false // Default to false for backward compatibility |
| | | }, options); |
| | | |
| | | let keyBuffer; |
| | | if (finalOptions.useSalt) { |
| | | // In salted mode, a string key is treated as a password (UTF-8). |
| | | keyBuffer = _normalizeDataToBuffer(key, false, 'Key'); |
| | | } else { |
| | | // In non-salted mode, a string key is treated as a raw key in hex format. |
| | | keyBuffer = _normalizeHexInput(key, 'Key'); |
| | | |
| | | // Key length must be validated for non-salted keys. |
| | | const expectedKeyLength = finalOptions.keySize / 8; |
| | | if (keyBuffer.byteLength !== expectedKeyLength) { |
| | | throw new Error(`Key length must be ${expectedKeyLength} bytes for ${finalOptions.keySize}-bit AES`); |
| | | } |
| | | } |
| | | |
| | | // Validate mode and keySize |
| | | if (!Object.values(dxCommonUtils.AES_MODE).includes(finalOptions.mode)) { |
| | | throw new Error("options.mode must be one of dxCommonUtils.AES_MODE values"); |
| | | } |
| | | if (!Object.values(dxCommonUtils.AES_KEY_SIZE).includes(finalOptions.keySize)) { |
| | | throw new Error("options.keySize must be one of dxCommonUtils.AES_KEY_SIZE values"); |
| | | } |
| | | |
| | | // Validate padding |
| | | if (finalOptions.padding !== undefined) { |
| | | if (typeof finalOptions.padding !== 'string' || !Object.values(dxCommonUtils.AES_PADDING).includes(finalOptions.padding)) { |
| | | throw new Error("options.padding must be one of dxCommonUtils.AES_PADDING values"); |
| | | } |
| | | if (finalOptions.padding === dxCommonUtils.AES_PADDING.NONE) { |
| | | const dataBuffer = _normalizeDataToBuffer(data, false, 'Data'); |
| | | if (dataBuffer.byteLength % 16 !== 0) { |
| | | throw new Error("Data length must be a multiple of 16 bytes when using NoPadding"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | const ivBuffer = (finalOptions.iv && !finalOptions.useSalt) ? _normalizeHexInput(finalOptions.iv) : null; |
| | | const dataBuffer = _normalizeDataToBuffer(data, false, 'Data'); |
| | | |
| | | const encrypted = utils.aesEncrypt(dataBuffer, keyBuffer, { ...finalOptions, iv: ivBuffer }); |
| | | if (encrypted === null) { |
| | | throw new Error("AES encryption failed. Check parameters."); |
| | | } |
| | | return dxCommonUtils.codec.arrayBufferToBase64(encrypted); |
| | | }; |
| | | |
| | | /** |
| | | * Decrypts data using AES encryption. |
| | | * Note: This function automatically handles OpenSSL's "Salted__" format if present in the encrypted data. |
| | | * @param {string|ArrayBuffer|Uint8Array} encryptedData - The encrypted data. If a string, it is assumed to be Base64. |
| | | * @param {string|ArrayBuffer|Uint8Array} key - The decryption key. If a string, it will be treated as a password (UTF-8) for salted data, or as a hex string for non-salted data. |
| | | * @param {object} options - Decryption options. |
| | | * @param {string} [options.mode='CBC'] - The AES mode, from dxCommonUtils.AES_MODE. |
| | | * @param {number} [options.keySize=256] - The key size in bits (128, 192, or 256), from dxCommonUtils.AES_KEY_SIZE. This is also used for key derivation in "Salted__" format. |
| | | * @param {string|ArrayBuffer|Uint8Array} [options.iv] - The initialization vector (required for non-ECB modes and non-salted data). If a string, it must be Hex. |
| | | * @param {string} [options.padding='PKCS7'] - The padding scheme, from dxCommonUtils.AES_PADDING. Defaults to PKCS7. |
| | | * @returns {ArrayBuffer|null} The decrypted data as an ArrayBuffer. Returns null on decryption failure (e.g., bad key or padding). |
| | | */ |
| | | dxCommonUtils.crypto.aes.decrypt = function (encryptedData, key, options = {}) { |
| | | // Set default options, including PKCS7 padding by default |
| | | const finalOptions = Object.assign({ |
| | | mode: dxCommonUtils.AES_MODE.CBC, |
| | | keySize: 256, |
| | | padding: dxCommonUtils.AES_PADDING.PKCS7 |
| | | }, options); |
| | | |
| | | // Validate mode and keySize |
| | | if (!Object.values(dxCommonUtils.AES_MODE).includes(finalOptions.mode)) { |
| | | throw new Error("options.mode must be one of dxCommonUtils.AES_MODE values"); |
| | | } |
| | | if (!Object.values(dxCommonUtils.AES_KEY_SIZE).includes(finalOptions.keySize)) { |
| | | throw new Error("options.keySize must be one of dxCommonUtils.AES_KEY_SIZE values"); |
| | | } |
| | | |
| | | // Validate padding |
| | | if (finalOptions.padding !== undefined) { |
| | | if (typeof finalOptions.padding !== 'string' || !Object.values(dxCommonUtils.AES_PADDING).includes(finalOptions.padding)) { |
| | | throw new Error("options.padding must be one of dxCommonUtils.AES_PADDING values"); |
| | | } |
| | | } |
| | | |
| | | const encryptedDataBuffer = _normalizeDataToBuffer(encryptedData, true); // true for base64 |
| | | |
| | | // Auto-detect if the data is in OpenSSL's "Salted__" format |
| | | let isSalted = false; |
| | | if (encryptedDataBuffer.byteLength >= 16) { |
| | | const header = new Uint8Array(encryptedDataBuffer, 0, 8); |
| | | // "Salted__" in ASCII: 83 97 108 116 101 100 95 95 |
| | | const saltedHeader = new Uint8Array([83, 97, 108, 116, 101, 100, 95, 95]); |
| | | isSalted = header.every((value, index) => value === saltedHeader[index]); |
| | | } |
| | | |
| | | let keyBuffer; |
| | | if (isSalted) { |
| | | // If data is salted, a string key is treated as a password (UTF-8). |
| | | keyBuffer = _normalizeDataToBuffer(key, false, 'Key'); |
| | | } else { |
| | | // If data is not salted, a string key is treated as a raw key in hex format. |
| | | keyBuffer = _normalizeHexInput(key, 'Key'); |
| | | |
| | | // Key length must be validated for non-salted keys. |
| | | const expectedKeyLength = finalOptions.keySize / 8; |
| | | if (keyBuffer.byteLength !== expectedKeyLength) { |
| | | throw new Error(`Key length must be ${expectedKeyLength} bytes for ${finalOptions.keySize}-bit AES`); |
| | | } |
| | | } |
| | | |
| | | const ivBuffer = finalOptions.iv ? _normalizeHexInput(finalOptions.iv) : null; |
| | | |
| | | return utils.aesDecrypt(encryptedDataBuffer, keyBuffer, { ...finalOptions, iv: ivBuffer }); |
| | | }; |
| | | |
| | | /** |
| | | * Convenience method for AES-256-CBC encryption with automatic IV generation. |
| | | * The key is treated as a Hex string. The plaintext data is treated as a UTF-8 string. |
| | | * @param {string} data - The UTF-8 data to encrypt. |
| | | * @param {string|ArrayBuffer|Uint8Array} key - The encryption key (32 bytes). If a string, it must be Hex. |
| | | * @returns {{encrypted: string, iv: string}} Object containing Base64 encrypted data and the generated IV as a hex string. |
| | | */ |
| | | dxCommonUtils.crypto.aes.encryptWithRandomIV = function (data, key) { |
| | | if (typeof data !== 'string') { |
| | | throw new Error('Data must be a UTF-8 string for this convenience function.'); |
| | | } |
| | | |
| | | const keyBuffer = _normalizeHexInput(key, 'Key'); |
| | | if (keyBuffer.byteLength !== 32) { |
| | | throw new Error('Key must be 32 bytes for AES-256'); |
| | | } |
| | | |
| | | // 1. Generate 16 random bytes, returned directly as a hex string. |
| | | const ivHex = dxCommonUtils.random.getBytes(16); |
| | | |
| | | // 2. Encrypt using the main AES function. |
| | | const encrypted = dxCommonUtils.crypto.aes.encrypt(data, keyBuffer, { |
| | | mode: 'CBC', |
| | | keySize: 256, |
| | | iv: ivHex |
| | | }); |
| | | |
| | | // 3. Return the encrypted data and the hex-encoded IV. |
| | | return { |
| | | encrypted: encrypted, |
| | | iv: ivHex |
| | | }; |
| | | } |
| | | |
| | | /** |
| | | * Generates a new RSA key pair. |
| | | * @param {number} [bits=2048] - Key size in bits: 1024, 2048, or 4096. |
| | | * @returns {object} Object containing privateKey and publicKey in PEM format. |
| | | */ |
| | | dxCommonUtils.crypto.rsa.generateKeyPair = function (bits = 2048) { |
| | | if (![1024, 2048, 4096].includes(bits)) { |
| | | throw new Error('RSA key size must be 1024, 2048, or 4096 bits'); |
| | | } |
| | | return utils.generateRsaKeyPair(bits); |
| | | } |
| | | |
| | | /** |
| | | * Encrypts data using RSA public key. |
| | | * @param {string|ArrayBuffer|Uint8Array} data - The data to encrypt. If a string is provided, it will be treated as UTF-8. |
| | | * @param {string} publicKey - PEM formatted RSA public key. |
| | | * @returns {string} Base64 encoded encrypted data. |
| | | */ |
| | | dxCommonUtils.crypto.rsa.encrypt = function (data, publicKey) { |
| | | const dataBuffer = _normalizeDataToBuffer(data, false, 'Data'); |
| | | |
| | | if (typeof publicKey !== 'string') { |
| | | throw new Error('Public key must be a PEM string'); |
| | | } |
| | | if (!publicKey.includes('-----BEGIN PUBLIC KEY-----')) { |
| | | throw new Error('Public key must be in PEM format'); |
| | | } |
| | | return utils.rsaEncrypt(dataBuffer, publicKey); |
| | | } |
| | | |
| | | /** |
| | | * Decrypts RSA encrypted data using private key. |
| | | * @param {string} encryptedData - Base64 encoded encrypted data. |
| | | * @param {string} privateKey - PEM formatted RSA private key. |
| | | * @returns {ArrayBuffer|null} The decrypted data as an ArrayBuffer. Returns null on decryption failure. |
| | | */ |
| | | dxCommonUtils.crypto.rsa.decrypt = function (encryptedData, privateKey) { |
| | | if (typeof encryptedData !== 'string') { |
| | | throw new Error('Encrypted data must be a Base64 string'); |
| | | } |
| | | if (typeof privateKey !== 'string') { |
| | | throw new Error('Private key must be a PEM string'); |
| | | } |
| | | if (!privateKey.includes('-----BEGIN PRIVATE KEY-----')) { |
| | | throw new Error('Private key must be in PEM format'); |
| | | } |
| | | |
| | | // Decode the Base64 input to an ArrayBuffer before passing to native code. |
| | | const encryptedBuffer = dxCommonUtils.codec.base64ToArrayBuffer(encryptedData); |
| | | |
| | | // Pass the privateKey string directly, as the C layer expects a PEM string. |
| | | const decryptedBuffer = utils.rsaDecrypt(encryptedBuffer, privateKey); |
| | | if (!decryptedBuffer) { |
| | | // Return null instead of throwing to match AES behavior |
| | | return null; |
| | | } |
| | | |
| | | return decryptedBuffer; // Return the raw ArrayBuffer |
| | | }; |
| | | |
| | | /** |
| | | * Creates a digital signature for data using an RSA private key. |
| | | * This is the core function needed for standards like JWT (RS256/RS384/RS512). |
| | | * @param {string|ArrayBuffer|Uint8Array} data - The data to sign. If a string, it will be treated as UTF-8. |
| | | * @param {string} privateKey - The PEM formatted RSA private key. |
| | | * @param {string} [hashAlgorithm='SHA-256'] - The hash algorithm to use (e.g., 'SHA-256', 'SHA-384', 'SHA-512'). |
| | | * @returns {string} The signature as a Base64 encoded string. |
| | | */ |
| | | dxCommonUtils.crypto.rsa.sign = function (data, privateKey, hashAlgorithm = 'SHA-256') { |
| | | const dataBuffer = _normalizeDataToBuffer(data, false, 'Data'); |
| | | if (typeof privateKey !== 'string' || !privateKey.includes('-----BEGIN PRIVATE KEY-----')) { |
| | | throw new Error('Private key must be a PEM string'); |
| | | } |
| | | return utils.rsaSign(dataBuffer, privateKey, hashAlgorithm); |
| | | }; |
| | | |
| | | /** |
| | | * Verifies a digital signature using an RSA public key. |
| | | * This is the counterpart to `rsa.sign` and is used to validate signatures like those in JWT. |
| | | * @param {string|ArrayBuffer|Uint8Array} data - The original, unsigned data. |
| | | * @param {string|ArrayBuffer|Uint8Array} signature - The signature to verify. If a string, it must be Base64 encoded. |
| | | * @param {string} publicKey - The PEM formatted RSA public key. |
| | | * @param {string} [hashAlgorithm='SHA-256'] - The hash algorithm used for signing (e.g., 'SHA-256', 'SHA-384', 'SHA-512'). |
| | | * @returns {boolean} True if the signature is valid, otherwise false. |
| | | */ |
| | | dxCommonUtils.crypto.rsa.verify = function (data, signature, publicKey, hashAlgorithm = 'SHA-256') { |
| | | const dataBuffer = _normalizeDataToBuffer(data, false, 'Data'); |
| | | // The C layer expects a raw ArrayBuffer, so we decode the Base64 signature here in JS. |
| | | const signatureBuffer = _normalizeDataToBuffer(signature, true, 'Signature'); |
| | | if (typeof publicKey !== 'string' || !publicKey.includes('-----BEGIN PUBLIC KEY-----')) { |
| | | throw new Error('Public key must be a PEM string'); |
| | | } |
| | | return utils.rsaVerify(dataBuffer, signatureBuffer, publicKey, hashAlgorithm); |
| | | }; |
| | | |
| | | /** |
| | | * Parses a PEM formatted X.509 certificate and returns its details. |
| | | * @param {string} pemString - The certificate content in PEM format. |
| | | * @returns {object} An object containing certificate details: |
| | | * - serialNumber (string) |
| | | * - issuer (string) |
| | | * - subject (string) |
| | | * - validFrom (string) |
| | | * - validTo (string) |
| | | * - publicKey (string, in PEM format) |
| | | */ |
| | | dxCommonUtils.crypto.parsePEM = function (pemString) { |
| | | if (typeof pemString !== 'string' || !pemString.includes('-----BEGIN CERTIFICATE-----')) { |
| | | throw new Error('Input must be a PEM formatted certificate string'); |
| | | } |
| | | return utils.parsePEMCertificate(pemString); |
| | | }; |
| | | |
| | | /** |
| | | * Verifies if a certificate was signed by a given Certificate Authority (CA). |
| | | * @param {string} certPEM - The certificate to verify, in PEM format. |
| | | * @param {string} caCertPEM - The CA's certificate, in PEM format. |
| | | * @returns {boolean} True if the certificate is signed by the CA. |
| | | * @throws {Error} If the native verification fails due to parsing errors or signature mismatch. |
| | | */ |
| | | dxCommonUtils.crypto.verifyCertificate = function (certPEM, caCertPEM) { |
| | | if (typeof certPEM !== 'string' || !certPEM.includes('-----BEGIN CERTIFICATE-----')) { |
| | | throw new Error('Input certPEM must be a PEM formatted certificate string'); |
| | | } |
| | | if (typeof caCertPEM !== 'string' || !caCertPEM.includes('-----BEGIN CERTIFICATE-----')) { |
| | | throw new Error('Input caCertPEM must be a PEM formatted certificate string'); |
| | | } |
| | | return utils.verifyCertificate(certPEM, caCertPEM); |
| | | }; |
| | | |
| | | // ===================================================================================== |
| | | // == FS (File System) Namespace ===================================================== |
| | | // ===================================================================================== |
| | | dxCommonUtils.fs = {}; |
| | | |
| | | /** |
| | | * Reads the entire content of a file and returns it as a Base64 encoded string. |
| | | * @memberof dxCommonUtils.fs |
| | | * @param {string} filePath - The path to the file. |
| | | * @returns {string} The Base64 encoded content of the file. |
| | | */ |
| | | dxCommonUtils.fs.fileToBase64 = function (filePath) { |
| | | if (typeof filePath !== 'string' || filePath.length === 0) { |
| | | throw new Error("filePath must be a non-empty string."); |
| | | } |
| | | return utils.fileToBase64(filePath); |
| | | } |
| | | |
| | | /** |
| | | * Decodes a Base64 string and writes the binary data to a file. |
| | | * This will overwrite the file if it already exists. |
| | | * @memberof dxCommonUtils.fs |
| | | * @param {string} filePath - The path to the file to be written. |
| | | * @param {string} base64String - The Base64 encoded data. |
| | | * @returns {boolean} Returns true on success. |
| | | */ |
| | | dxCommonUtils.fs.base64ToFile = function (filePath, base64String) { |
| | | if (typeof filePath !== 'string' || filePath.length === 0) { |
| | | throw new Error("filePath must be a non-empty string."); |
| | | } |
| | | if (typeof base64String !== 'string') { |
| | | throw new Error("base64String must be a string."); |
| | | } |
| | | return utils.base64ToFile(filePath, base64String); |
| | | } |
| | | |
| | | // ===================================================================================== |
| | | // == Random Namespace =============================================================== |
| | | // ===================================================================================== |
| | | dxCommonUtils.random = {}; |
| | | |
| | | /** |
| | | * Generates cryptographically secure random bytes. |
| | | * @param {number} length - Number of bytes to generate. |
| | | * @returns {string} Random bytes as a hex string. |
| | | */ |
| | | dxCommonUtils.random.getBytes = function (length) { |
| | | if (typeof length !== 'number' || length <= 0) { |
| | | throw new Error('Length must be a positive number'); |
| | | } |
| | | return utils.generateRandomBytes(length); |
| | | } |
| | | |
| | | /** |
| | | * Generates a non-cryptographically secure random string from a given charset. |
| | | * @param {number} length - The length of the string to generate. |
| | | * @param {string} [charset] - The set of characters to use. Defaults to alphanumeric. |
| | | * @returns {string} The generated random string. |
| | | */ |
| | | dxCommonUtils.random.getStr = function (length, charset) { |
| | | if (typeof length !== 'number' || length <= 0) { |
| | | throw new Error('Length must be a positive number'); |
| | | } |
| | | const charSet = charset || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; |
| | | let result = ''; |
| | | const charSetLength = charSet.length; |
| | | for (let i = 0; i < length; i++) { |
| | | result += charSet.charAt(Math.floor(Math.random() * charSetLength)); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | // ----------- Codec Namespace ------------------- |
| | | dxCommonUtils.codec = {}; |
| | | |
| | | /** |
| | | * Hexadecimal to byte array eg: 313233616263->[49,50,51,97,98,99] |
| | | * @param {string} str A hexadecimal string in lowercase with no space in between |
| | | * @returns {number[]} Digital numbers |
| | | */ |
| | | dxCommonUtils.codec.hexToBytes = function (str) { |
| | | if (str === undefined || str === null || (typeof str) != 'string' || str.length < 1) { |
| | | throw new Error("dxCommonUtils.codec.hexToBytes:'str' parameter should not be empty") |
| | | } |
| | | if (!/^[0-9a-fA-F]+$/.test(str) || str.length % 2 !== 0) { |
| | | throw new Error("dxCommonUtils.codec.hexToBytes: 'str' parameter must be a valid hex string with an even length"); |
| | | } |
| | | let regex = /.{2}/g; |
| | | let arr = str.match(regex); |
| | | return arr.map(item => parseInt(item, 16)); |
| | | } |
| | | /** |
| | | * Byte array to hexadecimal eg: [49,50,51,97,98,99] ->313233616263 |
| | | * @param {number[]} numbers Numeric array |
| | | * @returns {string} A hexadecimal string in lowercase with no space in between |
| | | */ |
| | | dxCommonUtils.codec.bytesToHex = function (numbers) { |
| | | const hexArray = numbers.map(num => num.toString(16).padStart(2, '0').toLowerCase()); |
| | | const hexString = hexArray.join(''); |
| | | return hexString; |
| | | } |
| | | /** |
| | | * Hexadecimal to string conversion eg: 313233616263->123abc |
| | | * @description WARNING: This function only works for single-byte character sets (like ASCII). |
| | | * For multi-byte characters (like Chinese), please use `codec.utf8HexToStr`. |
| | | * @param {string} str The hexadecimal string to be converted |
| | | * @returns {string} The real string |
| | | */ |
| | | dxCommonUtils.codec.hexToStr = function (str) { |
| | | let regex = /.{2}/g; |
| | | let arr = str.match(regex); |
| | | arr = arr.map(item => String.fromCharCode(parseInt(item, 16))); |
| | | return arr.join(""); |
| | | } |
| | | /** |
| | | * Convert a string to a UTF-8 encoded hexadecimal string |
| | | * @param {string} str |
| | | * @returns {string} |
| | | */ |
| | | dxCommonUtils.codec.strToUtf8Hex = function (str) { |
| | | const bytes = []; |
| | | for (let i = 0; i < str.length; i++) { |
| | | let code = str.charCodeAt(i); |
| | | if (code < 0x80) { |
| | | bytes.push(code); |
| | | } else if (code < 0x800) { |
| | | bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f)); |
| | | } else if (code < 0xd800 || code >= 0xe000) { |
| | | bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f)); |
| | | } else { |
| | | i++; |
| | | code = 0x10000 + (((code & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff)); |
| | | bytes.push( |
| | | 0xf0 | (code >> 18), |
| | | 0x80 | ((code >> 12) & 0x3f), |
| | | 0x80 | ((code >> 6) & 0x3f), |
| | | 0x80 | (code & 0x3f) |
| | | ); |
| | | } |
| | | } |
| | | return dxCommonUtils.codec.bytesToHex(bytes); |
| | | } |
| | | /** |
| | | * Convert the hexadecimal string of utf-8 passed over to a string |
| | | * @param {string} hex Hexadecimal string |
| | | * @returns {string} The real string |
| | | */ |
| | | dxCommonUtils.codec.utf8HexToStr = function (hex) { |
| | | let array = dxCommonUtils.codec.hexToBytes(hex) |
| | | var out, i, len, c; |
| | | var char2, char3; |
| | | out = ""; |
| | | len = array.length; |
| | | i = 0; |
| | | while (i < len) { |
| | | c = array[i++]; |
| | | switch (c >> 4) { |
| | | case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: |
| | | out += String.fromCharCode(c); |
| | | break; |
| | | case 12: case 13: |
| | | char2 = array[i++]; |
| | | out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); |
| | | break; |
| | | case 14: |
| | | char2 = array[i++]; |
| | | char3 = array[i++]; |
| | | out += String.fromCharCode(((c & 0x0F) << 12) | |
| | | ((char2 & 0x3F) << 6) | |
| | | ((char3 & 0x3F) << 0)); |
| | | break; |
| | | } |
| | | } |
| | | return out; |
| | | } |
| | | /** |
| | | * Convert string to hexadecimal eg: 123abc ->313233616263 |
| | | * @description WARNING: This function only works for single-byte character sets (like ASCII). |
| | | * For multi-byte characters (like Chinese), please use `codec.strToUtf8Hex`. |
| | | * @param {string} str The string to be converted |
| | | * @returns {string} Hexadecimal string |
| | | */ |
| | | dxCommonUtils.codec.strToHex = function (str) { |
| | | if (str === undefined || str === null || typeof (str) != "string") { |
| | | return null |
| | | } |
| | | let val = ""; |
| | | for (let i = 0; i < str.length; i++) { |
| | | val += str.charCodeAt(i).toString(16).padStart(2, '0'); |
| | | } |
| | | return val |
| | | } |
| | | |
| | | /** |
| | | * Convert small format to decimal eg: 001001->69632 |
| | | * @param {string} hexString A hexadecimal string in lowercase with no space in between |
| | | * @returns {number} Decimal number |
| | | */ |
| | | dxCommonUtils.codec.leToDecimal = function (hexString) { |
| | | let reversedHexString = hexString |
| | | .match(/.{2}/g) |
| | | .reverse() |
| | | .join(""); |
| | | let decimal = parseInt(reversedHexString, 16); |
| | | return decimal; |
| | | } |
| | | |
| | | /** |
| | | * Convert decimal numbers to hexadecimal small format strings |
| | | * @param {number} decimalNumber Decimal digit |
| | | * @param {number} byteSize Generate the number of bytes, defaults to 2 |
| | | * @returns {string} Hexadecimal small format string |
| | | */ |
| | | dxCommonUtils.codec.decimalToLeHex = function (decimalNumber, byteSize) { |
| | | if (decimalNumber === undefined || decimalNumber === null || (typeof decimalNumber) != 'number') { |
| | | throw new Error("dxCommonUtils.codec.decimalToLeHex:'decimalNumber' parameter should be number") |
| | | } |
| | | if (byteSize === undefined || byteSize === null || (typeof byteSize) != 'number' || byteSize <= 0) { |
| | | byteSize = 2 |
| | | } |
| | | const littleEndianBytes = []; |
| | | for (let i = 0; i < byteSize; i++) { |
| | | littleEndianBytes.push(decimalNumber & 0xFF); |
| | | decimalNumber >>= 8; |
| | | } |
| | | const littleEndianHex = littleEndianBytes |
| | | .map((byte) => byte.toString(16).padStart(2, '0')) |
| | | .join(''); |
| | | return littleEndianHex; |
| | | } |
| | | |
| | | /** |
| | | * Convert a hexadecimal string to an ArrayBuffer |
| | | * @param {string} hexString The hexadecimal string to be converted |
| | | * @returns {ArrayBuffer} Converted ArrayBuffer |
| | | */ |
| | | dxCommonUtils.codec.hexToArrayBuffer = function (hexString) { |
| | | return dxCommonUtils.codec.hexToUint8Array(hexString).buffer; |
| | | } |
| | | |
| | | /** |
| | | * Convert hexadecimal string to Uint8Array |
| | | * @param {string} hexString The hexadecimal string to be converted |
| | | * @returns {Uint8Array} Uint8Array object |
| | | */ |
| | | dxCommonUtils.codec.hexToUint8Array = function (hexString) { |
| | | if (hexString === undefined || hexString === null || (typeof hexString) != 'string' || hexString.length <= 0) { |
| | | throw new Error("dxCommonUtils.codec.hexToUint8Array:'hexString' parameter should not be empty") |
| | | } |
| | | if (!/^[0-9a-fA-F]+$/.test(hexString) || hexString.length % 2 !== 0) { |
| | | throw new Error("dxCommonUtils.codec.hexToUint8Array: 'hexString' parameter must be a valid hex string with an even length"); |
| | | } |
| | | let byteString = hexString.match(/.{1,2}/g); |
| | | let byteArray = byteString.map(function (byte) { |
| | | return parseInt(byte, 16); |
| | | }); |
| | | let buffer = new Uint8Array(byteArray); |
| | | return buffer; |
| | | } |
| | | |
| | | /** |
| | | * Convert ArrayBuffer to hexadecimal string format |
| | | * @param {ArrayBuffer} buffer |
| | | * @returns {string} A hexadecimal string in lowercase with no space in between |
| | | */ |
| | | dxCommonUtils.codec.arrayBufferToHex = function (buffer) { |
| | | return dxCommonUtils.codec.uint8ArrayToHex(new Uint8Array(buffer)) |
| | | } |
| | | /** |
| | | * Convert Uint8Array to hexadecimal string format |
| | | * @param {Uint8Array} array |
| | | * @returns {string} A hexadecimal string in lowercase with no space in between |
| | | */ |
| | | dxCommonUtils.codec.uint8ArrayToHex = function (array) { |
| | | let hexString = ''; |
| | | for (let i = 0; i < array.length; i++) { |
| | | const byte = array[i].toString(16).padStart(2, '0'); |
| | | hexString += byte; |
| | | } |
| | | return hexString |
| | | } |
| | | |
| | | /** |
| | | * Decodes a Base64 string into an ArrayBuffer. |
| | | * This implementation is robust and handles padding correctly. |
| | | * @memberof dxCommonUtils.codec |
| | | * @param {string} b64 - The Base64 encoded string. |
| | | * @returns {ArrayBuffer} The decoded data as an ArrayBuffer. |
| | | */ |
| | | dxCommonUtils.codec.base64ToArrayBuffer = function (b64) { |
| | | if (typeof b64 !== 'string') { |
| | | throw new Error("Input must be a Base64 string."); |
| | | } |
| | | |
| | | // First, clean up any whitespace from the input string. |
| | | const b64_clean = b64.replace(/\s+/g, ""); |
| | | |
| | | // Regex inspired by the js-base64 library to validate the structure of the string. |
| | | // This provides a fast failure for malformed strings. |
| | | const b64re = /^(?:[A-Za-z0-9+/]{4})*?(?:[A-Za-z0-9+/]{2}(?:==)?|[A-Za-z0-9+/]{3}=?)?$/; |
| | | if (!b64re.test(b64_clean)) { |
| | | throw new Error("Input is not a valid Base64 string (malformed)."); |
| | | } |
| | | |
| | | const B64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
| | | const len = b64_clean.length; |
| | | |
| | | // This calculation correctly determines the output byte length |
| | | let byte_len = len * 3 / 4; |
| | | if (b64_clean.slice(-2) === '==') { |
| | | byte_len -= 2; |
| | | } else if (b64_clean.slice(-1) === '=') { |
| | | byte_len -= 1; |
| | | } |
| | | |
| | | const arr = new Uint8Array(byte_len); |
| | | let j = 0; |
| | | |
| | | for (let i = 0; i < len; i += 4) { |
| | | // Get the index of each base64 character. |
| | | // It will be -1 for '=' or any other invalid character. |
| | | const c1 = B64_MAP.indexOf(b64_clean[i]); |
| | | const c2 = B64_MAP.indexOf(b64_clean[i + 1]); |
| | | const c3 = B64_MAP.indexOf(b64_clean[i + 2]); |
| | | const c4 = B64_MAP.indexOf(b64_clean[i + 3]); |
| | | |
| | | // Reconstruct the original 3 bytes from the 4 base64 character indices. |
| | | const b1 = (c1 << 2) | (c2 >> 4); |
| | | const b2 = ((c2 & 15) << 4) | (c3 >> 2); |
| | | const b3 = ((c3 & 3) << 6) | c4; |
| | | |
| | | // Write the first byte, which is always present. |
| | | arr[j++] = b1; |
| | | |
| | | // Write the second byte if the third base64 character was not a padding character. |
| | | if (c3 !== -1) { |
| | | arr[j++] = b2; |
| | | } |
| | | |
| | | // Write the third byte if the fourth base64 character was not a padding character. |
| | | if (c4 !== -1) { |
| | | arr[j++] = b3; |
| | | } |
| | | } |
| | | return arr.buffer; |
| | | } |
| | | |
| | | /** |
| | | * Encodes an ArrayBuffer into a Base64 string. |
| | | * This implementation is robust and handles padding correctly. |
| | | * @memberof dxCommonUtils.codec |
| | | * @param {ArrayBuffer} buffer - The ArrayBuffer to encode. |
| | | * @returns {string} The Base64 encoded string. |
| | | */ |
| | | dxCommonUtils.codec.arrayBufferToBase64 = function (buffer) { |
| | | const B64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
| | | const bytes = new Uint8Array(buffer); |
| | | const len = bytes.byteLength; |
| | | let b64 = ""; |
| | | |
| | | for (let i = 0; i < len; i += 3) { |
| | | const b1 = bytes[i]; |
| | | const b2 = bytes[i + 1]; |
| | | const b3 = bytes[i + 2]; |
| | | |
| | | const c1 = b1 >> 2; |
| | | const c2 = ((b1 & 3) << 4) | (b2 >> 4); |
| | | const c3 = ((b2 & 15) << 2) | (b3 >> 6); |
| | | const c4 = b3 & 63; |
| | | |
| | | b64 += B64_MAP[c1]; |
| | | b64 += B64_MAP[c2]; |
| | | |
| | | if (i + 1 >= len) { |
| | | b64 += "=="; |
| | | } else { |
| | | b64 += B64_MAP[c3]; |
| | | if (i + 2 >= len) { |
| | | b64 += "="; |
| | | } else { |
| | | b64 += B64_MAP[c4]; |
| | | } |
| | | } |
| | | } |
| | | return b64; |
| | | } |
| | | |
| | | /** |
| | | * Calculates the BCC (Block Check Character / XOR Checksum) of the input data. |
| | | * @memberof dxCommonUtils.codec |
| | | * @param {string|ArrayBuffer|Uint8Array} data - The data to calculate the checksum for. If a string, it will be treated as UTF-8. |
| | | * @returns {number} The calculated 8-bit BCC value (0-255). |
| | | */ |
| | | dxCommonUtils.codec.bcc = function (data) { |
| | | const buffer = _normalizeDataToBuffer(data, false, 'Data'); |
| | | return utils.calculateBcc(buffer); |
| | | } |
| | | |
| | | /** |
| | | * Get disk space usage |
| | | * @returns {object} |
| | | * -total: The total disk space in MB. |
| | | * -used: The used disk space in MB. |
| | | * -free: The available disk space in MB. |
| | | */ |
| | | dxCommonUtils.getDiskStats = function () { |
| | | return utils.getDiskStats(); |
| | | } |
| | | |
| | | /** |
| | | * @private |
| | | * Internal helper to normalize various data inputs into an ArrayBuffer. |
| | | * This function is crucial for ensuring that the native C layer receives data in a consistent format. |
| | | * @param {string|ArrayBuffer|Uint8Array} data The input data. |
| | | * @param {boolean} [isBase64=false] - If the input is a string, specifies if it's Base64 encoded. Defaults to false (UTF-8). |
| | | * @param {string} [paramName='Input'] - The name of the parameter for error messages. |
| | | * @returns {ArrayBuffer} |
| | | */ |
| | | function _normalizeDataToBuffer(data, isBase64 = false, paramName = 'Input') { |
| | | if (typeof data === 'string') { |
| | | if (isBase64) { |
| | | return dxCommonUtils.codec.base64ToArrayBuffer(data); |
| | | } else { |
| | | // Treat as a UTF-8 string by converting to hex and then to ArrayBuffer. |
| | | return dxCommonUtils.codec.hexToArrayBuffer(dxCommonUtils.codec.strToUtf8Hex(data)); |
| | | } |
| | | } else if (data instanceof ArrayBuffer) { |
| | | return data; |
| | | } else if (data instanceof Uint8Array) { |
| | | // Correctly handle views on larger ArrayBuffers by creating a copy of the viewed section. |
| | | // If it's not a view, slice() will create a copy of the buffer. |
| | | return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength); |
| | | } else { |
| | | throw new Error(`${paramName} must be a string, ArrayBuffer, or Uint8Array`); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @private |
| | | * Internal helper to normalize crypto inputs, converting Hex strings to ArrayBuffer. |
| | | * @param {string|ArrayBuffer|Uint8Array} data The input data. |
| | | * @param {string} paramName The name of the parameter for error messages. |
| | | * @returns {ArrayBuffer} |
| | | */ |
| | | function _normalizeHexInput(data, paramName = 'Input') { |
| | | if (typeof data === 'string') { |
| | | return dxCommonUtils.codec.hexToArrayBuffer(data); |
| | | } else if (data instanceof ArrayBuffer) { |
| | | return data; |
| | | } else if (data instanceof Uint8Array) { |
| | | return data.buffer; |
| | | } else { |
| | | throw new Error(`${paramName} must be a hex string, ArrayBuffer, or Uint8Array`); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Internal helper to convert an ArrayBuffer to a UTF-8 string. |
| | | * This is a workaround for environments that lack a built-in TextDecoder. |
| | | * @param {ArrayBuffer} buffer - The ArrayBuffer to convert. |
| | | * @returns {string} The UTF-8 string. |
| | | */ |
| | | function _arrayBufferToUtf8String(buffer) { |
| | | if (!buffer || buffer.byteLength === 0) { |
| | | return ""; |
| | | } |
| | | // Use the existing, environment-safe codec functions |
| | | const hex = dxCommonUtils.codec.arrayBufferToHex(buffer); |
| | | return dxCommonUtils.codec.utf8HexToStr(hex); |
| | | } |
| | | |
| | | /** |
| | | * Gets the native common utils client object. |
| | | * @returns {Object} The native client object. |
| | | */ |
| | | dxCommonUtils.getNative = function () { |
| | | return utils; |
| | | } |
| | | |
| | | export default dxCommonUtils; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * å®ç°å¯¹åºç¨ææé
置项ï¼key/value)ç管çï¼ |
| | | * 1. ç¨æ·éè¦æåå§çé
置项ä¿åå¨é¡¹ç®ç src/config.json ï¼é
ç½®æä»¶çæ ¼å¼è¯·ä¿çkey/valueæ ¼å¼ï¼æ¯ææ³¨é)ï¼valueåªè½æ¯åç¬¦ä¸²åæ°åç±»å,ä¾å¦ï¼ |
| | | * { |
| | | * //mqttç¸å
³é
ç½® |
| | | * "mqtt.ip":"192.168.2.3", |
| | | * "mqtt.port":6199, |
| | | * } |
| | | * 2. 乿¯æèªå®ä¹é
ç½®æä»¶ï¼åå§åå¯ä»¥ä¼ éèªå®ä¹é
ç½®æä»¶çè·¯å¾åæ è¯ï¼åç»è¯»åæ°æ®é½éè¦ä¼ éè¿ä¸ªæ è¯ |
| | | * 3. ç¨æ·å¨åºç¨ä¸ç¬¬ä¸æ¬¡ä½¿ç¨è¿ä¸ªç»ä»¶ï¼éè¦å
åå§å initï¼åå§å伿 config.json çæ°æ®ä¿åå°å
åéï¼ä»¥åæ¯æ¬¡è·å齿¯ä»å
åè·å |
| | | * 4. ç¨æ·å¯ä»¥å¨ä»»ä½å°æ¹é½å¯ä»¥éè¿ get å set æ¥è¯»åé
ç½® |
| | | * 5. å¦æä¿®æ¹é
置项ç value åæ¶éè¦ä¿åå°é
ç½®æä»¶ï¼ä¿è¯éå¯åæ°é
ç½®çæï¼ï¼ä½¿ç¨ setAndSave |
| | | * 6. 妿éè¦æ¢å¤ææé»è®¤é
ç½®ï¼ä½¿ç¨ reset |
| | | */ |
| | | import * as os from 'os'; |
| | | import dxMap from './dxMap.js' |
| | | import common from './dxCommon.js' |
| | | import logger from './dxLogger.js' |
| | | import std from './dxStd.js' |
| | | |
| | | const map = dxMap.get("default") |
| | | |
| | | const config = {} |
| | | const DEFALUT_OPTIONS = { path: '/app/code/src/config.json', savePath: '/app/data/config/config.json', flag: '___config.' } |
| | | |
| | | /** |
| | | * åå§å伿 config.json æèªå®ä¹çé
ç½®æä»¶çæ°æ®ä¿åå°å
åéï¼ä»¥åæ¯æ¬¡è·å齿¯ä»å
åè·å |
| | | * @param {object} custom éå¿
å¡«ï¼èªå®ä¹çé
ç½®æä»¶ |
| | | * @param {string} custom.path èªå®ä¹çé
ç½®æä»¶å®æ´è·¯å¾ |
| | | * @param {string} custom.flag èªå®ä¹é
ç½®æä»¶çæ è¯ï¼æ³¨æå¦ææå¤ä¸ªèªå®ä¹é
ç½®æä»¶ï¼è¿ä¸ªæ è¯ä¸è¦éå¤ |
| | | */ |
| | | config.init = function (custom) { |
| | | if (custom) { |
| | | if (!custom.path || !custom.flag) { |
| | | throw new Error('The path and flag for the custom configuration file cannot be empty.') |
| | | } |
| | | } |
| | | let flag = custom ? DEFALUT_OPTIONS.flag + custom.flag + '.' : DEFALUT_OPTIONS.flag; |
| | | const isInited = map.get('___inited' + flag) |
| | | if (isInited) {//åªåå§å䏿¬¡ |
| | | return |
| | | } |
| | | let path = custom ? custom.path : DEFALUT_OPTIONS.path |
| | | let savePath = custom ? '/app/data/config/config' + custom.flag + '.json' : DEFALUT_OPTIONS.savePath |
| | | if (!std.exist(path)) { |
| | | throw new Error('The config file not existed:' + path) |
| | | } |
| | | let existed = std.exist(savePath) |
| | | let content = existed ? std.parseExtJSON(std.loadFile(savePath)) : std.parseExtJSON(std.loadFile(path)) |
| | | if (!existed) { |
| | | std.saveFile(savePath, JSON.stringify(content)) |
| | | } |
| | | for (let [key, value] of Object.entries(content)) { |
| | | map.put(flag + key, value) |
| | | } |
| | | map.put('___inited' + flag, 'ok') |
| | | } |
| | | /** |
| | | * è·åææé
置项 |
| | | * @param {string} flag èªå®ä¹çé
ç½®æä»¶æ è¯ï¼å¯ä»¥ä¸ºç©ºï¼ä¸ºç©ºåè¿å缺çconfig.jsonéææå
容 |
| | | * @returns json对象 |
| | | */ |
| | | config.getAll = function (flag) { |
| | | let _flag = _getFlag(flag) |
| | | let configInfo = {} |
| | | let keys = map.keys().filter(k => k.startsWith(_flag)) |
| | | keys.forEach(k => { |
| | | let key = k.substring(_flag.length) |
| | | let val = map.get(k) |
| | | configInfo[key] = val |
| | | }) |
| | | return configInfo |
| | | } |
| | | /** |
| | | * è·åé
ç½®ï¼åªä»mapè·å |
| | | * 妿é
置项为空ï¼è¿åæææææ°æ®ï¼ |
| | | * @param {string} key é
置项 |
| | | * @param {string} flag èªå®ä¹çé
ç½®æä»¶æ è¯ï¼å¯ä»¥ä¸ºç©ºï¼ä¸ºç©ºåè¿å缺çconfig.jsonéçé
ç½®å¼ |
| | | * @returns |
| | | */ |
| | | config.get = function (key, flag) { |
| | | if (!key) { |
| | | return this.getAll(flag); |
| | | } |
| | | let _flag = _getFlag(flag) |
| | | return map.get(_flag + key) |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°é
ç½®ï¼åªä¿®æ¹map |
| | | * @param {string} key é
置项 |
| | | * @param {string} value é
ç½®å¼ |
| | | * @param {string} flag èªå®ä¹çé
ç½®æä»¶æ è¯ï¼å¯ä»¥ä¸ºç©ºï¼ä¸ºç©ºåæå缺çconfig.jsonéçé
ç½®å¼ |
| | | */ |
| | | config.set = function (key, value, flag) { |
| | | if (!key || value == null || value == undefined) { |
| | | throw new Error("key or value should not be empty") |
| | | } |
| | | let _flag = _getFlag(flag) |
| | | map.put(_flag + key, value) |
| | | } |
| | | |
| | | /** |
| | | * å°mapä¸çæ°æ®æä¹
åå°æ¬å° |
| | | * @param {string} flag èªå®ä¹çé
ç½®æä»¶æ è¯ï¼å¯ä»¥ä¸ºç©ºï¼ä¸ºç©ºåæå缺çconfig.jsonéçé
ç½®å¼ |
| | | */ |
| | | config.save = function (flag) { |
| | | //ä¿å |
| | | std.saveFile(_getSavePath(flag), JSON.stringify(this.getAll(flag))) |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°é
ç½®ï¼ä¿®æ¹map䏿ä¹
åæ¬å° |
| | | * @param {string} key é
置项 |
| | | * @param {string} value é
ç½®å¼ |
| | | * @param {string} flag èªå®ä¹çé
ç½®æä»¶æ è¯ï¼å¯ä»¥ä¸ºç©ºï¼ä¸ºç©ºåæå缺çconfig.jsonéçé
ç½®å¼ |
| | | */ |
| | | config.setAndSave = function (key, value, flag) { |
| | | this.set(key, value, flag) |
| | | //ä¿å |
| | | std.saveFile(_getSavePath(flag), JSON.stringify(this.getAll(flag))) |
| | | } |
| | | |
| | | /** |
| | | * éç½®ï¼éç½®å请éå¯å¨è®¾å¤ |
| | | * @param {string} flag èªå®ä¹çé
ç½®æä»¶æ è¯ï¼å¯ä»¥ä¸ºç©ºï¼ä¸ºç©ºåæå缺çconfig.jsonéçé
ç½®å¼ |
| | | */ |
| | | config.reset = function (flag) { |
| | | common.systemBrief('rm -rf ' + _getSavePath(flag)) |
| | | } |
| | | |
| | | //-------------------private------------------------------- |
| | | |
| | | function _getFlag(flag) { |
| | | return flag ? DEFALUT_OPTIONS.flag + flag + '.' : DEFALUT_OPTIONS.flag |
| | | } |
| | | function _getSavePath(flag) { |
| | | return flag ? '/app/data/config/config' + flag + '.json' : DEFALUT_OPTIONS.savePath |
| | | } |
| | | export default config; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { displayClass } from './libvbar-m-dxdisplay.so' |
| | | |
| | | const dxDisplay = {}; |
| | | |
| | | // Create a singleton instance of the native displayClass. |
| | | // This is executed only once when the module is first imported due to the nature of ES modules. |
| | | const displayObj = new displayClass(); |
| | | |
| | | /** |
| | | * Get the current display backlight brightness. |
| | | * @returns {number} Backlight brightness value (0-100). |
| | | * @throws {Error} If failed to get backlight. |
| | | */ |
| | | dxDisplay.getBacklight = function () { |
| | | return displayObj.getBacklight(); |
| | | } |
| | | |
| | | /** |
| | | * Set the display backlight brightness. |
| | | * @param {number} brightness - The brightness value to set (0-100). |
| | | * @throws {Error} If failed to set backlight. |
| | | */ |
| | | dxDisplay.setBacklight = function (brightness) { |
| | | if (brightness === undefined || brightness === null) { |
| | | throw new Error("dxDisplay.setBacklight: 'brightness' parameter is required"); |
| | | } |
| | | if (typeof brightness !== 'number' || brightness < 0 || brightness > 100) { |
| | | throw new Error("dxDisplay.setBacklight: 'brightness' must be a number between 0 and 100"); |
| | | } |
| | | displayObj.setBacklight(brightness); |
| | | } |
| | | |
| | | /** |
| | | * Get the screen enable status. |
| | | * @returns {boolean} 1 if enabled, 0 if disabled. |
| | | * @throws {Error} If failed to get enable status. |
| | | */ |
| | | dxDisplay.getEnableStatus = function () { |
| | | return displayObj.getEnableStatus(); |
| | | } |
| | | |
| | | /** |
| | | * Set the screen enable status. |
| | | * @param {boolean|number} enable - true/1 to enable screen, false/0 to disable. |
| | | * @throws {Error} If failed to set enable status. |
| | | */ |
| | | dxDisplay.setEnableStatus = function (enable) { |
| | | if (enable === undefined || enable === null) { |
| | | throw new Error("dxDisplay.setEnableStatus: 'enable' parameter is required"); |
| | | } |
| | | displayObj.setEnableStatus(enable); |
| | | } |
| | | |
| | | /** |
| | | * Get the current display power mode. |
| | | * @returns {number} Power mode value: |
| | | * - 0: VBAR_DRV_DISPLAY_POWER_MODE_NORMAL (Normal mode) |
| | | * - 1: VBAR_DRV_DISPLAY_POWER_MODE_STANDBY (Standby mode) |
| | | * @throws {Error} If failed to get power mode. |
| | | */ |
| | | dxDisplay.getPowerMode = function () { |
| | | return displayObj.getPowerMode(); |
| | | } |
| | | |
| | | /** |
| | | * Set the display power mode. |
| | | * @param {number} mode - The power mode to set: |
| | | * - 0: VBAR_DRV_DISPLAY_POWER_MODE_NORMAL (Normal mode) |
| | | * - 1: VBAR_DRV_DISPLAY_POWER_MODE_STANDBY (Standby mode) |
| | | * @throws {Error} If failed to set power mode. |
| | | */ |
| | | dxDisplay.setPowerMode = function (mode) { |
| | | if (mode === undefined || mode === null) { |
| | | throw new Error("dxDisplay.setPowerMode: 'mode' parameter is required"); |
| | | } |
| | | if (mode !== 0 && mode !== 1) { |
| | | throw new Error("dxDisplay.setPowerMode: 'mode' must be 0 (NORMAL) or 1 (STANDBY)"); |
| | | } |
| | | displayObj.setPowerMode(mode); |
| | | } |
| | | |
| | | export default dxDisplay; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | const dxDriver = {}
|
| | |
|
| | | /*************************************Device Resource Enumeration*************************************/
|
| | |
|
| | | /**
|
| | | * Device info
|
| | | */
|
| | | dxDriver.DRIVER = {
|
| | | // Driver model
|
| | | MODEL: "vf105"
|
| | | }
|
| | |
|
| | | /**
|
| | | * Display info
|
| | | */
|
| | | dxDriver.DISPLAY = {
|
| | | // Display width
|
| | | WIDTH: 800,
|
| | | // Display height
|
| | | HEIGHT: 1280,
|
| | | // Display dpi
|
| | | DPI: 177,
|
| | | // Display rotation
|
| | | ROTATION: 0
|
| | | }
|
| | |
|
| | | /**
|
| | | * PWM channel
|
| | | */
|
| | | dxDriver.PWM = {
|
| | |
|
| | | // White fill light
|
| | | WHITE_SUPPLEMENT_CHANNEL: 0,
|
| | | // Nir fill light
|
| | | NIR_SUPPLEMENT_CHANNEL: 1
|
| | | }
|
| | |
|
| | | /**
|
| | | * GPIO device pins
|
| | | */
|
| | | dxDriver.GPIO = {
|
| | |
|
| | | // Relay
|
| | | RELAY0: 44,
|
| | | }
|
| | |
|
| | | /**
|
| | | * Channel communication
|
| | | */
|
| | | dxDriver.CHANNEL = {
|
| | |
|
| | | // 485 |
| | | UART_PATH: "/dev/ttySLB2",
|
| | |
|
| | | // USBHID
|
| | | USBHID_PATH: "/dev/hidg1",
|
| | | }
|
| | |
|
| | | /**
|
| | | * Camera related parameters
|
| | | */
|
| | | dxDriver.CAPTURER = {
|
| | | // Camera image width
|
| | | RGB_WIDTH: 1280,
|
| | | // Camera image height
|
| | | RGB_HEIGHT: 800,
|
| | | // Camera device files
|
| | | RGB_PATH: "/dev/video3",
|
| | |
|
| | | // Camera image width
|
| | | NIR_WIDTH: 800,
|
| | | // Camera image height
|
| | | NIR_HEIGHT: 600,
|
| | | // Camera device files
|
| | | NIR_PATH: "/dev/video0"
|
| | | }
|
| | |
|
| | |
|
| | | /**
|
| | | * GPIO pin function enumeration
|
| | | */
|
| | | dxDriver.GPIO_FUNC = {
|
| | | GPIO_FUNC_3: 0x03, //0011, GPIO as function 3 / device 3
|
| | | GPIO_OUTPUT0: 0x04, //0100, GPIO output low level
|
| | | GPIO_OUTPUT1: 0x05 //0101, GPIO output high level
|
| | | };
|
| | |
|
| | |
|
| | | export default dxDriver |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /**
|
| | | * dxEventBus - Multi-threaded Event Bus for DejaOS.
|
| | | *
|
| | | * This module provides a multi-threaded event bus for communication between the main thread
|
| | | * and workers in the QuickJS environment. It uses the main thread as a message relay,
|
| | | * enabling full-duplex event notifications across all threads.
|
| | | *
|
| | | * Features:
|
| | | * - Communication between workers via the main thread.
|
| | | * - Main-to-worker, worker-to-main, and main-to-main communication.
|
| | | * - Dynamic creation and termination of event-aware workers.
|
| | | *
|
| | | * Usage:
|
| | | * // In main thread
|
| | | * import dxEventBus from './dxmodules/dxEventBus.js';
|
| | | * dxEventBus.newWorker('my_worker', '/app/code/src/worker.js');
|
| | | * dxEventBus.fire('some_topic', { data: 123 });
|
| | | *
|
| | | * // In worker.js
|
| | | * import dxEventBus from './dxmodules/dxEventBus.js';
|
| | | * dxEventBus.on('some_topic', (data) => { console.log(data); });
|
| | | */
|
| | | import std from './dxStd.js'
|
| | | import * as os from "os";
|
| | |
|
| | | const bus = {}
|
| | | const all = {}
|
| | | const subs = {}
|
| | | const isMain = (os.Worker.parent === undefined)
|
| | | bus.id = isMain ? '__main' : null
|
| | | /**
|
| | | * Creates and registers a new worker on the event bus. Must be called from the main thread.
|
| | | * @param {string} id - A unique identifier for the worker. Cannot be empty or duplicated.
|
| | | * @param {string} file - The absolute path to the worker's script file.
|
| | | * @throws {Error} If id is invalid, the file doesn't exist, or not called from the main thread.
|
| | | */
|
| | | bus.newWorker = function (id, file) {
|
| | | if (!id) {
|
| | | throw new Error("eventbus newWorker:'id' should not be empty")
|
| | | } if (!file) {
|
| | | throw new Error("eventbus newWorker:'file' should not be empty")
|
| | | }
|
| | | if (!isMain) {
|
| | | throw new Error("evnetbus newWorker should be invoke in main thread")
|
| | | }
|
| | | if (!std.exist(file)) {
|
| | | throw new Error("eventbus newWorker: file not found:" + file)
|
| | | }
|
| | | if (all[id]) {
|
| | | throw new Error("eventbus newWorker: worker already exists:" + id)
|
| | | }
|
| | | let content = std.loadFile(file) + '\n' + `
|
| | | import __bus from '/app/code/dxmodules/dxEventBus.js'
|
| | | import __std from '/app/code/dxmodules/dxStd.js'
|
| | | __bus.id='${id}'
|
| | | Object.keys(__bus.handlers).forEach(key => {
|
| | | __bus.os.Worker.parent.postMessage({ __sub: key, id: __bus.id })
|
| | | })
|
| | | __bus.os.Worker.parent.onmessage = function (e) {
|
| | | if(!e.data){
|
| | | return
|
| | | }
|
| | | e = e.data
|
| | | if (!e || !e.topic) {
|
| | | return
|
| | | }
|
| | | let fun = __bus.handlers[e.topic]
|
| | | if (fun) {
|
| | | try {
|
| | | fun(e.data)
|
| | | } catch (err) {
|
| | | __std.err.puts(\`[dxEventBus] Error in worker '${id}' event handler for topic \${e.topic}: \${err.message || err}\\n\`);
|
| | | __std.err.flush();
|
| | | }
|
| | | }
|
| | | }
|
| | | `
|
| | | let newfile = file + '_' + id + '.js'
|
| | | std.saveFile(newfile, content)
|
| | | let worker = new os.Worker(newfile)
|
| | | all[id] = worker
|
| | | worker.onmessage = function (data) {
|
| | | if (data.data) {
|
| | | if (data.data.__sub) {
|
| | | sub(data.data.__sub, data.data.id)
|
| | | return
|
| | | }
|
| | | //workeråéè¿æ¥çæ°æ®åè°ç¨ä¸æ¬¡ä¸»çº¿ç¨çfireï¼è¦ä¹ä¸»çº¿ç¨èªå·±æ¶è´¹ï¼è¦ä¹è½¬åå°å
¶å®worker
|
| | | bus.fire(data.data.topic, data.data.data)
|
| | | }
|
| | | }
|
| | | }
|
| | | /**
|
| | | * Terminates a worker and cleans up all its resources from the event bus.
|
| | | * This removes the worker instance and all of its event subscriptions.
|
| | | * @param {string} id - The unique identifier of the worker to terminate.
|
| | | */
|
| | | bus.delWorker = function (id) {
|
| | | if (!id || !all[id]) {
|
| | | return;
|
| | | }
|
| | |
|
| | | delete all[id];
|
| | |
|
| | | for (const topic in subs) {
|
| | | if (subs.hasOwnProperty(topic)) {
|
| | | const subscribers = subs[topic];
|
| | | for (let i = subscribers.length - 1; i >= 0; i--) {
|
| | | if (subscribers[i] === id) {
|
| | | subscribers.splice(i, 1);
|
| | | }
|
| | | }
|
| | | if (subscribers.length === 0) {
|
| | | delete subs[topic];
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | | /**
|
| | | * Fires an event to notify all subscribers for a given topic.
|
| | | *
|
| | | * This is a fire-and-forget operation. Callbacks for subscribers in the main thread are
|
| | | * executed synchronously and sequentially. For subscribers in workers, the event is sent
|
| | | * asynchronously via `postMessage`.
|
| | | *
|
| | | * @param {string} topic - The event topic to fire.
|
| | | * @param {*} data - The data to pass to the event subscribers.
|
| | | */
|
| | | bus.fire = function (topic, data) {
|
| | | if (!topic || (typeof topic) != 'string') {
|
| | | throw new Error("eventbus :'topic' should not be null");
|
| | | }
|
| | | if (isMain) {
|
| | | if (subs[topic] && subs[topic].length > 0) {
|
| | | for (let i = 0; i < subs[topic].length; i++) {
|
| | | const id = subs[topic][i]
|
| | | if (id === '__main' && bus.handlers[topic]) {
|
| | | try {
|
| | | bus.handlers[topic](data)
|
| | | } catch (e) {
|
| | | std.err.puts(`[dxEventBus] Error in main thread event handler for topic '${topic}': ${e.message || e}\n`);
|
| | | std.err.flush();
|
| | | }
|
| | | } else {
|
| | | const worker = all[id]
|
| | | if (worker) {
|
| | | try {
|
| | | worker.postMessage({ topic: topic, data: data })
|
| | | } catch (e) {
|
| | | std.err.puts(`[dxEventBus] Error posting message to worker '${id}' for topic '${topic}': ${e.message || e}\n`);
|
| | | std.err.flush();
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | | } else {
|
| | | try {
|
| | | os.Worker.parent.postMessage({ topic: topic, data: data })
|
| | | } catch (e) {
|
| | | std.err.puts(`[dxEventBus] Error in worker '${bus.id}' posting message for topic '${topic}': ${e.message || e}\n`);
|
| | | std.err.flush();
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | |
|
| | | bus.handlers = {}
|
| | | /**
|
| | | * Subscribes to an event topic.
|
| | | * @param {string} topic - The event topic to subscribe to.
|
| | | * @param {function} callback - The function to execute when the event is fired. It receives event data as its only argument.
|
| | | */
|
| | | bus.on = function (topic, callback) {
|
| | | if (!topic || (typeof topic) != 'string') {
|
| | | throw new Error("The 'topic' should not be null");
|
| | | }
|
| | | if (!callback || (typeof callback) != 'function') {
|
| | | throw new Error("The 'callback' should be a function");
|
| | | }
|
| | | sub(topic, bus.id)
|
| | | this.handlers[topic] = callback
|
| | | }
|
| | | /**
|
| | | * Returns the ID of the current thread (either '__main' or the worker's assigned ID).
|
| | | * @returns {string|null} The ID of the current thread.
|
| | | * @note In a worker, if this function is called at the top level of the script before the
|
| | | * event bus has fully initialized, it may return `null`. It is reliable within event handlers.
|
| | | */
|
| | | bus.getId = function () {
|
| | | return bus.id
|
| | | }
|
| | | function sub(topic, id) {
|
| | | if (isMain) {
|
| | | if (!subs[topic]) {
|
| | | subs[topic] = []
|
| | | }
|
| | | if (!subs[topic].includes(id)) {
|
| | | subs[topic].push(id)
|
| | | }
|
| | | } else {
|
| | | if (id != null) {
|
| | | os.Worker.parent.postMessage({ __sub: topic, id: id })
|
| | | }
|
| | | }
|
| | | }
|
| | | bus.os = os
|
| | | export default bus
|
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * dxFacial - JavaScript wrapper for the native facial recognition module. |
| | | * |
| | | * This module provides a singleton-like interface to the underlying C++ facial |
| | | * recognition functionality. It is designed to be consistent with the style of |
| | | * other native module wrappers like dxNetwork. |
| | | * |
| | | * Features: |
| | | * - Initialize/deinitialize the face engine and cameras. |
| | | * - Retrieve recognition events and high-frequency detection data separately. |
| | | * - Configure operational modes (e.g., liveness, recognition, compare). |
| | | * - Manage the face feature database (register, delete, query). |
| | | * - Control the engine's runtime state (pause/resume) and get status info. |
| | | * |
| | | * Usage: |
| | | * - Call `init()` once with a configuration object. |
| | | * - Periodically call `getRecognitionEvent()` to process important results. |
| | | * - Periodically call `getDetectionData()` in your UI loop to draw tracking boxes. |
| | | * - Use other methods like `registerFeature`, `setMode`, etc., as needed. |
| | | */ |
| | | import { Facial } from './libvbar-m-dxfacial.so'; // Placeholder for native module import |
| | | import logger from './dxLogger.js'; |
| | | |
| | | const dxFacial = {}; |
| | | |
| | | // --- Constants & Enums --- |
| | | |
| | | |
| | | // Instantiate the native object immediately. |
| | | // Thanks to ES module caching, this will only run once. |
| | | const _native = new Facial(); |
| | | let _callbacks = {}; |
| | | |
| | | |
| | | // --- Public API --- |
| | | |
| | | /** |
| | | * Initializes the facial recognition module. Must be called before any other function. |
| | | * @param {object} [config={}] - Configuration object. |
| | | * @param {object} [config.rgb] - Configuration for the RGB camera. |
| | | * @param {object} [config.nir] - Configuration for the NIR (infrared) camera. |
| | | * @param {number} [config.db_max] - Max number of faces in the database. |
| | | * @param {string} [config.db_path] - Path to the face database file. |
| | | * @param {string} [config.det_max] - Maximum number of faces to detect. |
| | | * @param {string} [config.det_min_distance_cm] - Minimum distance in centimeters for detection. |
| | | * @param {string} [config.det_max_distance_cm] - Maximum distance in centimeters for detection. |
| | | * @param {string} [config.det_timeout_ms] - Timeout in milliseconds for detection. |
| | | * @param {string} [config.liv_enable] - Live detection switch |
| | | * @param {string} [config.liv_threshold] - Threshold for living score. |
| | | * @param {string} [config.com_enable] - Face comparison switch |
| | | * @param {string} [config.com_threshold] - Threshold for compare score. |
| | | * @param {string} [config.rec_timeout_ms] - Timeout in milliseconds for recognition. |
| | | * @param {string} [config.x_map] - X axis coordinate mapping parameters. |
| | | * @param {string} [config.y_map] - Y axis coordinate mapping parameters. |
| | | * @param {number} [config.pose_score_threshold] - Pose score threshold. |
| | | */ |
| | | dxFacial.init = function (config = {}) { |
| | | _native.init(config); // Throws on error |
| | | logger.info("DxFacial initialized successfully."); |
| | | }; |
| | | |
| | | /** |
| | | * Deinitializes the module, releasing all resources. |
| | | */ |
| | | dxFacial.deinit = function () { |
| | | _native.deinit(); |
| | | logger.info("DxFacial deinitialized."); |
| | | }; |
| | | |
| | | /** |
| | | * Sets callback handlers for facial recognition events. |
| | | * @param {object} callbacks - An object containing callback functions. |
| | | * @param {function(event:object)} [callbacks.onRecognition] - Called when a recognition event occurs. |
| | | * The event object contains details like `userId`, `feature`, `isRecognition`, etc. |
| | | */ |
| | | dxFacial.setCallbacks = function (callbacks) { |
| | | _callbacks = callbacks || {}; |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * Processes the recognition event queue. Should be called periodically in a loop (e.g., setInterval). |
| | | * If a recognition event is available, the `onRecognition` callback will be triggered. |
| | | * @example |
| | | * dxFacial.setCallbacks({ |
| | | * onRecognition: (event) => { |
| | | * logger.info('Recognition Event:', event); |
| | | * event.id // face id |
| | | * event.rect // face bounding box coordinates |
| | | * event.is_rec // whether to recognize |
| | | * event.picPath // face picture path |
| | | * event.isCompare // whether to compare |
| | | * event.compareScore // compare score |
| | | * event.userId // user id |
| | | * event.feature // face feature |
| | | * } |
| | | * }); |
| | | * setInterval(() => dxFacial.loop(), 50); |
| | | */ |
| | | dxFacial.loop = function () { |
| | | const event = _native.getRecognitionEvent(); |
| | | if (event && typeof _callbacks.onRecognition === 'function') { |
| | | _callbacks.onRecognition(event); |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * Retrieves the latest face detection data for UI purposes (e.g., drawing bounding boxes). |
| | | * @return {array} [data] - Array of detected face objects. |
| | | * @return {number} [data.id] - Face id. |
| | | * @return {number} [data.status] - Face status. 0ï¼detect passã1ï¼live passã2ï¼compare passã3ï¼compare fail |
| | | * @return {array} [data.rect] - Face bounding box coordinates. |
| | | * @return {number} [data.qualityScore] - Face quality score. |
| | | * @return {number} [data.livingScore] - Face living score. |
| | | */ |
| | | dxFacial.getDetectionData = function () { |
| | | return _native.getDetectionData(); |
| | | }; |
| | | |
| | | /** |
| | | * Sets the engine status (running or paused). |
| | | * @param {boolean} isRunning - `true` to run, `false` to pause. |
| | | */ |
| | | dxFacial.setStatus = function (isRunning) { |
| | | _native.setStatus(isRunning); |
| | | }; |
| | | |
| | | /** |
| | | * Gets the estimated environment brightness. |
| | | * @returns {number} Brightness level. |
| | | */ |
| | | dxFacial.getEnvBrightness = function () { |
| | | return _native.getEnvBrightness(); |
| | | }; |
| | | |
| | | /** |
| | | * Gets the number of people detected by the NIR camera. |
| | | * @returns {number} Number of people detected. |
| | | */ |
| | | dxFacial.getNirPersonCount = function () { |
| | | return _native.getNirPersonCount(); |
| | | }; |
| | | |
| | | /** |
| | | * Gets the current engine configuration. |
| | | * @returns {object} Configuration parameters. |
| | | * @return {number} [config.db_max] - Max number of faces in the database. |
| | | * @return {string} [config.db_path] - Path to the face database file. |
| | | * @return {string} [config.det_max] - Maximum number of faces to detect. |
| | | * @return {string} [config.det_min_distance_cm] - Minimum distance in centimeters for detection. |
| | | * @return {string} [config.det_max_distance_cm] - Maximum distance in centimeters for detection. |
| | | * @return {string} [config.det_timeout_ms] - Timeout in milliseconds for detection. |
| | | * @return {string} [config.liv_enable] - Live detection switch |
| | | * @return {string} [config.liv_threshold] - Threshold for living score. |
| | | * @return {string} [config.com_enable] - Face comparison switch |
| | | * @return {string} [config.com_threshold] - Threshold for compare score. |
| | | * @return {string} [config.rec_timeout_ms] - Timeout in milliseconds for recognition. |
| | | * @return {string} [config.x_map] - X axis coordinate mapping parameters. |
| | | * @return {string} [config.y_map] - Y axis coordinate mapping parameters. |
| | | */ |
| | | dxFacial.getConfig = function () { |
| | | return _native.getConfig(); |
| | | }; |
| | | |
| | | /** |
| | | * Sets or updates the engine configuration. |
| | | * @param {object} [config={}] - Configuration object. |
| | | * @param {number} [config.db_max] - Max number of faces in the database. |
| | | * @param {string} [config.db_path] - Path to the face database file. |
| | | * @param {string} [config.det_max] - Maximum number of faces to detect. |
| | | * @param {string} [config.det_min_distance_cm] - Minimum distance in centimeters for detection. |
| | | * @param {string} [config.det_max_distance_cm] - Maximum distance in centimeters for detection. |
| | | * @param {string} [config.det_timeout_ms] - Timeout in milliseconds for detection. |
| | | * @param {string} [config.liv_enable] - Live detection switch |
| | | * @param {string} [config.liv_threshold] - Threshold for living score. |
| | | * @param {string} [config.com_enable] - Face comparison switch |
| | | * @param {string} [config.com_threshold] - Threshold for compare score. |
| | | * @param {string} [config.rec_timeout_ms] - Timeout in milliseconds for recognition. |
| | | * @param {string} [config.x_map] - X axis coordinate mapping parameters. |
| | | * @param {string} [config.y_map] - Y axis coordinate mapping parameters. |
| | | * @param {number} [config.pose_score_threshold] - Pose score threshold. |
| | | */ |
| | | dxFacial.setConfig = function (config) { |
| | | _native.setConfig(config); |
| | | }; |
| | | |
| | | /** |
| | | * Obtain the facial feature values of the camera |
| | | * @param {number} timeout - The timeout in milliseconds. |
| | | * @return {object} - Configuration object. |
| | | * @return {number} - qualityScore. |
| | | * @return {string} - picPath. |
| | | * @return {object} - rect: {x, y, w, h}. |
| | | * @return {string} - feature. |
| | | */ |
| | | dxFacial.getFeaByCap = function (timeout) { |
| | | return _native.getFeaByCap(timeout); |
| | | }; |
| | | |
| | | /** |
| | | * Obtain the facial feature values of the file |
| | | * @param {number} timeout - The timeout in milliseconds. |
| | | * @param {string} filePath - The file path. |
| | | * @returns {object} - The result object. |
| | | * @returns {number} - qualityScore. |
| | | * @returns {object} - rect: {x, y, w, h}. |
| | | * @returns {string} - feature. |
| | | */ |
| | | dxFacial.getFeaByFile = function (filePath) { |
| | | return _native.getFeaByFile(filePath); |
| | | }; |
| | | |
| | | /** |
| | | * compare a face feature with the database. |
| | | * @param {string} featureBase64 - The base64-encoded feature string. |
| | | * @returns {object} - The result object. |
| | | * @return {number} score. |
| | | * @return {string} userId. |
| | | */ |
| | | dxFacial.compareFea = function (featureBase64) { |
| | | return _native.compareFea(featureBase64); |
| | | }; |
| | | |
| | | /** |
| | | * add a face feature into the database. |
| | | * @param {string} userId - The user ID to associate with the feature. |
| | | * @param {string} featureBase64 - The base64-encoded feature string. |
| | | * @returns {number} Result code. |
| | | */ |
| | | dxFacial.addFea = function (userId, featureBase64) { |
| | | return _native.addFea(userId, featureBase64); |
| | | }; |
| | | |
| | | /** |
| | | * updata a face feature into the database. |
| | | * @param {string} userId - The user ID to associate with the feature. |
| | | * @param {string} featureBase64 - The base64-encoded feature string. |
| | | * @returns {number} Result code. |
| | | */ |
| | | dxFacial.updateFea = function (userId, featureBase64) { |
| | | return _native.updateFea(userId, featureBase64); |
| | | }; |
| | | |
| | | /** |
| | | * Deletes a user from the feature database. |
| | | * @param {string} userId - The user ID to delete. |
| | | * @returns {number} Result code. |
| | | */ |
| | | dxFacial.deleteFea = function (userId) { |
| | | return _native.deleteFea(userId); |
| | | }; |
| | | |
| | | /** |
| | | * Clears all features from the database. |
| | | * @returns {number} Result code. |
| | | */ |
| | | dxFacial.cleanFea = function () { |
| | | return _native.cleanFea(); |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * Gets the native module instance. |
| | | * @returns {object|null} |
| | | */ |
| | | dxFacial.getNative = function () { |
| | | return _native; |
| | | }; |
| | | |
| | | export default dxFacial; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { Facial } from './libvbar-m-dxfacial.so'; |
| | | import log from './dxLogger.js' |
| | | |
| | | const dxFacialBarcode = {}; |
| | | const _native = new Facial(); |
| | | let _callbacks = {}; |
| | | |
| | | /** |
| | | * Initializes the barcode client. Must be called before any other operation. |
| | | * @param {object} config - The configuration object. |
| | | * @param {number} config.scanInterval - The interval between scans in milliseconds. |
| | | * @param {number} config.scanTimeout - The timeout for a scan in milliseconds. |
| | | * @param {number} config.roiX - The x-coordinate of the ROI. |
| | | * @param {number} config.roiY - The y-coordinate of the ROI. |
| | | * @example |
| | | * dxFacialBarcode.init(); |
| | | */ |
| | | dxFacialBarcode.init = function () { |
| | | _native.initBarCode(); |
| | | }; |
| | | |
| | | /** |
| | | * Deinitializes the barcode client and releases resources. |
| | | * @returns {void} |
| | | * @example |
| | | * dxFacialBarcode.deinit(); |
| | | */ |
| | | dxFacialBarcode.deinit = function () { |
| | | _native.deinitBarCode(); |
| | | }; |
| | | |
| | | /** |
| | | * Sets the callback function for barcode events. |
| | | * @param {object} callbacks - The callback functions. |
| | | * @param {function(object)} [callbacks.onEvent] - The callback function to handle barcode event. |
| | | * @returns {void} |
| | | * @example |
| | | * dxFacialBarcode.setCallbacks({ |
| | | * onEvent: function(event) { |
| | | * logger.info('Barcode event:', event); |
| | | * } |
| | | * }); |
| | | */ |
| | | dxFacialBarcode.setCallbacks = function (callbacks) { |
| | | if (!callbacks || !callbacks.onEvent) { |
| | | throw new Error('Callbacks must be an object with onEvent function'); |
| | | } |
| | | _callbacks = callbacks; |
| | | }; |
| | | |
| | | /** |
| | | * Sets the configuration for the barcode scanner. |
| | | * @param {object} config - The configuration object. |
| | | * @param {number} config.scanInterval - The interval between scans in milliseconds. |
| | | * @param {number} config.scanTimeout - The timeout for a scan in milliseconds. |
| | | * @param {number} config.roiX - The x-coordinate of the ROI. |
| | | * @param {number} config.roiY - The y-coordinate of the ROI. |
| | | */ |
| | | dxFacialBarcode.setConfig = function (config) { |
| | | _native.setConfigBarCode(config); |
| | | }; |
| | | |
| | | /** |
| | | * Gets the configuration for the barcode scanner. |
| | | * @returns {object} The configuration object. |
| | | */ |
| | | dxFacialBarcode.getConfig = function () { |
| | | return _native.getConfigBarCode(); |
| | | }; |
| | | |
| | | /** |
| | | * Sets the status of the barcode scanner. |
| | | * @param {boolean} status - The status of the barcode scanner. |
| | | */ |
| | | dxFacialBarcode.setStatus = function (status) { |
| | | _native.setStatusBarCode(status); |
| | | }; |
| | | |
| | | /** |
| | | * Processes events from the barcode event queue. Should be called periodically (e.g. in setInterval). |
| | | * Handles barcode events and calls the registered callback function. |
| | | * |
| | | * @example |
| | | * setInterval(() => { |
| | | * dxFacialBarcode.loop(); |
| | | * }, 10); // Process events every 10ms |
| | | */ |
| | | dxFacialBarcode.loop = function () { |
| | | try { |
| | | let event = _native.getBarCodeEvent(); |
| | | if (event && _callbacks.onEvent) { |
| | | _callbacks.onEvent(event); |
| | | } |
| | | } catch (e) { |
| | | log.error('Error in barcode loop:', e); |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * Gets the native barcode client object. |
| | | * @returns {Object|null} The native client object, or null if not initialized. |
| | | */ |
| | | dxFacialBarcode.getNative = function () { |
| | | return _native; |
| | | }; |
| | | |
| | | export default dxFacialBarcode; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * Fingerprint MZ Module |
| | | * |
| | | * This module provides an interface for communicating with the MZ fingerprint module via UART. |
| | | * It supports operations like image capture, fingerprint registration, matching, and storage management. |
| | | * |
| | | * Features: |
| | | * - `Image Capture`: Capture fingerprint images for enrollment or verification. |
| | | * - `Registration`: Generate and store fingerprint templates. |
| | | * - `Matching`: One-to-one (1:1) and one-to-many (1:N) fingerprint matching. |
| | | * - `Storage`: Manage fingerprint templates in the module's flash storage. |
| | | * - `System`: Configure module parameters and read system status. |
| | | * |
| | | * Usage: |
| | | * import dxFingerMz from './dxFingerMz.js'; |
| | | * dxFingerMz.init({ id: 'fingerUart', path: '/dev/ttySLB0' }); |
| | | * const result = dxFingerMz.getImage(); |
| | | */ |
| | | import std from '../dxmodules/dxStd.js' |
| | | import dxUart from '../dxmodules/dxUart.js' |
| | | import common from '../dxmodules/dxCommon.js' |
| | | import log from '../dxmodules/dxLogger.js' |
| | | import * as os from "os" |
| | | |
| | | const dxFingerMz = {} |
| | | |
| | | // Packet Header |
| | | const HEADER = new Uint8Array([0xEF, 0x01]) |
| | | // Device Address |
| | | let ADDRESS = new Uint8Array([0xFF, 0xFF, 0xFF, 0xFF]) |
| | | |
| | | // Packet Flags |
| | | const FLAG = { |
| | | "COMMAND": 0x01, // Command packet |
| | | "DATA": 0x02, // Data packet |
| | | "DATA_END": 0x08, // End of data packet |
| | | "COMMAND_END": 0x07, // Response packet |
| | | } |
| | | |
| | | // LED Color |
| | | dxFingerMz.LED_COLOR = { |
| | | "NONE": 0, |
| | | "BLUE": 1, |
| | | "GREEN": 2, |
| | | "RED": 4, |
| | | } |
| | | |
| | | // Function Code |
| | | dxFingerMz.LED_FUNCTION_CODE = { |
| | | "NORMAL_BREATH": 1, // Common Breathing Light |
| | | "NORMAL_FLASH": 2, // Common Flashing Light |
| | | "CONSTANT_ON": 3, // Constant On Light |
| | | "CONSTANT_OFF": 4, // Constant Off Light |
| | | "GRADUAL_ON": 5, // Gradual On Light |
| | | "GRADUAL_OFF": 6, // Gradual Off Light |
| | | } |
| | | // Command Set |
| | | const CMD_MAP = { |
| | | /* General Commands */ |
| | | "GET_IMAGE": 0x01, // Get image for verification |
| | | "GET_CHAR": 0x02, // Generate character file from image |
| | | "MATCH": 0x03, // Precise match |
| | | "SEARCH": 0x04, // Search fingerprint |
| | | "REG_MODEL": 0x05, // Combine character files (generate template) |
| | | "STORD_CHAR": 0x06, // Store template |
| | | "LOAD_CHAR": 0x07, // Load template |
| | | "UP_CHAR": 0x08, // Upload template |
| | | "DOWN_CHAR": 0x09, // Download template |
| | | "DEL_CHAR": 0x0C, // Delete template |
| | | "CLEAR_CHAR": 0x0D, // Clear fingerprint library |
| | | "WRITE_REG": 0x0E, // Write system register |
| | | "READ_SYS_PARA": 0x0F, // Read system parameters |
| | | "READ_INF_PAGE": 0x16, // Read information page |
| | | "BURN_CODE": 0x1a, // Burn code (Erase code) |
| | | "VALID_TEMPLETE_NUM": 0x1d, // Read valid template count |
| | | "READ_INDEX_TABLE": 0x1f, // Read index table |
| | | "GET_ENROLL_IMAGE": 0x29, // Get image for enrollment |
| | | "SLEEP": 0x33, // Sleep command |
| | | |
| | | /* Module Commands */ |
| | | "CANCEL": 0x30, // Cancel command |
| | | "AUTO_ENROLL": 0x31, // Auto enroll template |
| | | "AUTO_IDENTIFY": 0x32, // Auto identify fingerprint |
| | | |
| | | /* Maintenance Commands */ |
| | | "UP_IMAGE": 0x0A, // Upload image |
| | | "DOWN_IMAGE": 0x0B, // Download image |
| | | "GET_CHIP_SN": 0x34, // Get chip serial number |
| | | "HAND_SHAKE": 0x35, // Handshake |
| | | "CHECK_SENSOR": 0x36, // Check sensor |
| | | "REST_SETTING": 0x3B, // Restore factory settings |
| | | |
| | | /* Custom Commands */ |
| | | "SET_PWD": 0x12, // Set password |
| | | "VFY_PWD": 0x13, // Verify password |
| | | "GET_RANDOM_CODE": 0x14, // Get random code |
| | | "SET_CHIP_ADDR": 0x15, // Set chip address |
| | | "WRITE_NOTEPAD": 0x18, // Write notepad |
| | | "READ_NOTEPAD": 0x19, // Read notepad |
| | | "CONTROL_BLN": 0x3C, // Control LED light |
| | | "GET_IMAGE_INFO": 0x3D, // Get image info |
| | | "SEARCH_NOW": 0x3E, // Search current fingerprint |
| | | } |
| | | |
| | | let options = { |
| | | id: 'fingerUart', |
| | | total: 5000, |
| | | timeout: 500, |
| | | type: '3', |
| | | path: '/dev/ttySLB0', |
| | | baudrate: '57600-8-N-2' |
| | | } |
| | | |
| | | /** |
| | | * Get Image (Verification) - Detects finger and stores the fingerprint image in the image buffer. |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.getImage = function () { |
| | | let resp = execCmd(CMD_MAP.GET_IMAGE) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Generate Character File - Generates a fingerprint character file from the image in the image buffer and stores it in the character buffer. |
| | | * @param {number} bufferId - Buffer ID (1 or 2). |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.genChar = function (bufferId) { |
| | | let resp = execCmd(CMD_MAP.GET_CHAR, [bufferId]) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Precise Match - Compares the character file or template in the buffer. |
| | | * @returns {object|null} An object containing the result code and match score, or null on failure. |
| | | * - code: Confirmation code. |
| | | * - score: Match score. |
| | | */ |
| | | dxFingerMz.match = function () { |
| | | let resp = execCmd(CMD_MAP.MATCH) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return { code: resp.data[0], score: fromEndianHexExtended(resp.data.subarray(1, 3), 2, false) } |
| | | } else { |
| | | return null |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Search Fingerprint - Searches the fingerprint library (whole or partial) using the character file in the buffer. |
| | | * If found, returns the page number. |
| | | * @param {number} bufferId - Character buffer ID (default is 1). |
| | | * @param {number} startPage - Start page number. |
| | | * @param {number} pageNum - Number of pages to search. |
| | | * @returns {object|null} An object containing the result code, page index, and score, or null on failure. |
| | | * - code: Confirmation code. |
| | | * - pageIndex: Index of the found page. |
| | | * - score: Match score. |
| | | */ |
| | | dxFingerMz.search = function (bufferId, startPage, pageNum) { |
| | | let data = new Uint8Array([bufferId, ...toEndianHexExtended(startPage, 2, false), ...toEndianHexExtended(pageNum, 2, false)]) |
| | | let resp = execCmd(CMD_MAP.SEARCH, data) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return { code: resp.data[0], pageIndex: fromEndianHexExtended(resp.data.subarray(1, 3), 2, false), score: fromEndianHexExtended(resp.data.subarray(3, 5), 2, false) } |
| | | } else { |
| | | return null |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Register Model (Combine Characters) - Combines character files to generate a template and stores it in the character buffer. |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.regModel = function () { |
| | | let resp = execCmd(CMD_MAP.REG_MODEL) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Store Template - Stores the template file from the buffer to the flash database at the specified page index. |
| | | * @param {number} bufferId - Character buffer ID (default is 1). |
| | | * @param {number} pageIndex - Fingerprint library location index. |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.storeChar = function (bufferId, pageIndex) { |
| | | let data = new Uint8Array([bufferId, ...toEndianHexExtended(pageIndex, 2, false)]) |
| | | let resp = execCmd(CMD_MAP.STORD_CHAR, data) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Load Template - Reads the fingerprint template from the flash database at the specified page index into the buffer. |
| | | * @param {number} bufferId - Character buffer ID (default is 2). |
| | | * @param {number} pageIndex - Fingerprint library location index. |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.loadChar = function (bufferId, pageIndex) { |
| | | let data = new Uint8Array([bufferId, ...toEndianHexExtended(pageIndex, 2, false)]) |
| | | let resp = execCmd(CMD_MAP.LOAD_CHAR, data) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Upload Template - Uploads the template file from the buffer to the Host. |
| | | * @param {number} bufferId - Character buffer ID (default is 2). |
| | | * @returns {ArrayBuffer|null} Template data, or null on failure. |
| | | */ |
| | | dxFingerMz.upChar = function (bufferId) { |
| | | let resp = execCmd(CMD_MAP.UP_CHAR, [bufferId]) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | let data = recvDataPkt({ header: HEADER, addr: ADDRESS, flag: FLAG.DATA }) |
| | | return data |
| | | } else { |
| | | return null |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Download Template - Downloads a template from the Host to the module's buffer. |
| | | * @param {number} bufferId - Character buffer ID (default is 1). |
| | | * @param {ArrayBuffer} char - Template data. |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.downChar = function (bufferId, char) { |
| | | let resp = execCmd(CMD_MAP.DOWN_CHAR, [bufferId]) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | sendData({ |
| | | header: HEADER, addr: ADDRESS, flag: new Uint8Array([FLAG.DATA]), len: new Uint8Array(toEndianHexExtended(2, 2, false)), cmd: new Uint8Array([CMD_MAP.DOWN_CHAR]), |
| | | data: char |
| | | }) |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Delete Template - Deletes N fingerprint templates starting from the specified page index in the flash database. |
| | | * @param {number} pageIndex - Starting index in the fingerprint library. |
| | | * @param {number} num - Number of templates to delete. |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.deletChar = function (pageIndex, num) { |
| | | let data = new Uint8Array([...toEndianHexExtended(pageIndex, 2, false), ...toEndianHexExtended(num, 2, false)]) |
| | | let resp = execCmd(CMD_MAP.DEL_CHAR, data) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Clear Library (PS_Empty) - Deletes all fingerprint templates in the flash database. |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.clearChar = function () { |
| | | let resp = execCmd(CMD_MAP.CLEAR_CHAR) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Write System Register - Writes to a module register. |
| | | * @param {number} regId - Register ID. |
| | | * @param {number} context - Content to write. |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.writeReg = function (regId, context) { |
| | | let resp = execCmd(CMD_MAP.WRITE_REG, [regId, context]) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Read System Parameters - Reads the module's basic parameters (baud rate, packet size, etc.). |
| | | * @returns {object|null} An object containing the result code and parameter data, or null on failure. |
| | | * - code: Confirmation code. |
| | | * - data: System parameters. |
| | | */ |
| | | dxFingerMz.readSysPara = function () { |
| | | let resp = execCmd(CMD_MAP.READ_SYS_PARA) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return { code: resp.data[resp.data.length - 1], data: resp.data.subarray(0, resp.data.length - 1) } |
| | | } else { |
| | | return null |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Get Valid Template Count - Reads the number of valid templates. |
| | | * @returns {object|null} An object containing the result code and valid count, or null on failure. |
| | | * - code: Confirmation code. |
| | | * - validNum: Number of valid templates. |
| | | */ |
| | | dxFingerMz.getValidTemplateNum = function () { |
| | | let resp = execCmd(CMD_MAP.VALID_TEMPLETE_NUM) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return { code: resp.data[0], validNum: resp.data[1] } |
| | | } else { |
| | | return null |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Read Index Table - Reads the index table of enrolled templates. |
| | | * @param {number} indexPage - Index table page number (0, 1, 2, 3...). Each page corresponds to a range of templates (0-255, 256-511, etc.). |
| | | * Each bit represents a template: 1 means enrolled, 0 means not enrolled. |
| | | * @returns {object|null} An object containing the result code and index table, or null on failure. |
| | | * - code: Confirmation code. |
| | | * - indexTable: The index table data. |
| | | */ |
| | | dxFingerMz.readIndexTable = function (indexPage) { |
| | | let resp = execCmd(CMD_MAP.READ_INDEX_TABLE, [indexPage]) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return { code: resp.data[0], indexTable: resp.data.subarray(1) } |
| | | } else { |
| | | return null |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Get Enroll Image - Detects finger and stores the fingerprint image in the buffer (for registration). |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.getEnrollImage = function () { |
| | | let resp = execCmd(CMD_MAP.GET_ENROLL_IMAGE) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Sleep - Sets the sensor to sleep mode. |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.sleep = function () { |
| | | let resp = execCmd(CMD_MAP.SLEEP) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Cancel - Cancels auto-registration or auto-verification operations. |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.cancel = function () { |
| | | let resp = execCmd(CMD_MAP.CANCEL) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Auto Register - One-stop fingerprint registration. Includes capture, feature generation, template merging, and storage. |
| | | * @param {number} pageIndex - Page index. |
| | | * @param {number} count - Number of finger presses required. |
| | | * @param {number} [timeout=60] - Timeout in seconds. |
| | | * @param {number} [config=0] - Configuration flags. |
| | | * @returns {ArrayBuffer|null} Result data, or null on failure/timeout. |
| | | */ |
| | | dxFingerMz.autoRegister = function (pageIndex, count, timeout = 60, config = 0) { |
| | | let param = { |
| | | header: HEADER, addr: ADDRESS, flag: new Uint8Array([FLAG.COMMAND]), len: new Uint8Array(toEndianHexExtended(8, 2, false)), cmd: new Uint8Array([CMD_MAP.AUTO_ENROLL]) |
| | | , data: new Uint8Array([...toEndianHexExtended(pageIndex, 2, false), count, ...toEndianHexExtended(config, 2, false)]) |
| | | } |
| | | // Send command |
| | | send(param) |
| | | // For each press, there will be multiple responses (status, merge result, duplicate check, store result). |
| | | let startTime = Date.now() |
| | | while (Date.now() - startTime < timeout * 1000) { |
| | | let resp = recvCmdPkt({ addr: ADDRESS }) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END && resp.data[0] == 0x00 && resp.data[1] == 0x06 && resp.data[2] == 0xf2) { |
| | | return resp.data |
| | | } |
| | | os.sleep(50) |
| | | } |
| | | return null |
| | | } |
| | | |
| | | /** |
| | | * Auto Compare - Automatic fingerprint verification. Includes image capture, feature generation, and search. |
| | | * @param {number} pageIndex - Template index for 1:1 match, or 0xFFFF for 1:N search. |
| | | * @param {number} scoreLevel - Security level (1-5, default is 3). |
| | | * @param {number} config - Configuration flags. |
| | | * @returns {object|null} An object containing the result code, index, and score, or null on failure. |
| | | * - code: Confirmation code. |
| | | * - index: Matched index. |
| | | * - score: Match score. |
| | | */ |
| | | dxFingerMz.autoCompare = function (pageIndex, scoreLevel, config) { |
| | | let param = { |
| | | header: HEADER, addr: ADDRESS, flag: new Uint8Array([FLAG.COMMAND]), len: new Uint8Array(toEndianHexExtended(8, 2, false)), cmd: new Uint8Array([CMD_MAP.AUTO_IDENTIFY]) |
| | | , data: new Uint8Array([scoreLevel, ...toEndianHexExtended(pageIndex, 2, false), ...toEndianHexExtended(config, 2, false)]) |
| | | } |
| | | // Send command |
| | | send(param) |
| | | // Expect 3 responses: 1. Command validity, 2. Image result, 3. Search result. |
| | | for (let i = 0; i < 3; i++) { |
| | | let resp = recvCmdPkt({ addr: ADDRESS }) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END && resp.data[0] == 0 && resp.data[1] == 0x05) { |
| | | return { code: resp.data[0], index: fromEndianHexExtended(resp.data.subarray(2, 4), 2, false), score: fromEndianHexExtended(resp.data.subarray(4, 6), 2, false) } |
| | | } |
| | | } |
| | | return null |
| | | } |
| | | |
| | | /** |
| | | * Get Chip SN - Retrieves the unique serial number of the chip. |
| | | * @returns {object|null} An object containing the result code and serial number, or null on failure. |
| | | * - code: Confirmation code. |
| | | * - sn: Serial number string/buffer. |
| | | */ |
| | | dxFingerMz.getChipSN = function () { |
| | | let resp = execCmd(CMD_MAP.GET_CHIP_SN, [0x00]) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return { code: resp.data[0], sn: resp.data.subarray(1) } |
| | | } else { |
| | | return null |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Search Now - Searches the library using the most recently extracted feature in the character buffer. |
| | | * @param {number} startPage - Start page index. |
| | | * @param {number} pageNum - Number of pages to search. |
| | | * @returns {object|null} An object containing the result code, page index, and score, or null on failure. |
| | | * - code: Confirmation code. |
| | | * - pageIndex: Found page index. |
| | | * - score: Match score. |
| | | */ |
| | | dxFingerMz.searchNow = function (startPage, pageNum) { |
| | | let data = new Uint8Array([...toEndianHexExtended(startPage, 2, false), ...toEndianHexExtended(pageNum, 2, false)]) |
| | | let resp = execCmd(CMD_MAP.SEARCH_NOW, data) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return { code: resp.data[0], pageIndex: fromEndianHexExtended(resp.data.subarray(1, 3), 2, false), score: fromEndianHexExtended(resp.data.subarray(3, 5), 2, false) } |
| | | } else { |
| | | return null |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Restore Factory Settings - Clears internal data (if enrolled) and deletes internal keys. |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.restSetting = function () { |
| | | let resp = execCmd(CMD_MAP.REST_SETTING) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Control LED - Controls the LED color and brightness. |
| | | * @param {number} startColor - Start color(dxFingerMz.LED_COLOR.BLUE, dxFingerMz.LED_COLOR.GREEN, dxFingerMz.LED_COLOR.RED). |
| | | * @param {number} functionCode - Function code. |
| | | * @param {number} endColor - End color (default is dxFingerMz.LED_COLOR.RED). |
| | | * @param {number} loopCount - Loop count (default is 0). |
| | | * @returns {number} Confirmation code (0 for success, others for failure). |
| | | */ |
| | | dxFingerMz.controlLed = function (startColor, functionCode = dxFingerMz.LED_FUNCTION_CODE.CONSTANT_ON, endColor = dxFingerMz.LED_COLOR.RED, loopCount = 0) { |
| | | let data = new Uint8Array([functionCode, startColor, endColor, loopCount]) |
| | | let resp = execCmd(CMD_MAP.CONTROL_BLN, data) |
| | | if (resp && resp.flag[0] == FLAG.COMMAND_END) { |
| | | return resp.data |
| | | } else { |
| | | return -1 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Retrieve the first unused index from the fingerprint database |
| | | * @returns {number} Return the first unused index, returning -1 indicates retrieval failure |
| | | */ |
| | | dxFingerMz.getIndex = function () { |
| | | // The fingerprint database has four page numbers, 0-3. Traverse and search these four page numbers |
| | | for(let i = 0; i < 4; i++){ |
| | | let inx = dxFingerMz.readIndexTable(i) |
| | | if(inx && inx.code == 0){ |
| | | let ret = findFreeFingerIndex(inx.indexTable, i) |
| | | if(ret != -1){ |
| | | return ret |
| | | } |
| | | } |
| | | } |
| | | return -1 |
| | | } |
| | | |
| | | /** |
| | | * Set Device Address - Sets the device address (default is 0xFFFFFFFF). |
| | | * @param {number} startId - Start ID. |
| | | * @param {number} endId - End ID. |
| | | * @returns {number} The available fingerprint ID, or false on failure. |
| | | */ |
| | | dxFingerMz.setChipAddr = function (startId, endId) { |
| | | } |
| | | |
| | | /** |
| | | * Initialize Fingerprint Module. |
| | | * @param {Object} params - Initialization parameters. |
| | | * @param {string} [params.type='3'] - UART type. |
| | | * @param {string} [params.path='/dev/ttySLB1'] - UART path. |
| | | * @param {string} [params.baudrate='115200-8-N-1'] - Baud rate configuration. |
| | | * @param {string} [params.id='fingerUart'] - Connection ID. |
| | | * @param {number} [params.total=5000] - Total fingerprint capacity. |
| | | * @param {number} [params.timeout=500] - Timeout in milliseconds. |
| | | */ |
| | | dxFingerMz.init = function (params) { |
| | | options.id = params.id ? params.id : options.id |
| | | options.timeout = params.timeout ? params.timeout : options.timeout |
| | | options.total = params.total ? params.total : options.total |
| | | options.type = params.type ? params.type : options.type |
| | | options.path = params.path ? params.path : options.path |
| | | options.baudrate = params.baudrate ? params.baudrate : options.baudrate |
| | | |
| | | dxUart.open(options.type, options.path, options.id) |
| | | dxUart.ioctl(6, options.baudrate, options.id) |
| | | } |
| | | |
| | | /** *****************************private******************************* */ |
| | | |
| | | /** |
| | | * Execute Command - Sends a command and receives the response. |
| | | * @private |
| | | * @param {number} cmd - The command to execute. |
| | | * @param {Uint8Array|Array} [data] - Optional data payload. |
| | | * @returns {Object|null} The response packet, or null on failure. |
| | | */ |
| | | function execCmd(cmd, data) { |
| | | let len = 3 // cmd(1) + checksum(2) |
| | | let cmdData = data |
| | | if (data) { |
| | | if (Array.isArray(data)) { |
| | | cmdData = new Uint8Array(data) |
| | | } |
| | | len += cmdData.length |
| | | } |
| | | |
| | | let param = { |
| | | header: HEADER, |
| | | addr: ADDRESS, |
| | | flag: new Uint8Array([FLAG.COMMAND]), |
| | | len: new Uint8Array(toEndianHexExtended(len, 2, false)), |
| | | cmd: new Uint8Array([cmd]) |
| | | } |
| | | |
| | | if (cmdData) { |
| | | param.data = cmdData |
| | | } |
| | | |
| | | // Send command |
| | | send(param) |
| | | return recvCmdPkt({ addr: ADDRESS }) |
| | | } |
| | | |
| | | /** |
| | | * Send Packet |
| | | * @private |
| | | * @param {Object} params - Packet parameters. |
| | | * @param {number} params.header - Packet header. |
| | | * @param {number} params.addr - Device address. |
| | | * @param {number} params.flag - Packet flag. |
| | | * @param {number} params.len - Packet length. |
| | | * @param {number} params.cmd - Command byte (optional). |
| | | * @param {string} params.data - Data payload (optional). |
| | | */ |
| | | function send(params) { |
| | | if (!params || typeof params !== 'object') { |
| | | throw new Error("Parameters should be an object containing prefix, cmd and data"); |
| | | } |
| | | |
| | | const { header, addr, flag, len, cmd, data } = params; |
| | | // Build packet |
| | | let packet = concatUint8Arrays(header, addr, flag, len, cmd, data, new Uint8Array([0x00, 0x00])); |
| | | |
| | | // Calculate checksum |
| | | let checksum = 0; |
| | | for (let i = 6; i < packet.length; i++) { |
| | | checksum += packet[i]; |
| | | } |
| | | checksum = Math.min(checksum, 0xFFFF); |
| | | // Set checksum |
| | | packet.set(new Uint8Array(toEndianHexExtended(checksum, 2, false)), packet.length - 2); |
| | | |
| | | // Send packet via UART |
| | | let ret = dxUart.send(packet.buffer, options.id); |
| | | if (!ret) { |
| | | throw new Error("dxFingerMz.send fail") |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Send Data Packet - Splits data into chunks and sends them. |
| | | * @private |
| | | * @param {Object} params - Parameters. |
| | | * @param {string|Uint8Array} params.data - Data to send. |
| | | */ |
| | | function sendData(param) { |
| | | let dataLen = param.data.length |
| | | let transNum = Math.ceil(dataLen / 128) |
| | | for (let i = 0; i < transNum; i++) { |
| | | let data = param.data.subarray(i * 128, (i + 1) * 128 > dataLen ? dataLen : (i + 1) * 128) |
| | | let childParam = { |
| | | header: HEADER, addr: ADDRESS, flag: new Uint8Array([FLAG.DATA]), len: new Uint8Array(toEndianHexExtended(2, 2, false)) |
| | | , data: data |
| | | } |
| | | childParam.len = new Uint8Array(toEndianHexExtended(data.length + 2, 2, false)) |
| | | if (i == transNum - 1) { |
| | | childParam.flag = new Uint8Array([FLAG.DATA_END]) |
| | | } else { |
| | | childParam.flag = new Uint8Array([FLAG.DATA]) |
| | | } |
| | | send(childParam) |
| | | os.sleep(100) |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Receive Packet - Reads a single packet from UART. |
| | | * @private |
| | | * @param {Object} param - Parameters. |
| | | * @param {Uint8Array} param.addr - Expected address. |
| | | * @returns {Object|null} Received packet object, or null if invalid/timeout. |
| | | */ |
| | | function receive(param) { |
| | | const header1 = dxUart.receive(1, options.timeout, options.id); |
| | | if (!header1 || header1[0] !== 0xEF) { |
| | | std.sleep(50) |
| | | return null |
| | | } |
| | | const header2 = dxUart.receive(1, options.timeout, options.id); |
| | | if (!header2 || header2[0] !== 0x01) { |
| | | std.sleep(50) |
| | | return null |
| | | } |
| | | |
| | | // Receive addr |
| | | const addr = dxUart.receive(4, options.timeout, options.id); |
| | | if (common.arrayBufferToHexString(addr) != common.arrayBufferToHexString(param.addr)) { |
| | | return null |
| | | } |
| | | |
| | | // Receive flag |
| | | const flag = dxUart.receive(1, options.timeout, options.id); |
| | | |
| | | // Receive len |
| | | const len = dxUart.receive(2, options.timeout, options.id); |
| | | |
| | | // Receive data |
| | | const data = dxUart.receive((fromEndianHexExtended(len, 2, false)) - 2, options.timeout, options.id); |
| | | |
| | | // Receive checksum |
| | | const checksumPkt = dxUart.receive(2, options.timeout, options.id); |
| | | |
| | | // Verify checksum |
| | | let checksum = 0; |
| | | let packet = concatUint8Arrays(flag, len, data); |
| | | for (let i = 0; i < packet.length; i++) { |
| | | checksum += packet[i]; |
| | | } |
| | | checksum = Math.min(checksum, 0xFFFF); |
| | | if (checksum != fromEndianHexExtended(checksumPkt, 2, false)) { |
| | | return null |
| | | } |
| | | |
| | | let allPack = concatUint8Arrays(new Uint8Array([header1, header2]), addr, flag, len, data, checksumPkt); |
| | | |
| | | return { |
| | | header: new Uint8Array([header1, header2]), |
| | | addr: addr, |
| | | flag: flag, |
| | | len: len, |
| | | data: data, |
| | | checksum: checksum |
| | | }; |
| | | } |
| | | |
| | | /** |
| | | * Receive Data Packet - Receives a multi-packet data stream. |
| | | * @private |
| | | * @param {Object} param - Parameters. |
| | | * @returns {Uint8Array} The complete data buffer. |
| | | */ |
| | | function recvDataPkt(param) { |
| | | let chunks = []; // Collect all chunks |
| | | let totalLength = 0; |
| | | let deadlineTime = Date.now() + 2000; |
| | | |
| | | while (Date.now() < deadlineTime) { |
| | | const data = receive(param); |
| | | if (data) { |
| | | chunks.push(data.data); |
| | | totalLength += data.data.length; |
| | | } else { |
| | | break; |
| | | } |
| | | os.sleep(10); |
| | | } |
| | | |
| | | // Merge all chunks |
| | | const packet = new Uint8Array(totalLength); |
| | | let offset = 0; |
| | | for (const chunk of chunks) { |
| | | packet.set(chunk, offset); |
| | | offset += chunk.length; |
| | | } |
| | | |
| | | return packet; |
| | | } |
| | | |
| | | /** |
| | | * Receive Command Packet - Attempts to receive a command response multiple times. |
| | | * @private |
| | | * @param {Object} param - Parameters. |
| | | * @returns {Object|null} Response packet, or null on failure. |
| | | */ |
| | | function recvCmdPkt(param) { |
| | | for (let i = 0; i < 5; i++) { |
| | | const packet = receive(param); |
| | | if (packet) { |
| | | return packet |
| | | } |
| | | os.sleep(10) |
| | | } |
| | | return null |
| | | } |
| | | |
| | | /** |
| | | * Convert number to little-endian (default) hex byte array. |
| | | * @private |
| | | * @param {number} number - The number to convert. |
| | | * @param {number} bytes - Number of bytes. |
| | | * @param {boolean} isLittleEndian - Little endian flag. |
| | | * @returns {Uint8Array} The byte array. |
| | | */ |
| | | function toEndianHexExtended(number, bytes, isLittleEndian = true) { |
| | | const buffer = new Uint8Array(bytes); |
| | | for (let i = 0; i < bytes; i++) { |
| | | // Bitwise operation, taking 8 bits at a time |
| | | buffer[i] = (number >> (i * 8)) & 0xFF; |
| | | } |
| | | // If big endian, reverse the array |
| | | if (!isLittleEndian) { |
| | | buffer.reverse(); |
| | | } |
| | | return buffer; |
| | | } |
| | | |
| | | /** |
| | | * Convert byte array to number (supports little/big endian). |
| | | * @private |
| | | * @param {Uint8Array|number[]} bytesArray - The byte array. |
| | | * @param {number} bytes - Number of bytes. |
| | | * @param {boolean} isLittleEndian - Little endian flag. |
| | | * @returns {number} The converted number. |
| | | */ |
| | | function fromEndianHexExtended(bytesArray, bytes, isLittleEndian = true) { |
| | | // Parameter validation |
| | | if (!bytesArray || bytesArray.length !== bytes) { |
| | | throw new Error(`Invalid bytes array. Expected length: ${bytes}`); |
| | | } |
| | | |
| | | let result = 0; |
| | | if (isLittleEndian) { |
| | | // Little endian: least significant byte first |
| | | for (let i = 0; i < bytes; i++) { |
| | | result |= (bytesArray[i] << (i * 8)); |
| | | } |
| | | } else { |
| | | // Big endian: most significant byte first |
| | | for (let i = 0; i < bytes; i++) { |
| | | result = (result << 8) | bytesArray[i]; |
| | | } |
| | | } |
| | | |
| | | // Return as unsigned integer |
| | | return result >>> 0; |
| | | } |
| | | |
| | | /** |
| | | * Concatenate multiple Uint8Arrays. |
| | | * @private |
| | | * @param {...Uint8Array} arrays - Arrays to concatenate. |
| | | * @returns {Uint8Array} The concatenated array. |
| | | */ |
| | | function concatUint8Arrays(...arrays) { |
| | | const validArrays = arrays.filter(arr => arr && arr.length > 0); |
| | | const totalLength = validArrays.reduce((acc, arr) => acc + arr.length, 0); |
| | | |
| | | const result = new Uint8Array(totalLength); |
| | | let offset = 0; |
| | | validArrays.forEach(arr => { |
| | | result.set(arr, offset); |
| | | offset += arr.length; |
| | | }); |
| | | return result |
| | | } |
| | | |
| | | /** |
| | | * Find the earliest (smallest) unused template index in the fingerprint module |
| | | * |
| | | * @param {Uint8Array} buf The element is a 32-byte Uint8Array |
| | | * @returns {number} Return the available template number (0~1023). Returning -1 indicates no empty space. |
| | | */ |
| | | function findFreeFingerIndex(buf, page) { |
| | | |
| | | // Traverse 32 bytes â 256 bits |
| | | for (let byteIndex = 0; byteIndex < 32; byteIndex++) { |
| | | let byte = buf[byteIndex]; |
| | | |
| | | // byte == 0xFF means all 8 bits are occupied, skip |
| | | if (byte === 0xFF) continue; |
| | | |
| | | // Find which bit in byte is 0 |
| | | for (let bit = 0; bit < 8; bit++) { |
| | | let used = (byte >> bit) & 1; |
| | | |
| | | if (used === 0) { |
| | | // Global index = page offset + bit position |
| | | let globalIndex = page * 256 + byteIndex * 8 + bit; |
| | | return globalIndex; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return -1; // No empty space |
| | | } |
| | | |
| | | export default dxFingerMz; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import std from './dxStd.js' |
| | | import dxUart from './dxUart.js' |
| | | import dxCommon from './dxCommon.js' |
| | | import log from './dxLogger.js' |
| | | |
| | | const dxFingerZaz = {} |
| | | |
| | | let options = { |
| | | id : 'fingerUart', |
| | | total: 5000, |
| | | timeout : 500, |
| | | type : '3', |
| | | path : '/dev/ttySLB1', |
| | | baudrate : '115200-8-N-1' |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æµè¯æçº¹æ¨¡åå½ä»¤ |
| | | * @returns {boolean} è¿åtrue表示æµè¯æåï¼è¿åfalse表示æµè¯å¤±è´¥ |
| | | */ |
| | | dxFingerZaz.test = function () { |
| | | send({prefix: 0x55AA, cmd: 0x0100, data: ''}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x0100}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return true |
| | | } else { |
| | | log.error("dxFingerZaz.test:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åæå®ç¼å·èå´å
坿³¨åçé¦ä¸ªç¼å· |
| | | * @param {number} startId - èµ·å§ç¼å· |
| | | * @param {number} endId - ç»æç¼å· |
| | | * @returns {number} è¿å空é²çæçº¹ç¼å·ï¼è¿åfalse表示è·å失败ï¼å¤±è´¥åå å¯åèretï¼ |
| | | */ |
| | | dxFingerZaz.getEmptyId = function (startId, endId) { |
| | | if(startId === undefined || startId === null || startId < 1 || startId > options.total){ |
| | | throw new Error("dxFingerZaz.getEmptyId: 'startId' parameter should be between 1 and " + options.total) |
| | | } |
| | | if(endId === undefined || endId === null || endId < 1 || endId > options.total){ |
| | | throw new Error("dxFingerZaz.getEmptyId: 'endId' parameter should be between 1 and " + options.total) |
| | | } |
| | | |
| | | let data = toEndianHexExtended(startId, 2) + toEndianHexExtended(endId, 2) |
| | | send({prefix: 0x55AA, cmd: 0x4500, data: data}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x4500}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return fromEndianHexExtended(resp.data, 2) |
| | | } else { |
| | | log.error("dxFingerZaz.getEmptyId:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åæå®ç¼å·çæ¨¡æ¿æ³¨åç¶æ |
| | | * @param {number} keyId - æçº¹ç¼å· |
| | | * @returns {number} è¿å0è¡¨ç¤ºæªæ³¨åï¼è¿å1表示已注åï¼è¿åfalse表示è·å失败 |
| | | */ |
| | | dxFingerZaz.getStatus = function (keyId) { |
| | | if (keyId === undefined || keyId === null) { |
| | | throw new Error("dxFingerZaz.getStatus: 'keyId' parameter should not be null or empty") |
| | | } |
| | | |
| | | send({prefix: 0x55AA, cmd: 0x4600, data: toEndianHexExtended(keyId, 2)}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x4600}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return fromEndianHexExtended(resp.data, 1) |
| | | } else { |
| | | log.error("dxFingerZaz.getStatus:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * ééæçº¹å¾å |
| | | * @returns {boolean} è¿åtrue表示ééæåï¼è¿åfalse表示éé失败ï¼å¤±è´¥åå å¯åèretï¼ |
| | | */ |
| | | dxFingerZaz.getImage = function () { |
| | | send({prefix: 0x55AA, cmd: 0x2000, data: ""}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x2000}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return true |
| | | } else { |
| | | // log.error("dxFingerZaz.getImage:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 仿åå¨ImageBufferä¸çæçº¹å¾åäº§çæ¨¡æ¿ |
| | | * @param {number} bufferNum - æçº¹æ¨¡æ¿ç¼å·ï¼0-2ï¼ |
| | | * @returns {boolean} è¿åtrueè¡¨ç¤ºçææåï¼è¿åfalse表示çæå¤±è´¥ï¼å¤±è´¥åå å¯åèretï¼ |
| | | */ |
| | | dxFingerZaz.generate = function (bufferNum) { |
| | | if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){ |
| | | throw new Error("dxFingerZaz.generate: 'bufferNum' parameter should be between 0 and 3") |
| | | } |
| | | send({prefix: 0x55AA, cmd: 0x6000, data: toEndianHexExtended(bufferNum, 2)}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x6000}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return true |
| | | } else { |
| | | log.error("dxFingerZaz.generate:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * åå¹¶æçº¹æ¨¡æ¿ |
| | | * @param {number} mergeCount - åå¹¶æ¨¡æ¿æ°éï¼2|3ï¼ 2:åæ Ram Buffer0 å Ram Buffer1ï¼3:åæ Ram Buffer0ãRam Buffer1 å Ram Buffer2 |
| | | * @param {number} bufferNum - æçº¹å并忍¡æ¿ç¼å·ï¼0-2ï¼ |
| | | * @returns {boolean} è¿åtrue表示åå¹¶æåï¼è¿åfalse表示å并失败 |
| | | */ |
| | | dxFingerZaz.merge = function (mergeCount, bufferNum) { |
| | | if(mergeCount === undefined || mergeCount === null || mergeCount < 2 || mergeCount > 3){ |
| | | throw new Error("dxFingerZaz.merge: 'mergeCount' parameter should be between 2 and 3") |
| | | } |
| | | if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){ |
| | | throw new Error("dxFingerZaz.merge: 'bufferNum' parameter should be between 0 and 3") |
| | | } |
| | | |
| | | let data = toEndianHexExtended(bufferNum, 2) + toEndianHexExtended(mergeCount, 1) |
| | | send({prefix: 0x55AA, cmd: 0x6100, data: data}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x6100}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return true |
| | | } else { |
| | | log.error("dxFingerZaz.merge:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * ä¿åæçº¹æ¨¡æ¿æ°æ®å°æ¨¡åæçº¹åº |
| | | * @param {number} keyId - æçº¹ç¼å· |
| | | * @param {number} bufferNum - æçº¹æ¨¡æ¿ç¼å·ï¼0-2ï¼ |
| | | * @param {boolean} [overwrite=false] - æ¯å¦è¦çå·²åå¨çæçº¹ |
| | | * @returns {boolean} è¿åtrue表示å卿åï¼è¿åfalse表示åå¨å¤±è´¥ |
| | | */ |
| | | dxFingerZaz.storeChar = function (keyId, bufferNum, overwrite = false) { |
| | | if(keyId === undefined || keyId === null){ |
| | | throw new Error("dxFingerZaz.storeChar: 'keyId' parameter should be between 0 and 255") |
| | | } |
| | | if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){ |
| | | throw new Error("dxFingerZaz.storeChar: 'bufferNum' parameter should be between 0 and 3") |
| | | } |
| | | if (overwrite) { |
| | | const delRet = dxFingerZaz.delChar(keyId, keyId) |
| | | if (!delRet) { |
| | | log.error("dxFingerZaz.storeChar: failed to delete existing fingerprint for keyId", keyId) |
| | | return false |
| | | } |
| | | } |
| | | let data = toEndianHexExtended(keyId, 2) + toEndianHexExtended(bufferNum, 2) |
| | | send({prefix: 0x55AA, cmd: 0x4000, data: data}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x4000}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return true |
| | | } else { |
| | | log.error("dxFingerZaz.storeChar:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è¯»åæ¨¡åä¸çæçº¹å¹¶æåå¨RamBufferä¸ |
| | | * @param {number} keyId - æçº¹ç¼å· |
| | | * @param {number} bufferNum - æçº¹æ¨¡æ¿ç¼å·ï¼0-2ï¼ |
| | | * @returns {boolean} è¿åtrue表示å卿åï¼è¿åfalse表示åå¨å¤±è´¥ |
| | | */ |
| | | dxFingerZaz.loadChar = function (keyId, bufferNum) { |
| | | if(keyId === undefined || keyId === null){ |
| | | throw new Error("dxFingerZaz.loadChar: 'keyId' parameter should be between 0 and 255") |
| | | } |
| | | if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){ |
| | | throw new Error("dxFingerZaz.loadChar: 'bufferNum' parameter should be between 0 and 3") |
| | | } |
| | | |
| | | let data = toEndianHexExtended(keyId, 2) + toEndianHexExtended(bufferNum, 2) |
| | | send({prefix: 0x55AA, cmd: 0x4100, data: data}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x4100}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return true |
| | | } else { |
| | | log.error("dxFingerZaz.loadChar:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * å°ä¿åäºæå®ç¼å·çRam Buffer ä¸ç Template ä¸ä¼ è³HOST |
| | | * @param {number} bufferNum - æçº¹æ¨¡æ¿ç¼å·ï¼0-2ï¼ |
| | | * @returns {string} è¿å设å¤ä¿¡æ¯ï¼è¿åfalse表示è·å失败 |
| | | */ |
| | | dxFingerZaz.upChar = function (bufferNum) { |
| | | if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){ |
| | | throw new Error("dxFingerZaz.upChar: 'bufferNum' parameter should be between 0 and 3") |
| | | } |
| | | |
| | | let data = toEndianHexExtended(bufferNum, 2) |
| | | send({prefix: 0x55AA, cmd: 0x4200, data: data}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x4200}) |
| | | if(resp && resp.ret == 0x00){ |
| | | log.info("resp.data:", fromEndianHexExtended(resp.data, 2)) |
| | | resp = receive({prefix: 0xA55A, cmd: 0x4200, len: fromEndianHexExtended(resp.data, 2)}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return dxCommon.uint8ArrayToHexString(resp.data) |
| | | } else { |
| | | log.error("dxFingerZaz.upChar:", resp) |
| | | return false |
| | | } |
| | | } else { |
| | | log.error("dxFingerZaz.upChar:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * ä»HOSTä¸è½½ Templateå°æ¨¡åæå®ç¼å·ç Ram Buffer |
| | | * @param {number} bufferNum - æçº¹æ¨¡æ¿ç¼å·ï¼0-2ï¼ |
| | | * @param {string} template - æçº¹æ¨¡æ¿æ°æ® |
| | | * @returns {string} è¿å设å¤ä¿¡æ¯ï¼è¿åfalse表示è·å失败 |
| | | */ |
| | | dxFingerZaz.downChar = function (bufferNum, template) { |
| | | if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){ |
| | | throw new Error("dxFingerZaz.downChar: 'bufferNum' parameter should be between 0 and 3") |
| | | } |
| | | if(template === undefined || template === null){ |
| | | throw new Error("dxFingerZaz.downChar: 'template' parameter should not be null or empty") |
| | | } |
| | | let data = toEndianHexExtended(bufferNum, 2) + template |
| | | log.info("template.length:", toEndianHexExtended(data.length / 2, 2)) |
| | | send({prefix: 0x55AA, cmd: 0x4300, data: toEndianHexExtended(data.length / 2, 2)}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x4300}) |
| | | if(resp && resp.ret == 0x00){ |
| | | send({prefix: 0x5AA5, cmd: 0x4300, data: data}) |
| | | resp = receive({prefix: 0xA55A, cmd: 0x4300}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return true |
| | | } else { |
| | | log.error("dxFingerZaz.downChar:", resp) |
| | | return false |
| | | } |
| | | } else { |
| | | log.error("dxFingerZaz.downChar:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åæçº¹æ¨¡å设å¤ä¿¡æ¯ |
| | | * @returns {string} è¿å设å¤ä¿¡æ¯ï¼è¿åfalse表示è·å失败 |
| | | */ |
| | | dxFingerZaz.getEnrolledIdList = function () { |
| | | send({prefix: 0x55AA, cmd: 0x4900, data: ""}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x4900}) |
| | | if(resp && resp.ret == 0x00){ |
| | | resp = receive({prefix: 0xA55A, cmd: 0x4900, len: fromEndianHexExtended(resp.data, 2)}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return resp.data |
| | | } else { |
| | | log.error("dxFingerZaz.getDeviceInfo:", resp) |
| | | return false |
| | | } |
| | | } else { |
| | | log.error("dxFingerZaz.getDeviceInfo:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æç´¢æçº¹æ¨¡æ¿ |
| | | * @param {number} bufferNum - æçº¹æ¨¡æ¿ç¼å·ï¼0-2ï¼ |
| | | * @param {number} startId - æç´¢èµ·å§ç¼å· |
| | | * @param {number} endId - æç´¢ç»æç¼å· |
| | | * @returns {number} è¿åæç´¢å°çæçº¹ç¼å·ï¼è¿åfalse表示æç´¢å¤±è´¥ |
| | | */ |
| | | dxFingerZaz.search = function (bufferNum, startId, endId) { |
| | | if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){ |
| | | throw new Error("dxFingerZaz.search: 'bufferNum' parameter should be between 0 and 3") |
| | | } |
| | | if(startId === undefined || startId === null || startId < 1 || startId > options.total){ |
| | | throw new Error("dxFingerZaz.search: 'startId' parameter should be between 1 and " + options.total) |
| | | } |
| | | if(endId === undefined || endId === null || endId < 1 || endId > options.total){ |
| | | throw new Error("dxFingerZaz.search: 'endId' parameter should be between 1 and " + options.total) |
| | | } |
| | | |
| | | let data = toEndianHexExtended(bufferNum, 2) + toEndianHexExtended(startId, 2) + toEndianHexExtended(endId, 2) |
| | | send({prefix: 0x55AA, cmd: 0x6300, data: data}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x6300}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return fromEndianHexExtended(resp.data.slice(0, 2), 2) |
| | | } else { |
| | | log.error("dxFingerZaz.search:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åæçº¹æ¨¡ååæ° |
| | | * @param {number} paramType - åæ°ç±»åï¼0-4ï¼[0: 设å¤Id, 1: å®å
¨ç级, 2: é夿£æ¥, 3: æ³¢ç¹ç, 4: èªå¨å¦ä¹ ] |
| | | * @returns {number} è¿ååæ°å¼ï¼è¿åfalse表示è·å失败 |
| | | * |
| | | * 设å¤Idï¼[1-255] |
| | | * å®å
¨ç级ï¼[1-5] |
| | | * é夿 ¡éªï¼[0/1] |
| | | * æ³¢ç¹çï¼[1:9600, 2:19200, 3:38400, 4:57600, 5:115200, 6:230400, 7:460800, 8:921600] |
| | | * èªå¨å¦ä¹ ï¼[0/1] |
| | | */ |
| | | dxFingerZaz.getParam = function (paramType) { |
| | | if(paramType === undefined || paramType === null || paramType < 0 || paramType > 4){ |
| | | throw new Error("dxFingerZaz.getParam: 'paramType' parameter should be between 0 and 4") |
| | | } |
| | | |
| | | let data = toEndianHexExtended(paramType, 2) |
| | | send({prefix: 0x55AA, cmd: 0x0300, data: data}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x0300}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return fromEndianHexExtended(resp.data, 4) |
| | | } else { |
| | | log.error("dxFingerZaz.getParam:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 设置æçº¹æ¨¡ååæ° |
| | | * @param {number} paramType - åæ°ç±»åï¼0-4ï¼[0: 设å¤Id, 1: å®å
¨ç级, 2: é夿£æ¥, 3: æ³¢ç¹ç, 4: èªå¨å¦ä¹ ] |
| | | * @param {number} paramValue - åæ°å¼ |
| | | * @returns {boolean} è¿åtrue表示设置æåï¼è¿åfalse表示设置失败 |
| | | * |
| | | * 设å¤Idï¼[1-255] |
| | | * å®å
¨ç级ï¼[1-5] |
| | | * é夿 ¡éªï¼[0/1] |
| | | * æ³¢ç¹çï¼[1:9600, 2:19200, 3:38400, 4:57600, 5:115200, 6:230400, 7:460800, 8:921600] |
| | | * èªå¨å¦ä¹ ï¼[0/1] |
| | | */ |
| | | dxFingerZaz.setParam = function (paramType, paramValue) { |
| | | if(paramType === undefined || paramType === null || paramType < 0 || paramType > 4){ |
| | | throw new Error("dxFingerZaz.setParam: 'paramType' parameter should be between 0 and 4") |
| | | } |
| | | if(paramValue === undefined || paramValue === null || paramValue < 0 || paramValue > 255){ |
| | | throw new Error("dxFingerZaz.setParam: 'paramValue' parameter should be between 0 and 255") |
| | | } |
| | | |
| | | let data = toEndianHexExtended(paramType, 1) + toEndianHexExtended(paramValue, 4) |
| | | send({prefix: 0x55AA, cmd: 0x0200, data: data}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x0200}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return true |
| | | } else { |
| | | log.error("dxFingerZaz.setParam:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åæçº¹æ¨¡å设å¤ä¿¡æ¯ |
| | | * @returns {string} è¿å设å¤ä¿¡æ¯ï¼è¿åfalse表示è·å失败 |
| | | */ |
| | | dxFingerZaz.getDeviceInfo = function () { |
| | | send({prefix: 0x55AA, cmd: 0x0400, data: ""}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x0400}) |
| | | if(resp && resp.ret == 0x00){ |
| | | resp = receive({prefix: 0xA55A, cmd: 0x0400, len: fromEndianHexExtended(resp.data, 2)}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return dxCommon.utf8HexToStr(dxCommon.uint8ArrayToHexString(resp.data.slice(0, resp.length - 3))) |
| | | } else { |
| | | log.error("dxFingerZaz.getDeviceInfo:", resp) |
| | | return false |
| | | } |
| | | } else { |
| | | log.error("dxFingerZaz.getDeviceInfo:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æçº¹æ£æµ |
| | | * @returns {number} è¿å1:ææçº¹è¾å
¥ï¼0:æ æçº¹è¾å
¥ï¼è¿åfalseè¡¨ç¤ºæ£æµå¤±è´¥ |
| | | */ |
| | | dxFingerZaz.fingerDetect = function () { |
| | | send({prefix: 0x55AA, cmd: 0x2100, data: ""}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x2100}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return fromEndianHexExtended(resp.data, 1) |
| | | } else { |
| | | log.error("dxFingerZaz.fingerDetect:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * å é¤æçº¹æ¨¡æ¿ |
| | | * @param {number} startId - å é¤èµ·å§ç¼å· |
| | | * @param {number} endId - å é¤ç»æç¼å· |
| | | * @returns {boolean} è¿åtrue表示å 餿åï¼è¿åfalse表示å é¤å¤±è´¥ |
| | | */ |
| | | dxFingerZaz.delChar = function (startId, endId) { |
| | | if(startId === undefined || startId === null || startId < 1 || startId > options.total){ |
| | | throw new Error("dxFingerZaz.delChar: 'startId' parameter should be between 1 and " + options.total) |
| | | } |
| | | if(endId === undefined || endId === null || endId < 1 || endId > options.total){ |
| | | throw new Error("dxFingerZaz.delChar: 'endId' parameter should be between 1 and " + options.total) |
| | | } |
| | | |
| | | let data = toEndianHexExtended(startId, 2) + toEndianHexExtended(endId, 2) |
| | | send({prefix: 0x55AA, cmd: 0x4400, data: data}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x4400}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return true |
| | | } else { |
| | | log.error("dxFingerZaz.delChar:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åæå®ç¼å·èå´å
已注åçæçº¹æ»æ° |
| | | * @param {number} startId - èµ·å§ç¼å· |
| | | * @param {number} endId - ç»æç¼å· |
| | | * @returns {number} è¿åæå®ç¼å·èå´å
已注åçæçº¹æ»æ°ï¼è¿åfalse表示è·å失败 |
| | | */ |
| | | dxFingerZaz.getEnrollCount = function (startId, endId) { |
| | | if(startId === undefined || startId === null || startId < 1 || startId > options.total){ |
| | | throw new Error("dxFingerZaz.getEnrollCount: 'startId' parameter should be between 1 and " + options.total) |
| | | } |
| | | if(endId === undefined || endId === null || endId < 1 || endId > options.total){ |
| | | throw new Error("dxFingerZaz.getEnrollCount: 'endId' parameter should be between 1 and " + options.total) |
| | | } |
| | | |
| | | let data = toEndianHexExtended(startId, 2) + toEndianHexExtended(endId, 2) |
| | | send({prefix: 0x55AA, cmd: 0x4800, data: data}) |
| | | let resp = receive({prefix: 0xAA55, cmd: 0x4800}) |
| | | if(resp && resp.ret == 0x00){ |
| | | return fromEndianHexExtended(resp.data, 2) |
| | | } else { |
| | | log.error("dxFingerZaz.getEnrollCount:", resp) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * åå§åæçº¹æ¨¡å |
| | | * @param {Object} params |
| | | * @param {string} params.type - 串å£ç±»åï¼é»è®¤ 3ï¼ |
| | | * @param {string} params.path - 串å£è·¯å¾ï¼é»è®¤ '/dev/ttySLB1'ï¼ |
| | | * @param {number} params.baudrate - æ³¢ç¹çï¼é»è®¤ '115200-8-N-1'ï¼ |
| | | * @param {number} params.id - idï¼é»è®¤ 'fingerUart'ï¼ |
| | | * @param {number} params.total - æçº¹æ»æ°ï¼é»è®¤ 5000ï¼ |
| | | * @param {number} params.timeout - è¶
æ¶æ¶é´ï¼é»è®¤ 500ï¼ |
| | | */ |
| | | dxFingerZaz.init = function (params) { |
| | | options.id = params.id ? params.id : options.id |
| | | options.timeout = params.timeout ? params.timeout : options.timeout |
| | | options.total = params.total ? params.total : options.total |
| | | options.type = params.type ? params.type : options.type |
| | | options.path = params.path ? params.path : options.path |
| | | options.baudrate = params.baudrate ? params.baudrate : options.baudrate |
| | | |
| | | dxUart.open(options.type, options.path, options.id) |
| | | dxUart.ioctl(6, options.baudrate, options.id) |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * å°æ°å转æ¢ä¸ºæå®åèæ°çåå
è¿å¶å符串 |
| | | * @param {number} number - è¦è½¬æ¢çæ°å |
| | | * @param {number} bytes - åèæ°ï¼é»è®¤2åèï¼ |
| | | * @param {boolean} isLittleEndian - æ¯å¦å°ç«¯åºï¼é»è®¤trueï¼ |
| | | * @returns {string} 转æ¢åçåå
è¿å¶å符串 |
| | | */ |
| | | function toEndianHexExtended(number, bytes, isLittleEndian = true) { |
| | | // è®¡ç®æéçåå
è¿å¶ä½æ°ï¼æ¯ä¸ªåèå 2ä½ï¼ |
| | | const hexLength = bytes * 2; |
| | | let hexStr = number.toString(16).padStart(hexLength, '0'); |
| | | |
| | | // åå²ä¸ºåèæ°ç» |
| | | const bytesArray = []; |
| | | for (let i = 0; i < hexLength; i += 2) { |
| | | bytesArray.push(hexStr.substr(i, 2)); |
| | | } |
| | | |
| | | // æ ¹æ®åèåºå转æ°ç» |
| | | if (isLittleEndian) bytesArray.reverse(); |
| | | |
| | | return bytesArray.join(''); |
| | | } |
| | | |
| | | /** |
| | | * å°åèæ°ç»è½¬æ¢ä¸ºæ°åï¼æ¯æå¤§å°ç«¯åºï¼ |
| | | * @param {Uint8Array|number[]} bytesArray - åèæ°ç»ï¼å¦ Uint8Array ææ®éæ°ç»ï¼ |
| | | * @param {number} bytes - åèæ°ï¼å¿
é¡»ä¸å®é
æ°æ®é¿åº¦ä¸è´ï¼ |
| | | * @param {boolean} isLittleEndian - æ¯å¦å°ç«¯åºï¼é»è®¤trueï¼ |
| | | * @returns {number} 转æ¢åçæ°å |
| | | */ |
| | | function fromEndianHexExtended(bytesArray, bytes, isLittleEndian = true) { |
| | | // åæ°æ ¡éª |
| | | if (!bytesArray || bytesArray.length !== bytes) { |
| | | throw new Error(`Invalid bytes array. Expected length: ${bytes}`); |
| | | } |
| | | |
| | | // å¤çå°ç«¯åºï¼å转åèé¡ºåº |
| | | const adjustedBytes = isLittleEndian |
| | | ? Array.from(bytesArray).reverse() |
| | | : Array.from(bytesArray); |
| | | |
| | | // 转æ¢ä¸ºåå
è¿å¶å符串 |
| | | const hexStr = adjustedBytes |
| | | .map(byte => byte.toString(16).padStart(2, "0")) |
| | | .join(""); |
| | | |
| | | // 转æ¢ä¸ºæ°åï¼æ¯æå¤§æ´æ°ï¼ |
| | | return parseInt(hexStr, 16); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * åéæ°æ® |
| | | * @param {Object} params |
| | | * @param {number} params.prefix |
| | | * @param {number} params.cmd |
| | | * @param {string} params.data |
| | | */ |
| | | function send(params) { |
| | | if (!params || typeof params !== 'object') { |
| | | throw new Error("Parameters should be an object containing prefix, cmd and data"); |
| | | } |
| | | |
| | | const { prefix, cmd, data } = params; |
| | | const sid = 0x00; // é»è®¤æºå°å 0x00 |
| | | const did = 0x00; // é»è®¤ç®æ å°å 0x00 |
| | | |
| | | const hexParts = data.match(/[\da-f]{2}/gi) || []; |
| | | |
| | | const bytes = new Uint8Array(hexParts.map(h => parseInt(h, 16))); |
| | | |
| | | let dataBytes |
| | | if (prefix === 0x55AA) { |
| | | dataBytes = new Uint8Array(16); |
| | | dataBytes.set(bytes.subarray(0, 16), 0); |
| | | |
| | | } else if (prefix === 0x5AA5) { |
| | | dataBytes = new Uint8Array(500); |
| | | dataBytes.set(bytes.subarray(0, 500), 0); |
| | | } |
| | | |
| | | // æé åºç¡æ°æ®å
|
| | | const packet = new Uint8Array(8 + dataBytes.length + 2); // å
头(8) + æ°æ® + æ ¡éª(2) |
| | | const view = new DataView(packet.buffer); |
| | | |
| | | // å¡«å
å
头 |
| | | view.setUint16(0, prefix, false); // å¤§ç«¯åº PREFIX (2 bytes) |
| | | packet[2] = sid; // SID (1 byte) |
| | | packet[3] = did; // DID (1 byte) |
| | | view.setUint16(4, cmd, false); // å¤§ç«¯åº CMD (2 bytes) |
| | | view.setUint16(6, hexParts.length, true); // å¤§ç«¯åº LEN (2 bytes) |
| | | |
| | | // å¡«å
æ°æ® |
| | | packet.set(dataBytes, 8); |
| | | |
| | | // è®¡ç®æ ¡éªå |
| | | let checksum = 0; |
| | | for (let i = 0; i < 8 + dataBytes.length; i++) { |
| | | checksum += packet[i]; |
| | | } |
| | | checksum &= 0xFFFF; // åä½ 16 ä½ |
| | | |
| | | // å¡«å
æ ¡éªåï¼å¤§ç«¯åºï¼ |
| | | packet[8 + dataBytes.length] = checksum & 0xFF; |
| | | packet[8 + dataBytes.length + 1] = (checksum >> 8) & 0xFF; |
| | | |
| | | // // TODO ä¸´æ¶æ¥å¿æå° start |
| | | // let str = '' |
| | | // for (let i = 0; i < packet.length; i++) { |
| | | // str += packet[i].toString(16).padStart(2, '0') + ' ' |
| | | // } |
| | | // log.info("send:", str) |
| | | // // TODO ä¸´æ¶æ¥å¿æå° end |
| | | |
| | | // åéæ°æ® |
| | | let ret = dxUart.send(packet.buffer, options.id); |
| | | if(!ret){ |
| | | throw new Error("fingerZazUart.send fail") |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * æ¥æ¶æ°æ® |
| | | * @param {Object} params |
| | | * @param {number} params.prefix |
| | | * @param {number} params.cmd |
| | | * @param {number} params.len |
| | | * @returns {Object} è¿åæ°æ® |
| | | */ |
| | | function receive(params) { |
| | | // éè¯5次, é¿å
读åå¤ªå¿«æ¨¡ç»æªååº |
| | | for(let i = 0; i < 5; i++){ |
| | | const prefix1 = dxUart.receive(1, options.timeout, options.id); |
| | | if (!prefix1 || (prefix1[0] !== 0xAA && prefix1[0] !== 0xA5)) { |
| | | std.sleep(50) |
| | | continue |
| | | } |
| | | |
| | | const prefix2 = dxUart.receive(1, options.timeout, options.id); |
| | | if (!prefix2 || (prefix2[0] !== 0x55 && prefix2[0] !== 0x5A)) { |
| | | std.sleep(50) |
| | | continue |
| | | } |
| | | |
| | | // å®ä¹éç¨å段 |
| | | let prefix, sid, did, cmd, len, ret, data, checksum; |
| | | |
| | | prefix = (prefix1[0] << 8) | prefix2[0]; |
| | | |
| | | const value1 = dxUart.receive(6, options.timeout, options.id); |
| | | sid = value1[0]; |
| | | did = value1[1]; |
| | | cmd = (value1[2] << 8) | value1[3]; |
| | | len = (value1[5] << 8) | value1[4]; |
| | | |
| | | let value2 = dxUart.receive(len, options.timeout, options.id) |
| | | if(value2 && value2.length === len){ |
| | | ret = value2[1] << 8 | value2[0]; |
| | | data = value2.subarray(2, len) |
| | | } else { |
| | | throw new Error("fingerZazUart.receive fail: data length mismatch") |
| | | } |
| | | |
| | | |
| | | let value3 |
| | | if(prefix1[0] === 0xAA && prefix2[0] === 0x55){ |
| | | // æ ¡éªå卿å |
| | | value3 = dxUart.receive((26 - 2 - 8 - len + 2), options.timeout, options.id) |
| | | checksum = value3[value3.length - 2] | (value3[value3.length - 1] << 8); |
| | | } else { |
| | | // æ ¡éªåå¨åé¢ |
| | | value3 = dxUart.receive(2, options.timeout, options.id) |
| | | checksum = value3[0] | (value3[1] << 8); |
| | | } |
| | | |
| | | |
| | | // è®¡ç®æ ¡éªåï¼ä»prefixå°dataï¼ |
| | | let sum = prefix1[0]; |
| | | sum += prefix2[0]; |
| | | for (let i=0; i < value1.length; i++) sum += value1[i]; |
| | | for (let i=0; i < value2.length; i++) sum += value2[i]; |
| | | if ((sum & 0xFFFF) !== checksum) throw "Response Packet Checksum mismatch"; |
| | | |
| | | // // TODO ä¸´æ¶æ¥å¿æå° start |
| | | // let str = prefix1[0].toString(16).padStart(2, '0') + ' ' + prefix2[0].toString(16).padStart(2, '0') + ' ' |
| | | // for (let i = 0; i < value1.length; i++) str += value1[i].toString(16).padStart(2, '0') + ' ' |
| | | // for (let i = 0; i < value2.length; i++) str += value2[i].toString(16).padStart(2, '0') + ' ' |
| | | // for (let i = 0; i < value3.length; i++) str += value3[i].toString(16).padStart(2, '0') + ' ' |
| | | // log.info("receive:", str) |
| | | // // TODO ä¸´æ¶æ¥å¿æå° end |
| | | |
| | | if (params.prefix == prefix && params.cmd == cmd) { |
| | | return { |
| | | prefix: prefix, |
| | | sid, |
| | | did, |
| | | command: cmd, |
| | | length: len, |
| | | ret: ret, |
| | | data: Array.from(data), |
| | | cks: true |
| | | }; |
| | | } else { |
| | | throw new Error("fingerZazUart.receive fail:") |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | export default dxFingerZaz; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // build : 20240524 |
| | | // gpio è¾åº,åªè½è¾åº2ç§ç¶æï¼é«çµå¹³/ä½çµå¹³ï¼å¦ææ¥å
¥ç»§çµå¨ï¼åé«çµå¹³æ¯å¼ï¼ä½çµå¹³æ¯å
³ |
| | | import { gpioClass } from './libvbar-b-dxgpio.so' |
| | | const gpioObj = new gpioClass(); |
| | | const gpio = {} |
| | | |
| | | /** |
| | | * åå§å,åªéè¦æ§è¡ä¸æ¬¡å³å¯ |
| | | * @returns true/false |
| | | */ |
| | | gpio.init = function () { |
| | | return gpioObj.init(); |
| | | } |
| | | |
| | | /** |
| | | * éæ¾gpioèµæº |
| | | * @returns true/false |
| | | */ |
| | | gpio.deinit = function () { |
| | | return gpioObj.exit(); |
| | | } |
| | | |
| | | /** |
| | | * ç³è¯·gpio,æ¯ä¸ªgpioåªéè¦ç³è¯·ä¸æ¬¡ |
| | | * @param {number} gpioçæ è¯ï¼ä¸åç设å¤ä¸åçæ è¯ï¼å¿
å¡« |
| | | * @returns true/false |
| | | */ |
| | | gpio.request = function (gpio_) { |
| | | let res = gpioObj.request(gpio_) |
| | | if (!res) { |
| | | return res |
| | | } |
| | | gpioObj.setFunc(gpio_, 0x04); |
| | | return true |
| | | } |
| | | |
| | | /** |
| | | * éæ¾æå®gpio |
| | | * @param {number} gpioçæ è¯ï¼ä¸åç设å¤ä¸åçæ è¯ï¼å¿
å¡« |
| | | * @returns true/false |
| | | */ |
| | | gpio.free = function (gpio_) { |
| | | return gpioObj.free(gpio_); |
| | | } |
| | | |
| | | /** |
| | | * æå®gpioè¾åºé«/ä½çµå¹³ |
| | | * @param {number} gpioçæ è¯ï¼ä¸åç设å¤ä¸åçæ è¯ï¼å¿
å¡« |
| | | * @param {number} value åªè½æ¯1å0ï¼1表示é«çµå¹³ï¼0表示ä½çµå¹³ï¼ç¼ºçæ¯é«çµå¹³ï¼å¿
å¡« |
| | | * @returns true/false |
| | | */ |
| | | gpio.setValue = function (gpio_, value) { |
| | | return gpioObj.setValue(gpio_, value); |
| | | } |
| | | |
| | | /** |
| | | * è·åæå®gpioå½åçè¾åº ï¼é«/ä½çµå¹³ |
| | | * @param {number} gpioçæ è¯ï¼ä¸åç设å¤ä¸åçæ è¯ï¼å¿
å¡« |
| | | * @returns 1å0ï¼1表示é«çµå¹³ï¼0表示ä½çµå¹³ |
| | | */ |
| | | gpio.getValue = function (gpio_) { |
| | | return gpioObj.getValue(gpio_); |
| | | } |
| | | |
| | | /** |
| | | * ç³è¯·gpio,æ¯ä¸ªgpioåªéè¦ç³è¯·ä¸æ¬¡ |
| | | * @param {number} gpioçæ è¯ï¼ä¸åç设å¤ä¸åçæ è¯ï¼å¿
å¡« |
| | | * @returns true/false |
| | | */ |
| | | gpio.requestGpio = function (gpio_) { |
| | | let res = gpioObj.request(gpio_) |
| | | return res |
| | | } |
| | | |
| | | /** |
| | | * 设置gpioåè½ |
| | | * @param {number} gpioçæ è¯ï¼ä¸åç设å¤ä¸åçæ è¯ï¼å¿
å¡« |
| | | * @param {number} gpioåè½å±æ§ï¼ä¸åç设å¤ä¸åçåè½å±æ§ï¼å¿
å¡« |
| | | * @returns true/false |
| | | */ |
| | | gpio.setFuncGpio = function (gpio_, func) { |
| | | let res = gpioObj.setFunc(gpio_, func) |
| | | return res |
| | | } |
| | | |
| | | /** |
| | | * 设置æå®gpioä¸æç¶æ |
| | | * @param {number} gpioçæ è¯ï¼ä¸åç设å¤ä¸åçæ è¯ï¼å¿
å¡« |
| | | * @param {number} state ä¸æç¶æï¼å¿
å¡« |
| | | * @returns true/false |
| | | */ |
| | | gpio.setPullState = function (gpio_, state) { |
| | | return gpioObj.setPullState(gpio_, state); |
| | | } |
| | | |
| | | /** |
| | | * è·åæå®gpioä¸æç¶æ |
| | | * @param {number} gpioçæ è¯ï¼ä¸åç设å¤ä¸åçæ è¯ï¼å¿
å¡« |
| | | * @returns ä¸æç¶æ(int) |
| | | */ |
| | | gpio.getPullState = function (gpio_) { |
| | | return gpioObj.getPullState(gpio_); |
| | | } |
| | | /** |
| | | * 设置æå®gpioç驱å¨è½å |
| | | * @param {number} gpioçæ è¯ï¼ä¸åç设å¤ä¸åçæ è¯ï¼å¿
å¡« |
| | | * @param {number} strength è½åï¼å¿
å¡« |
| | | * @returns true/false |
| | | */ |
| | | gpio.setDriveStrength = function (gpio_, strength) { |
| | | return gpioObj.setDriveStrength(gpio_, strength); |
| | | } |
| | | |
| | | /** |
| | | * è·åæå®gpioç驱å¨è½å |
| | | * @param {number} gpioçæ è¯ï¼ä¸åç设å¤ä¸åçæ è¯ï¼å¿
å¡« |
| | | * @returns è½å(int) |
| | | */ |
| | | gpio.getDriveStrength = function (gpio_) { |
| | | return gpioObj.getDriveStrength(gpio_); |
| | | } |
| | | |
| | | export default gpio; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * GPIO Key Module based on native gpio_key C library. |
| | | * This module provides a singleton interface to GPIO key management. |
| | | * Can be used across threads, but callback registration and loop functions need to be called in the same thread. |
| | | * Features: |
| | | * - Initialize/deinitialize GPIO key monitoring |
| | | * - Query gpiokey status by code |
| | | * - Register gpiokey event callbacks for gpiokey events |
| | | * - Process gpiokey events through event loop |
| | | * |
| | | * Usage: |
| | | * - Call `init()` once to initialize. |
| | | * - Use `getStatus(code)` to query gpiokey status. |
| | | * - Use `setCallbacks()` to register gpiokey event handlers. |
| | | * - Call `loop()` periodically to process events (e.g. in setInterval). |
| | | * |
| | | * Doc/Demo: https://github.com/DejaOS/DejaOS |
| | | */ |
| | | import { gpioKeyClass } from './libvbar-m-dxkey.so' |
| | | |
| | | |
| | | const dxGpioKey = {}; |
| | | |
| | | const gpiokey = new gpioKeyClass(); |
| | | let _callbacks = {}; |
| | | |
| | | /** |
| | | * GPIO key/input event type constant (corresponding to Linux input_ event. type) |
| | | * Used to distinguish the categories of events, such as buttons, coordinates, synchronization, etc. |
| | | * |
| | | * Reference:<Linux/input-event-codes. h> |
| | | */ |
| | | dxGpioKey.GPIO_KEY_TYPE = { |
| | | SYN: 0x00, // Synchronization event (end of event grouping flag) |
| | | KEY: 0x01, // Key event (keyboard, GPIO key, gamepad button) |
| | | REL: 0x02, // Relative position event (mouse, scroll wheel) |
| | | ABS: 0x03, // Absolute position event (touchscreen, joystick) |
| | | MSC: 0x04, // Miscellaneous event (scan code, raw code, etc.) |
| | | SW: 0x05, // Switch event (lid switch, plug/unplug, seat sensor, etc.) |
| | | LED: 0x11, // LED status (e.g. keyboard caps lock indicator) |
| | | SND: 0x12 // Sound event (beeper, etc.) |
| | | }; |
| | | |
| | | /** |
| | | * Initializes the GPIO key monitoring system. |
| | | * @returns {boolean} True if successful, false otherwise. |
| | | * @example |
| | | * const success = dxGpioKey.init(); |
| | | * if (success) { |
| | | * logger.info('GPIO key initialized successfully'); |
| | | * } |
| | | */ |
| | | dxGpioKey.init = function () { |
| | | return gpiokey.init(); |
| | | } |
| | | |
| | | /** |
| | | * Deinitializes the GPIO key monitoring system and releases resources. |
| | | * @returns {boolean} True if successful, false otherwise. |
| | | */ |
| | | dxGpioKey.deinit = function () { |
| | | return gpiokey.deinit(); |
| | | } |
| | | |
| | | /** |
| | | * Gets the current status of a specific GPIO key. |
| | | * @param {number} code - GPIO key code to query. |
| | | * @returns {KeyEvent} Key status object containing code, type, and value. |
| | | * @typedef {object} KeyEvent |
| | | * @property {number} code - GPIO key code. |
| | | * @property {number} srcCode - GPIO key source code. |
| | | * @property {number} type - Event type (in dxGpioKey.GPIO_KEY_TYPE, e.g. dxGpioKey.GPIO_KEY_TYPE.KEY for key press). |
| | | * @property {number} value - Event value (e.g., 1 for pressed, 0 for released). |
| | | * @example |
| | | * const status = dxGpioKey.getStatus(3) // code in 0-x, is the number of gpiokey hardware interfaces on the device; |
| | | * logger.info(JSON.stringify(status)) |
| | | * // Output: { code: 3, srcCode: 33, type: 1, value: 1 } |
| | | */ |
| | | dxGpioKey.getStatus = function (code) { |
| | | return gpiokey.getStatus(code); |
| | | } |
| | | |
| | | /** |
| | | * Sets callback handlers for GPIO key events. |
| | | * @param {object} callbacks - Callback functions. |
| | | * @param {function(KeyEvent)} [callbacks.onKeyEvent] - Called when a key event occurs. |
| | | * @example |
| | | * dxGpioKey.setCallbacks({ |
| | | * onKeyEvent: function(event) { |
| | | * logger.info('Key event:', JSON.stringify(event)); |
| | | * // Output: Key event: {"code":3,"srcCode":33,"type":1,"value":1} |
| | | * } |
| | | * }); |
| | | * @returns {void} |
| | | */ |
| | | dxGpioKey.setCallbacks = function (callbacks) { |
| | | _callbacks = callbacks; |
| | | } |
| | | |
| | | /** |
| | | * Processes events from the GPIO key event queue. Should be called periodically (e.g. in setInterval). |
| | | * Handles key press/release events and triggers registered callbacks. |
| | | * @example |
| | | * setInterval(() => { |
| | | * try { |
| | | * dxGpioKey.loop(); |
| | | * } catch (e) { |
| | | * logger.error('Error in GPIO key loop:', e); |
| | | * } |
| | | * }, 50); // Process events every 50ms |
| | | * @returns {void} |
| | | */ |
| | | dxGpioKey.loop = function () { |
| | | let ev = gpiokey.getEvent(); |
| | | if (ev && _callbacks.onKeyEvent) { |
| | | _callbacks.onKeyEvent(ev); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Gets the native GPIO key object. |
| | | * @returns {Object|null} The native GPIO key object, or null if not initialized. |
| | | */ |
| | | dxGpioKey.getNative = function () { |
| | | return gpiokey; |
| | | } |
| | | |
| | | export default dxGpioKey; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // http客æ·ç«¯ç»ä»¶ |
| | | import { httpClass } from './libvbar-m-dxhttp.so' |
| | | |
| | | const httpObj = new httpClass(); |
| | | |
| | | const http = { |
| | | |
| | | HTTP_METHOD : { |
| | | GET: "GET", |
| | | POST: "POST", |
| | | PUT: "PUT", |
| | | DELETE: "DELETE", |
| | | HEAD: "HEAD", |
| | | OPTIONS: "OPTIONS", |
| | | PATCH: "PATCH" |
| | | }, |
| | | HTTP_FORMAT : { |
| | | JSON: "JSON", |
| | | FORM: "FORM", |
| | | URLENCODE: "URLENCODE" |
| | | }, |
| | | HTTP_FORM_TYPE : { |
| | | STRING: "STRING", |
| | | FILE: "FILE" |
| | | }, |
| | | /** |
| | | * getè¯·æ± |
| | | * @param {string} url |
| | | * @param {array} headers éå¿
å¡«ï¼ä¼æé»è®¤å¡«å
request headers |
| | | * @param {number} timeout éå¿
å¡«ï¼ è¶
æ¶æ¶é´ |
| | | * @returns |
| | | */ |
| | | get: function (url, headers, timeout) { |
| | | if (!url) { |
| | | throw new Error("url should not be null or empty") |
| | | } |
| | | return httpObj.request({ method: 0, url: url, headers: headers, timeout: timeout}) |
| | | }, |
| | | /** |
| | | * post请æ±,data为json/formè¡¨åæ°ç»æ ¼å¼ |
| | | * @param {string} url |
| | | * @param {array} data |
| | | * @param {array} headers éå¿
å¡«ï¼ä¼æé»è®¤å¡«å
request headers |
| | | * @param {number} timeout éå¿
å¡«ï¼ è¶
æ¶æ¶é´ |
| | | * @returns |
| | | */ |
| | | post: function (url, data, headers, timeout, format = "JSON") { |
| | | if (!url) { |
| | | throw new Error("url should not be null or empty") |
| | | } |
| | | if (!data) { |
| | | throw new Error("data should not be null or empty") |
| | | } |
| | | if (typeof data != 'string' && format != "FORM") { |
| | | data = JSON.stringify(data) |
| | | } |
| | | if(format == "JSON"){ |
| | | return httpObj.request({ method: 1, url: url, data: data, headers: headers, timeout: timeout}) |
| | | }else{ |
| | | return httpObj.request({ method: 1, url: url, formData: data, headers: headers, timeout: timeout}) |
| | | } |
| | | }, |
| | | /** |
| | | * put请æ±,data为json/formè¡¨åæ°ç»æ ¼å¼ |
| | | * @param {string} url |
| | | * @param {array} data |
| | | * @param {array} headers éå¿
å¡«ï¼ä¼æé»è®¤å¡«å
request headers |
| | | * @param {number} timeout éå¿
å¡«ï¼ è¶
æ¶æ¶é´ |
| | | * @returns |
| | | */ |
| | | put: function (url, data, headers, timeout, format = "JSON") { |
| | | if (!url) { |
| | | throw new Error("url should not be null or empty") |
| | | } |
| | | if (!data) { |
| | | throw new Error("data should not be null or empty") |
| | | } |
| | | if (typeof data != 'string' && format != "FORM") { |
| | | data = JSON.stringify(data) |
| | | } |
| | | if(format == "JSON"){ |
| | | return httpObj.request({ method: 2, url: url, data: data, headers: headers, timeout: timeout}) |
| | | }else{ |
| | | return httpObj.request({ method: 2, url: url, formData: data, headers: headers, timeout: timeout}) |
| | | } |
| | | }, |
| | | /** |
| | | * deleteè¯·æ± |
| | | * @param {string} url |
| | | * @param {array} headers éå¿
å¡«ï¼ä¼æé»è®¤å¡«å
request headers |
| | | * @param {number} timeout éå¿
å¡«ï¼ è¶
æ¶æ¶é´ |
| | | * @returns |
| | | */ |
| | | delete: function (url, headers, timeout) { |
| | | if (!url) { |
| | | throw new Error("url should not be null or empty") |
| | | } |
| | | return httpObj.request({ method: 3, url: url, headers: headers, timeout: timeout}) |
| | | }, |
| | | /** |
| | | * ä¸è½½æä»¶ï¼æ¬è´¨æ¯getè¯·æ± |
| | | * @param {string} url |
| | | * @param {string} path ç®æ è·¯å¾(ç»å¯¹è·¯å¾) |
| | | * @param {array} headers éå¿
å¡«ï¼ä¼æé»è®¤å¡«å
request headers |
| | | * @param {number} timeout éå¿
å¡«ï¼ è¶
æ¶æ¶é´ |
| | | * @returns ä¸è½½æä»¶æå¯è½è¿ånullï¼ä½æ¯ä¸è½½æ¯æåç |
| | | */ |
| | | download: function (url, path, headers, timeout) { |
| | | if (!url) { |
| | | throw new Error("url should not be null or empty") |
| | | } |
| | | if (!path) { |
| | | throw new Error("path should not be null or empty") |
| | | } |
| | | return httpObj.request({ method: 0, url: url, headers: headers, download: path, timeout: timeout }) |
| | | }, |
| | | |
| | | /** |
| | | * ä¸ä¼ æä»¶ï¼æ¬è´¨æ¯postè¯·æ± |
| | | * @param {string} url |
| | | * @param {string} path æºè·¯å¾(ç»å¯¹è·¯å¾) |
| | | * @returns |
| | | */ |
| | | upload: function (url, path) { |
| | | if (!url) { |
| | | throw new Error("url should not be null or empty") |
| | | } |
| | | if (!path) { |
| | | throw new Error("path should not be null or empty") |
| | | } |
| | | return httpObj.request({ |
| | | method: 1, |
| | | url: url, |
| | | headers: ["application/x-www-form-urlencoded; charset=UTF-8"], |
| | | upload: path |
| | | }) |
| | | }, |
| | | /** |
| | | * åçæ¹å¼ |
| | | * å¿
å¡«åæ°ï¼methodï¼0ï¼get请æ±ï¼1ï¼post请æ±ï¼ãurl |
| | | * å¯éåæ°ï¼headers(å符串æ°ç»ï¼è¦çé»è®¤header)ãdownloadï¼æä»¶ä¸è½½å°åï¼ãdata(è¯·æ±æ¥æï¼post请æ±å¿
å¡«)ãtimeout(è¶
æ¶æ¶é´/ms,缺ç:5000)ãdns(缺ç:"114.114.114.114,8.8.8.8")ãupload |
| | | * é»è®¤headerï¼Accept-Charset:utf-8ãContent-Type:application/json;charset=utf-8ãConnection:close |
| | | * @param {object} param json |
| | | * å¦ï¼let param={ |
| | | method:0, |
| | | url:"http://192.168.10.122:8000/DW200_1_0.zip", |
| | | download:"/testNet/aaa" |
| | | } |
| | | * @returns |
| | | */ |
| | | request: function (param) { |
| | | return httpObj.request(param) |
| | | } |
| | | } |
| | | export default http; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * HTTP Client Module |
| | | * This module provides a stateless, function-based API for making HTTP requests. |
| | | * Each request function (get, post, request, etc.) creates an isolated, |
| | | * short-lived native client instance, ensuring thread-safety and preventing state conflicts. |
| | | * |
| | | * Features: |
| | | * - GET/POST/PUT/PATCH/DELETE requests |
| | | * - File upload/download with progress |
| | | * - HTTPS with certificate verification options (disabled by default) |
| | | * - Fully configurable via an options object per request |
| | | * |
| | | * Usage: |
| | | * - Simple requests: `httpclient.get(url, { timeout: 3000 })` |
| | | * - Complex requests: `httpclient.request({ url, method, headers: { 'Content-Type': 'application/json' }, body, ... })` |
| | | * |
| | | * Doc/Demo : https://github.com/DejaOS/DejaOS |
| | | */ |
| | | import * as native from './libvbar-m-dxhttpclient.so' |
| | | |
| | | const httpclient = {} |
| | | |
| | | /** |
| | | * The core request function. Each call invokes the native stateless request function. |
| | | * @param {object} options - Request options. |
| | | * @param {string} options.url - The request URL. (Required) |
| | | * @param {string} [options.method='GET'] - The request method (GET, POST, etc.). |
| | | * @param {object<string, string>|string[]} [options.headers] - Request headers as a key-value object (recommended) or an array of strings for backward compatibility. |
| | | * @param {string|object} [options.body] - The request body. JS objects will be stringified to JSON. |
| | | * @param {number} [options.timeout=5000] - Timeout in milliseconds. |
| | | * @param {Function} [options.onProgress] - Progress callback function. |
| | | * @param {number} [options.verifyPeer] - Certificate verification (0: disable, 1: enable). Default: 0 (disabled for convenience in IoT). |
| | | * @param {number} [options.verifyHost] - Hostname verification (0: disable, 2: enable). Default: 0 (disabled for convenience in IoT). |
| | | * @param {string} [options.caFile] - Path to CA certificate file. |
| | | * @returns {object} Response result { code, status, message, data }. |
| | | * @throws {Error} Throws error on invalid input. |
| | | */ |
| | | httpclient.request = function (options) { |
| | | if (!options || typeof options !== 'object') { |
| | | throw new Error("Request options object is required"); |
| | | } |
| | | if (!options.url) { |
| | | throw new Error("options.url is required"); |
| | | } |
| | | |
| | | const optsToSet = { ...options }; |
| | | |
| | | // Default method to GET |
| | | if (!optsToSet.method) { |
| | | optsToSet.method = 'GET'; |
| | | } |
| | | |
| | | // Default timeout |
| | | if (optsToSet.timeout === undefined) { |
| | | optsToSet.timeout = 5000; |
| | | } |
| | | |
| | | // Convert headers object to array of strings for C layer BEFORE further processing |
| | | if (optsToSet.headers && typeof optsToSet.headers === 'object' && !Array.isArray(optsToSet.headers)) { |
| | | optsToSet.headers = Object.entries(optsToSet.headers).map(([key, value]) => `${key}: ${value}`); |
| | | } |
| | | if (!optsToSet.headers) { |
| | | optsToSet.headers = []; |
| | | } |
| | | // Auto-stringify JSON body and set Content-Type header |
| | | if (optsToSet.body && typeof optsToSet.body === 'object') { |
| | | optsToSet.body = JSON.stringify(optsToSet.body); |
| | | // Add header only if not already present |
| | | if (!optsToSet.headers.some(h => h.toLowerCase().startsWith('content-type:'))) { |
| | | optsToSet.headers.push('Content-Type: application/json'); |
| | | } |
| | | } |
| | | |
| | | return native.request(optsToSet); |
| | | } |
| | | |
| | | /** |
| | | * Send GET request. |
| | | * @param {string} url - Request URL. |
| | | * @param {number} [timeout=5000] - Timeout in milliseconds. For backward compatibility. |
| | | * @param {object} [options] - Additional request options (headers, etc.). |
| | | * @returns {object} Response result. |
| | | */ |
| | | httpclient.get = function (url, timeout = 5000, options = {}) { |
| | | return httpclient.request({ ...options, url: url, method: 'GET', timeout: timeout }); |
| | | } |
| | | |
| | | /** |
| | | * Send POST request with a body. |
| | | * @param {string} url - Request URL. |
| | | * @param {string|object} data - Request body. JS objects will be stringified as JSON. |
| | | * @param {number} [timeout=5000] - Timeout in milliseconds. For backward compatibility. |
| | | * @param {object} [options] - Additional request options (headers, timeout, etc.). |
| | | * @returns {object} Response result. |
| | | */ |
| | | httpclient.post = function (url, data, timeout = 5000, options = {}) { |
| | | return httpclient.request({ ...options, url: url, method: 'POST', body: data, timeout: timeout }); |
| | | } |
| | | |
| | | /** |
| | | * Send PUT request with a body. |
| | | * @param {string} url - Request URL. |
| | | * @param {string|object} data - Request body. JS objects will be stringified as JSON. |
| | | * @param {number} [timeout=5000] - Timeout in milliseconds. For backward compatibility. |
| | | * @param {object} [options] - Additional request options. |
| | | * @returns {object} Response result. |
| | | */ |
| | | httpclient.put = function (url, data, timeout = 5000, options = {}) { |
| | | return httpclient.request({ ...options, url: url, method: 'PUT', body: data, timeout: timeout }); |
| | | } |
| | | |
| | | /** |
| | | * Send PATCH request with a body. |
| | | * @param {string} url - Request URL. |
| | | * @param {string|object} data - Request body. JS objects will be stringified as JSON. |
| | | * @param {number} [timeout=5000] - Timeout in milliseconds. For backward compatibility. |
| | | * @param {object} [options] - Additional request options. |
| | | * @returns {object} Response result. |
| | | */ |
| | | httpclient.patch = function (url, data, timeout = 5000, options = {}) { |
| | | return httpclient.request({ ...options, url: url, method: 'PATCH', body: data, timeout: timeout }); |
| | | } |
| | | |
| | | /** |
| | | * Send DELETE request. |
| | | * @param {string} url - Request URL. |
| | | * @param {number} [timeout=5000] - Timeout in milliseconds. For backward compatibility. |
| | | * @param {object} [options] - Additional request options. |
| | | * @returns {object} Response result. |
| | | */ |
| | | httpclient.delete = function (url, timeout = 5000, options = {}) { |
| | | return httpclient.request({ ...options, url: url, method: 'DELETE', timeout: timeout }); |
| | | } |
| | | |
| | | /** |
| | | * Download a file. |
| | | * @param {string} url - Request URL. |
| | | * @param {string} localPath - Local path to save the file. |
| | | * @param {number} [timeout=30000] - Timeout in milliseconds. For backward compatibility. |
| | | * @param {object} [options] - Additional request options. |
| | | * @returns {object} Response result (without data field). |
| | | */ |
| | | httpclient.download = function (url, localPath, timeout = 30000, options = {}) { |
| | | if (!url) throw new Error("URL is required"); |
| | | if (!localPath) throw new Error("Local path is required"); |
| | | |
| | | const optsToSet = { |
| | | ...options, |
| | | timeout: timeout, // Longer default timeout for downloads |
| | | url: url, |
| | | method: 'GET' |
| | | }; |
| | | |
| | | // Convert headers object to array of strings for C layer |
| | | if (optsToSet.headers && typeof optsToSet.headers === 'object' && !Array.isArray(optsToSet.headers)) { |
| | | optsToSet.headers = Object.entries(optsToSet.headers).map(([key, value]) => `${key}: ${value}`); |
| | | } |
| | | |
| | | return native.download(localPath, optsToSet); |
| | | } |
| | | |
| | | /** |
| | | * Upload a file. |
| | | * @param {string} url - Request URL. |
| | | * @param {string} localPath - Local path of the file to upload. |
| | | * @param {number} [timeout=30000] - Timeout in milliseconds. For backward compatibility. |
| | | * @param {object} [options] - Additional request options. |
| | | * @returns {object} Response result. |
| | | */ |
| | | httpclient.upload = function (url, localPath, timeout = 30000, options = {}) { |
| | | if (!url) throw new Error("URL is required"); |
| | | if (!localPath) throw new Error("Local path is required"); |
| | | |
| | | const optsToSet = { |
| | | ...options, |
| | | timeout: timeout, // Longer default timeout for uploads |
| | | url: url, |
| | | method: 'POST' |
| | | }; |
| | | |
| | | // Convert headers object to array of strings for C layer |
| | | if (optsToSet.headers && typeof optsToSet.headers === 'object' && !Array.isArray(optsToSet.headers)) { |
| | | optsToSet.headers = Object.entries(optsToSet.headers).map(([key, value]) => `${key}: ${value}`); |
| | | } |
| | | |
| | | return native.upload(localPath, optsToSet); |
| | | } |
| | | |
| | | |
| | | // #region Deprecated Functions |
| | | // The following functions are deprecated and will be removed in a future version. |
| | | // They are kept for backward compatibility to guide users to the new stateless API. |
| | | |
| | | const DEPRECATION_ERROR_MSG = "The stateful API (init, deinit, setOpt, reset) is deprecated. Please use the new stateless, function-based API by passing all options in a single object to methods like request(), get(), post(), etc."; |
| | | |
| | | /** |
| | | * @deprecated Use the new stateless API. |
| | | */ |
| | | httpclient.init = function () { |
| | | // This function is now a no-op, but we don't throw an error |
| | | // to allow old code to run without crashing, though it's discouraged. |
| | | } |
| | | |
| | | /** |
| | | * @deprecated Use the new stateless API. |
| | | */ |
| | | httpclient.deinit = function () { |
| | | // This function is now a no-op. |
| | | } |
| | | |
| | | |
| | | /** |
| | | * @deprecated Use the new stateless API by passing options to request() or other methods. |
| | | */ |
| | | httpclient.setOpt = function () { |
| | | throw new Error(DEPRECATION_ERROR_MSG); |
| | | } |
| | | |
| | | /** |
| | | * @deprecated Use the new stateless API. Each call is already isolated. |
| | | */ |
| | | httpclient.reset = function () { |
| | | throw new Error(DEPRECATION_ERROR_MSG); |
| | | } |
| | | |
| | | // #endregion |
| | | |
| | | export default httpclient; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * HTTP Server Module |
| | | * Features: |
| | | * - Supports GET/POST requests |
| | | * - Supports file upload via raw body ('application/octet-stream') and multipart form data ('multipart/form-data'). |
| | | * - Supports file download |
| | | * - Supports static html file service |
| | | * - Multi-threading not supported, all functions should run in a single thread. For cross-thread communication, use dxEventbus to pass data |
| | | * |
| | | * Usage: |
| | | * - Simple WebServer |
| | | * - Simple Web API Service |
| | | * |
| | | * Doc/Demo : https://github.com/DejaOS/DejaOS |
| | | */ |
| | | import { httpserverClass } from './libvbar-m-dxhttpserver.so' |
| | | |
| | | let server = null; |
| | | const httpserver = {} |
| | | httpserver.init = function () { |
| | | if (!server) { |
| | | server = new httpserverClass(); |
| | | } |
| | | } |
| | | /** |
| | | * Route the HTTP request. A maximum of 100 routes can be registered. |
| | | * @param {string} path - The path to route the request. Should start with '/'. |
| | | * Supports wildcard matching by ending with '/*'. |
| | | * @param {function} callback - The callback function to handle the request |
| | | * @param {object} callback.req - The request object |
| | | * @param {string} callback.req.method - The HTTP method (GET, POST, etc.) |
| | | * @param {string} callback.req.url - The request URL |
| | | * @param {string} callback.req.query - The query string (e.g. "a=1&b=2") |
| | | * @param {object} callback.req.headers - The request headers |
| | | * @param {string} [callback.req.body] - The request body (only for specific Content-Type) |
| | | * @param {function(string): boolean} callback.req.saveFile - Function to save uploaded file from raw request body. Returns true on success. |
| | | * @param {function(string): object} callback.req.saveMultipartFile - Function to handle 'multipart/form-data' upload. It saves the file part to the specified path and returns other fields as an object. |
| | | * @param {object} callback.res - The response object |
| | | * @param {function} callback.res.send - Send response with body and headers,the header should be a object and the size should be < 512 |
| | | * @param {function} callback.res.sendFile - Send file as response |
| | | * |
| | | * @example |
| | | * // Basic usage |
| | | * httpserver.route('/hello', function(req, res) { |
| | | * res.send('Hello World', {'Content-Type': 'text/plain'}); |
| | | * }); |
| | | * |
| | | * @example |
| | | * // Wildcard route to handle all requests under /api/ |
| | | * httpserver.route('/api/*', function(req, res) { |
| | | * // req.url will be the full URL, e.g., "/api/users/123" |
| | | * if (req.url.startsWith('/api/users/')) { |
| | | * const userId = req.url.substring(11); |
| | | * res.send(`User ID is ${userId}`); |
| | | * } else { |
| | | * res.send('Welcome to the API!'); |
| | | * } |
| | | * }); |
| | | * |
| | | * @example |
| | | * // Handle file upload (raw body). Client should POST the file content directly. |
| | | * // Example with curl: |
| | | * // curl -X POST --data-binary "@/path/to/your/file.txt" \ |
| | | * // -H "Content-Type: application/octet-stream" \ |
| | | * // http://127.0.0.1:8080/upload |
| | | * httpserver.route('/upload', function(req, res) { |
| | | * req.saveFile('/app/code/data/file_saved.txt'); |
| | | * res.send('File saved'); |
| | | * }); |
| | | * |
| | | * @example |
| | | * // Handle multipart/form-data upload. |
| | | * // This saves the file part to the specified path and returns other form fields. |
| | | * // Example with curl: |
| | | * // curl -X POST -F "file1=@/path/to/your/file.bin" \ |
| | | * // -F "user=JohnDoe" \ |
| | | * // -F "timestamp=1678886400" \ |
| | | * // http://127.0.0.1:8080/form-upload |
| | | * httpserver.route('/form-upload', function(req, res) { |
| | | * const fields = req.saveMultipartFile('/app/code/data/uploaded_file.bin'); |
| | | * // fields will be: { user: "JohnDoe", timestamp: "1678886400" } |
| | | * res.send(`File saved, user was ${fields.user}`); |
| | | * }); |
| | | * |
| | | * @example |
| | | * // Handle file download |
| | | * httpserver.route('/download', function(req, res) { |
| | | * res.sendFile('/app/code/data/file.txt'); |
| | | * }); |
| | | */ |
| | | httpserver.route = function (path, callback) { |
| | | httpserver.init(); |
| | | |
| | | // Wrap the user's callback in a try...catch block to handle uncaught exceptions |
| | | const wrappedCallback = (req, res) => { |
| | | try { |
| | | callback(req, res); |
| | | } catch (e) { |
| | | try { |
| | | res.send(JSON.stringify({ |
| | | error: "Internal Server Error", |
| | | message: String(e)+"\n"+e.stack |
| | | }), { "Content-Type": "application/json" }); |
| | | } catch (resError) { |
| | | } |
| | | } |
| | | }; |
| | | |
| | | server.route(path, wrappedCallback); |
| | | }; |
| | | /** |
| | | * Starts the HTTP server listening for connections. |
| | | * @param {number} port |
| | | */ |
| | | httpserver.listen = function (port) { |
| | | httpserver.init(); |
| | | server.listen(port); |
| | | } |
| | | /** |
| | | * Loop the HTTP server |
| | | */ |
| | | httpserver.loop = function () { |
| | | httpserver.init(); |
| | | server.loop(); |
| | | } |
| | | /** |
| | | * Serve static files |
| | | * @param {string} path The path to serve static files,should be start with '/' |
| | | * @param {string} dir The directory to serve static files,should be a absolute path start with '/app' |
| | | */ |
| | | httpserver.serveStatic = function (path, dir) { |
| | | httpserver.init(); |
| | | if (!path) { |
| | | path = '/'; |
| | | } |
| | | if (!path.startsWith('/')) { |
| | | path = '/' + path; |
| | | } |
| | | if (!path.endsWith('/')) { |
| | | path = path + '/'; |
| | | } |
| | | //path should be start with '/' and end with '/',or '/' |
| | | server.serveStatic(path, dir); |
| | | } |
| | | /** |
| | | * Deinitialize the server |
| | | */ |
| | | httpserver.deinit = function () { |
| | | if (server) { |
| | | server = null; |
| | | } |
| | | } |
| | | /** |
| | | * Get the native server object |
| | | * @returns {Object} Native server object |
| | | */ |
| | | httpserver.getNative = function () { |
| | | httpserver.init(); |
| | | return server; |
| | | } |
| | | export default httpserver; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /**
|
| | | * dxLogger module.
|
| | | * A simple, static logger that replaces `console.log`.
|
| | | * It provides multi-level logging and can be viewed in the corresponding VSCode plugin during debugging.
|
| | | *
|
| | | * Features:
|
| | | * - Three log levels: DEBUG, INFO, ERROR. All levels are always enabled.
|
| | | * - Supports logging various JavaScript data types, including objects and errors.
|
| | | * - Non-blocking log output to avoid performance impact.
|
| | | *
|
| | | * Usage:
|
| | | * - Import the logger: `import log from './dxLogger.js'`
|
| | | * - Use the logging methods: `log.info('Application started');`, `log.error('An error occurred:', new Error('test'));`
|
| | | *
|
| | | * Doc/Demo: https://github.com/DejaOS/DejaOS
|
| | | */
|
| | | const logger = {}
|
| | | // The maximum length of the log message. In special cases, too long content can cause application crashes.
|
| | | logger.max_length = 1024
|
| | | import * as std from "std"
|
| | | import dxMap from './dxMap.js'
|
| | | let loggerMap = dxMap.get('__logger__')
|
| | |
|
| | | /**
|
| | | * Enables or disables the debug mode for the logger.
|
| | | * When debug mode is enabled, output is flushed immediately after each log.
|
| | | * This is essential for seeing logs in real-time when the output is redirected
|
| | | * to a pipe (e.g., during VS Code debugging), but can impact performance and stability
|
| | | * on physical serial ports.
|
| | | *
|
| | | * @param {boolean} [isdebug=true] - Whether to enable or disable debug mode.
|
| | | * @example
|
| | | * // Enable debug mode for real-time logging
|
| | | * logger.setDebug(true);
|
| | | *
|
| | | * // Disable debug mode for production/stability testing
|
| | | * logger.setDebug(false);
|
| | | */
|
| | | logger.setDebug = function (isdebug = true) {
|
| | | if (isdebug) {
|
| | | loggerMap.put('isdebug', true)
|
| | | } else {
|
| | | loggerMap.put('isdebug', false)
|
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | | * Logs a message at the DEBUG level.
|
| | | * @param {...*} data - The data to log. Can be multiple arguments of any type.
|
| | | * @example
|
| | | * logger.debug('User logged in:', { userId: 123 });
|
| | | */
|
| | | logger.debug = function (...data) {
|
| | | log("DEBUG", data)
|
| | | }
|
| | |
|
| | | /**
|
| | | * Logs a message at the INFO level.
|
| | | * @param {...*} data - The data to log. Can be multiple arguments of any type.
|
| | | * @example
|
| | | * logger.info('Server started on port', 8080);
|
| | | */
|
| | | logger.info = function (...data) {
|
| | | log("INFO", data)
|
| | | }
|
| | |
|
| | | /**
|
| | | * Logs a message at the ERROR level.
|
| | | * @param {...*} data - The data to log. Can be multiple arguments of any type.
|
| | | * @example
|
| | | * try {
|
| | | * // ... some code that might fail
|
| | | * } catch (e) {
|
| | | * logger.error('Operation failed:', e);
|
| | | * }
|
| | | */
|
| | | logger.error = function (...data) {
|
| | | log("ERROR", data)
|
| | | }
|
| | | //-----------------------------------private----------------------
|
| | | // Formats and prints the log message to standard output.
|
| | | function log(level, messages) {
|
| | | let message = messages.map(msg => getContent(msg)).join(' ');
|
| | | //multi \n will cause vscode to not see the subsequent logs
|
| | | if (message.includes('\n\n')) {
|
| | | message = message.replace(/\n{2,}/g, '\n');
|
| | | }
|
| | | const content = `[${level} ${getTime()}]: ${message}`.trimEnd();
|
| | | try {
|
| | | if (content.length > logger.max_length) {
|
| | | std.puts(content.slice(0, logger.max_length - 3) + '...\n');
|
| | | } else {
|
| | | std.puts(content + '\n');
|
| | | }
|
| | |
|
| | | // The default behavior is to flush, which is suitable for real-time debugging (VSCode).
|
| | | // To disable flushing for stability testing on serial ports (MobaXterm),
|
| | | // explicitly call logger.setDebug(false).
|
| | | if (loggerMap.get('isdebug') !== false) {
|
| | | std.out.flush();
|
| | | }
|
| | | } catch (e) {
|
| | | // If even the fallback fails, there's nothing more we can do.
|
| | | }
|
| | | }
|
| | | // Converts any JavaScript value to a string for logging.
|
| | | function getContent(message) {
|
| | | if (message === undefined) {
|
| | | return 'undefined'
|
| | | } else if (message === null) {
|
| | | return 'null'
|
| | | }
|
| | | if (typeof message === 'object') {
|
| | | if (Object.prototype.toString.call(message) === '[object Error]') {
|
| | | let errorString = message.message || 'Error';
|
| | | if (message.stack) {
|
| | | errorString += '\n' + message.stack;
|
| | | }
|
| | | return errorString;
|
| | | }
|
| | | return JSON.stringify(message)
|
| | | }
|
| | | return String(message);
|
| | | }
|
| | | // Generates a timestamp string in 'YYYY-MM-DD HH:mm:ss.ms' format.
|
| | | function getTime() {
|
| | | const now = new Date();
|
| | | const year = now.getFullYear();
|
| | | const month = String(now.getMonth() + 1).padStart(2, '0');
|
| | | const day = String(now.getDate()).padStart(2, '0');
|
| | | const hours = String(now.getHours()).padStart(2, '0');
|
| | | const minutes = String(now.getMinutes()).padStart(2, '0');
|
| | | const seconds = String(now.getSeconds()).padStart(2, '0');
|
| | | const milliseconds = String(now.getMilliseconds()).padStart(3, '0');
|
| | | return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
|
| | | }
|
| | | if (globalThis && globalThis.console) {
|
| | | globalThis.console.log = logger.info
|
| | | globalThis.console.debug = logger.debug
|
| | | globalThis.console.error = logger.error
|
| | | }
|
| | | export default logger |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { mapClass } from './libvbar-m-dxmap.so'
|
| | | /**
|
| | | * In-memory Key-Value Store Module (dxMap)
|
| | | *
|
| | | * Features:
|
| | | * - Provides a topic-based, in-memory key-value storage.
|
| | | * - Thread-safe: Data can be safely accessed and modified from multiple JavaScript threads.
|
| | | * - Supports storing various data types (string, number, boolean, object, array) by automatically serializing/deserializing them.
|
| | | *
|
| | | * Usage:
|
| | | * - First, get a map instance for a specific topic using `map.get('myTopic')`.
|
| | | * - Then, use the instance's methods (`put`, `get`, `has`, `del`, etc.) to manage data within that topic.
|
| | | *
|
| | | * @example
|
| | | * import map from 'dxMap';
|
| | | *
|
| | | * // Get an instance for the 'user' topic
|
| | | * const userMap = map.get('user');
|
| | | *
|
| | | * // Put some data
|
| | | * userMap.put('name', 'John Doe');
|
| | | * userMap.put('age', 30);
|
| | | * userMap.put('isActive', true);
|
| | | * userMap.put('roles', ['admin', 'editor']);
|
| | | *
|
| | | * // Get data
|
| | | * const name = userMap.get('name'); // "John Doe"
|
| | | *
|
| | | * // Check if a key exists
|
| | | * const hasAge = userMap.has('age'); // true
|
| | | *
|
| | | * // Delete a key
|
| | | * userMap.del('isActive');
|
| | | *
|
| | | * // Get all keys for the topic
|
| | | * const allKeys = userMap.keys(); // ['name', 'age', 'roles']
|
| | | *
|
| | | * Doc/Demo: https://github.com/DejaOS/DejaOS
|
| | | */
|
| | | const mapObj = new mapClass();
|
| | |
|
| | | const map = {
|
| | | /**
|
| | | * Gets a map instance for a given topic name.
|
| | | * Each topic is a separate namespace for keys.
|
| | | * @param {string} name - The name of the topic. Must not be null or empty.
|
| | | * @returns {{keys: (function(): string[]), get: (function(string): *), has: (function(string): boolean), put: (function(string, *): boolean), del: (function(string): boolean), destroy: (function(): boolean)}} An object with methods to interact with the map for the specified topic.
|
| | | * @throws {Error} If the name is null or empty.
|
| | | */
|
| | | get: function (name) {
|
| | | if (!name || name.length == 0) {
|
| | | throw new Error("dxMap.get:name should not be null or empty")
|
| | | }
|
| | | //ç¬¬ä¸æ¬¡putä¼èªå¨å建å®ä¾
|
| | | return {
|
| | | /**
|
| | | * Retrieves all keys within the current topic.
|
| | | * @returns {string[]} An array of all keys for the topic. Returns an empty array if the topic is empty or does not exist.
|
| | | */
|
| | | keys: function () {
|
| | | let all = mapObj.keys(name)
|
| | | return all == null ? [] : all
|
| | | },
|
| | | /**
|
| | | * Retrieves the value associated with a key within the current topic.
|
| | | * The returned value will be deserialized to its original type (number, boolean, object, array, or string).
|
| | | * @param {string} key - The key to retrieve. Must not be null or empty.
|
| | | * @returns {*} The value associated with the key, or `undefined` if the key does not exist.
|
| | | * @throws {Error} If the key is null or empty.
|
| | | */
|
| | | get: function (key) {
|
| | | if (!key || key.length < 1) {
|
| | | throw new Error("The 'key' parameter cannot be null or empty")
|
| | | }
|
| | | // put空å符串ï¼get伿¯null
|
| | | let value = mapObj.get(name, key)
|
| | | // C layer returns null if not found. JS layer should propagate this.
|
| | | if (value === null) {
|
| | | return undefined; // Return undefined for non-existent keys, a common JS pattern.
|
| | | }
|
| | | return _parseString(value)
|
| | | },
|
| | | /**
|
| | | * Checks if a key exists within the current topic.
|
| | | * @param {string} key - The key to check. Must not be null or empty.
|
| | | * @returns {boolean} `true` if the key exists, `false` otherwise.
|
| | | * @throws {Error} If the key is null or empty.
|
| | | */
|
| | | has: function (key) {
|
| | | if (!key || key.length < 1) {
|
| | | throw new Error("The 'key' parameter cannot be null or empty")
|
| | | }
|
| | | return mapObj.has(name, key)
|
| | | },
|
| | | /**
|
| | | * Inserts or updates a key-value pair within the current topic.
|
| | | * The value will be automatically serialized.
|
| | | * If `value` is `null` or `undefined`, the key will be deleted.
|
| | | * @param {string} key - The key to set. Must not be null or empty.
|
| | | * @param {*} value - The value to associate with the key. Supported types: string, number, boolean, object, array. Functions are not supported.
|
| | | * @returns {boolean} Returns `true` on success.
|
| | | * @throws {Error} If the key is null or empty, or if the value is a function.
|
| | | */
|
| | | put: function (key, value) {
|
| | | if (!key || key.length < 1) {
|
| | | throw new Error("The 'key' parameter cannot be null or empty")
|
| | | }
|
| | | // Implement "set null/undefined to delete" logic.
|
| | | if (value === null || value === undefined) {
|
| | | return mapObj.delete(name, key);
|
| | | }
|
| | | return mapObj.insert(name, key, _stringifyValue(value))
|
| | | },
|
| | | /**
|
| | | * Deletes a key-value pair from the current topic.
|
| | | * @param {string} key - The key to delete. Must not be null or empty.
|
| | | * @returns {boolean} `true` if the key was found and deleted, `false` otherwise.
|
| | | * @throws {Error} If the key is null or empty.
|
| | | */
|
| | | del: function (key) {
|
| | | if (!key || key.length < 1) {
|
| | | throw new Error("The 'key' parameter cannot be null or empty")
|
| | | }
|
| | | return mapObj.delete(name, key)
|
| | | },
|
| | | /**
|
| | | * Destroys the entire topic, deleting all its keys and freeing associated memory.
|
| | | * After calling destroy, the instance should not be used anymore.
|
| | | * @returns {boolean} Returns `true` on success.
|
| | | */
|
| | | destroy: function () {
|
| | | return mapObj.destroy(name)
|
| | | },
|
| | | }
|
| | | }
|
| | |
|
| | | }
|
| | | /**
|
| | | * Serializes a value into a string with a type prefix.
|
| | | * @private
|
| | | * @param {*} value - The value to serialize.
|
| | | * @returns {string} The serialized string.
|
| | | */
|
| | | function _stringifyValue(value) {
|
| | | const type = typeof value
|
| | | if (type === 'string') {
|
| | | return value
|
| | | }
|
| | | if (type === 'number') {
|
| | | return '#n#' + value
|
| | | }
|
| | | if (type === 'boolean') {
|
| | | return '#b#' + value
|
| | | }
|
| | | if (type === 'object') {
|
| | | // 妿æ¯å¯¹è±¡ï¼è¿ä¸æ¥å¤ææ¯å¦ä¸ºæ°ç»
|
| | | if (Array.isArray(value)) {
|
| | | return '#a#' + JSON.stringify(value);
|
| | | }// else if (value === null) { åé¢å·²ç»è§é¿äºnullçæ
åµ
|
| | | return '#o#' + JSON.stringify(value)
|
| | | }
|
| | | if (type === 'function') {
|
| | | throw new Error("The 'value' parameter should not be function")
|
| | | }
|
| | | }
|
| | | /**
|
| | | * Deserializes a string with a type prefix back to its original value.
|
| | | * @private
|
| | | * @param {string} str - The string to deserialize.
|
| | | * @returns {*} The deserialized value.
|
| | | */
|
| | | function _parseString(str) {
|
| | | if (str.startsWith('#n#')) {
|
| | | // è§£ææ°å
|
| | | const numberStr = str.substring(3);
|
| | | return numberStr.includes('.') ? parseFloat(numberStr) : parseInt(numberStr, 10);
|
| | | } else if (str.startsWith('#b#')) {
|
| | | // è§£æå¸å°å¼
|
| | | return str.substring(3) === 'true';
|
| | | } else if (str.startsWith('#a#')) {
|
| | | // è§£ææ°ç»
|
| | | return JSON.parse(str.substring(3));
|
| | | } else if (str.startsWith('#o#')) {
|
| | | // è§£æå¯¹è±¡
|
| | | return JSON.parse(str.substring(3));
|
| | | } else {
|
| | | // é»è®¤æ
åµä¸ï¼å°å符串è¿å
|
| | | return str;
|
| | | }
|
| | | }
|
| | | export default map;
|
| | |
|
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * MQTT Client Module based on Eclipse Paho MQTT C library. |
| | | * This module provides a singleton interface to an MQTT client. |
| | | * |
| | | * Features: |
| | | * - Connect/disconnect to an MQTT broker. |
| | | * - Publish messages and subscribe to topics. |
| | | * - Supports MQTTS (MQTT over SSL/TLS). |
| | | * - Handles connection loss and message delivery callbacks. |
| | | * |
| | | * Usage: |
| | | * - Initialize once with `init()`. |
| | | * - Use the methods to interact with the broker. |
| | | * |
| | | * Doc/Demo: https://github.com/DejaOS/DejaOS |
| | | */ |
| | | import { mqttclientClass } from './libvbar-m-dxmqttclient.so'; |
| | | import log from './dxLogger.js' |
| | | |
| | | let client = null; |
| | | const dxmqttclient = {}; |
| | | |
| | | function checkClientInitialized() { |
| | | if (!client) { |
| | | throw new Error('MQTT client is not initialized. Call init(serverURI, clientId) first.'); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Validates QoS level |
| | | * @param {number} qos QoS level to validate |
| | | * @param {string} context Context for error message |
| | | */ |
| | | function validateQoS(qos, context = 'QoS') { |
| | | if (typeof qos !== 'number' || !Number.isInteger(qos) || qos < 0 || qos > 2) { |
| | | throw new Error(`${context} must be an integer between 0 and 2, got: ${qos}`); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Validates MQTT topic format |
| | | * @param {string} topic Topic to validate |
| | | * @param {string} context Context for error message |
| | | */ |
| | | function validateTopic(topic, context = 'Topic') { |
| | | if (typeof topic !== 'string' || topic.length === 0) { |
| | | throw new Error(`${context} must be a non-empty string`); |
| | | } |
| | | if (topic.length > 65535) { |
| | | throw new Error(`${context} must be less than 65535 characters`); |
| | | } |
| | | // Check for invalid characters (null character) |
| | | if (topic.includes('\0')) { |
| | | throw new Error(`${context} cannot contain null characters`); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Validates server URI format |
| | | * @param {string} serverURI Server URI to validate |
| | | */ |
| | | function validateServerURI(serverURI) { |
| | | if (typeof serverURI !== 'string' || serverURI.length === 0) { |
| | | throw new Error('Server URI must be a non-empty string'); |
| | | } |
| | | const validProtocols = ['tcp://', 'ssl://', 'mqtt://', 'mqtts://']; |
| | | if (!validProtocols.some(protocol => serverURI.startsWith(protocol))) { |
| | | throw new Error(`Server URI must start with one of: ${validProtocols.join(', ')}`); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Validates client ID |
| | | * @param {string} clientId Client ID to validate |
| | | */ |
| | | function validateClientId(clientId) { |
| | | if (typeof clientId !== 'string') { |
| | | throw new Error('Client ID must be a string'); |
| | | } |
| | | if (clientId.length > 23) { |
| | | // MQTT 3.1.1 spec limits to 23 chars, but many modern brokers accept longer IDs |
| | | log.info('Client ID is longer than 23 characters, which is not recommended by the MQTT spec.'); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Validates connection options |
| | | * @param {object} options Connection options to validate |
| | | */ |
| | | function validateConnectOptions(options) { |
| | | if (options && typeof options !== 'object') { |
| | | throw new Error('Connection options must be an object'); |
| | | } |
| | | |
| | | if (options) { |
| | | // Validate keepAlive |
| | | if (options.keepAlive !== undefined) { |
| | | if (typeof options.keepAlive !== 'number' || options.keepAlive < 0 || options.keepAlive > 65535) { |
| | | throw new Error('keepAlive must be a number between 0 and 65535'); |
| | | } |
| | | } |
| | | |
| | | // Validate cleanSession |
| | | if (options.cleanSession !== undefined && typeof options.cleanSession !== 'boolean') { |
| | | throw new Error('cleanSession must be a boolean'); |
| | | } |
| | | |
| | | // Validate username and password |
| | | if (options.username !== undefined && typeof options.username !== 'string') { |
| | | throw new Error('username must be a string'); |
| | | } |
| | | if (options.password !== undefined && typeof options.password !== 'string') { |
| | | throw new Error('password must be a string'); |
| | | } |
| | | |
| | | // Validate will options |
| | | if (options.will !== undefined) { |
| | | if (typeof options.will !== 'object') { |
| | | throw new Error('will options must be an object'); |
| | | } |
| | | if (!options.will.topic || typeof options.will.topic !== 'string') { |
| | | throw new Error('will.topic must be a non-empty string'); |
| | | } |
| | | validateTopic(options.will.topic, 'will.topic'); |
| | | |
| | | if (options.will.payload !== undefined && typeof options.will.payload !== 'string') { |
| | | throw new Error('will.payload must be a string'); |
| | | } |
| | | if (options.will.qos !== undefined) { |
| | | validateQoS(options.will.qos, 'will.qos'); |
| | | } |
| | | if (options.will.retained !== undefined && typeof options.will.retained !== 'boolean') { |
| | | throw new Error('will.retained must be a boolean'); |
| | | } |
| | | } |
| | | |
| | | // Validate SSL options |
| | | if (options.ssl !== undefined) { |
| | | if (typeof options.ssl !== 'object') { |
| | | throw new Error('SSL options must be an object'); |
| | | } |
| | | const sslStringFields = ['caFile', 'certFile', 'keyFile', 'keyPassword']; |
| | | sslStringFields.forEach(field => { |
| | | if (options.ssl[field] !== undefined && typeof options.ssl[field] !== 'string') { |
| | | throw new Error(`ssl.${field} must be a string`); |
| | | } |
| | | }); |
| | | if (options.ssl.enableServerCertAuth !== undefined && typeof options.ssl.enableServerCertAuth !== 'boolean') { |
| | | throw new Error('ssl.enableServerCertAuth must be a boolean'); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Validates publish options |
| | | * @param {object} options Publish options to validate |
| | | */ |
| | | function validatePublishOptions(options) { |
| | | if (options && typeof options !== 'object') { |
| | | throw new Error('Publish options must be an object'); |
| | | } |
| | | |
| | | if (options) { |
| | | if (options.qos !== undefined) { |
| | | validateQoS(options.qos, 'publish qos'); |
| | | } |
| | | if (options.retained !== undefined && typeof options.retained !== 'boolean') { |
| | | throw new Error('retained must be a boolean'); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Validates subscribe options |
| | | * @param {object} options Subscribe options to validate |
| | | */ |
| | | function validateSubscribeOptions(options) { |
| | | if (options && typeof options !== 'object') { |
| | | throw new Error('Subscribe options must be an object'); |
| | | } |
| | | |
| | | if (options && options.qos !== undefined) { |
| | | validateQoS(options.qos, 'subscribe qos'); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Initializes the MQTT client. This must be called once before any other operations. |
| | | * @param {string} serverURI The URI of the MQTT broker. Examples: "tcp://localhost:1883", "ssl://test.mosquitto.org:8883". |
| | | * @param {string} clientId A unique identifier for this client. |
| | | * @example |
| | | * dxmqttclient.init('tcp://test.mosquitto.org:1883', 'my-device-123'); |
| | | */ |
| | | dxmqttclient.init = function (serverURI, clientId) { |
| | | if (client) { |
| | | log.info('MQTT client already initialized.'); |
| | | return; |
| | | } |
| | | |
| | | validateServerURI(serverURI); |
| | | validateClientId(clientId); |
| | | |
| | | client = new mqttclientClass(serverURI, clientId); |
| | | }; |
| | | |
| | | /** |
| | | * Connects the client to the MQTT broker. |
| | | * @param {object} [options] Connection options. |
| | | * @param {string} [options.username] The username for authentication. |
| | | * @param {string} [options.password] The password for authentication. |
| | | * @param {number} [options.keepAlive=60] The keep-alive interval in seconds. |
| | | * @param {boolean} [options.cleanSession=true] Whether to establish a clean session. |
| | | * @param {object} [options.will] The "will" message (last will and testament) to be sent if the client disconnects unexpectedly. |
| | | * @param {string} options.will.topic The topic for the will message. |
| | | * @param {string} options.will.payload The payload of the will message. |
| | | * @param {number} [options.will.qos=0] The Quality of Service level for the will message. |
| | | * @param {boolean} [options.will.retained=false] Whether the will message should be retained. |
| | | * @param {object} [options.ssl] SSL/TLS options, required for 'ssl://' or 'mqtts://' URIs. |
| | | * @param {string} [options.ssl.caFile] Path to the CA certificate file for server verification. |
| | | * @param {string} [options.ssl.certFile] Path to the client's certificate file. |
| | | * @param {string} [options.ssl.keyFile] Path to the client's private key file. |
| | | * @param {string} [options.ssl.keyPassword] Password for the client's private key. |
| | | * @returns {void} |
| | | * @example |
| | | * dxmqttclient.connect({ |
| | | * username: 'user', |
| | | * password: 'password', |
| | | * will: { |
| | | * topic: 'client/status', |
| | | * payload: 'offline', |
| | | * qos: 1, |
| | | * retained: true |
| | | * } |
| | | * }); |
| | | */ |
| | | dxmqttclient.connect = function (options) { |
| | | checkClientInitialized(); |
| | | validateConnectOptions(options); |
| | | client.connect(options || {}); |
| | | }; |
| | | |
| | | /** |
| | | * Disconnects the client from the MQTT broker. |
| | | * @param {number} [timeout=1000] Timeout in milliseconds to wait for disconnection to complete. |
| | | * @returns {void} |
| | | */ |
| | | dxmqttclient.disconnect = function (timeout) { |
| | | checkClientInitialized(); |
| | | if (timeout !== undefined) { |
| | | if (typeof timeout !== 'number' || timeout < 0) { |
| | | throw new Error('Disconnect timeout must be a non-negative number'); |
| | | } |
| | | } |
| | | client.disconnect(timeout || 1000); |
| | | }; |
| | | |
| | | /** |
| | | * Publishes a message to a topic. |
| | | * @param {string} topic The topic to publish the message to. |
| | | * @param {string|ArrayBuffer} payload The message payload. |
| | | * @param {object} [options] Publishing options. |
| | | * @param {number} [options.qos=0] The Quality of Service (QoS) level (0, 1, or 2). |
| | | * @param {boolean} [options.retained=false] Whether the message should be retained by the broker. |
| | | * @returns {number} The delivery token for tracking message delivery (for QoS > 0). |
| | | * @example |
| | | * dxmqttclient.publish('device/status', 'online', { qos: 1 }); |
| | | */ |
| | | dxmqttclient.publish = function (topic, payload, options) { |
| | | checkClientInitialized(); |
| | | validateTopic(topic, 'Publish topic'); |
| | | |
| | | if (payload === undefined || payload === null) { |
| | | throw new Error('Payload cannot be undefined or null'); |
| | | } |
| | | if (typeof payload !== 'string' && !(payload instanceof ArrayBuffer)) { |
| | | throw new Error('Payload must be a string or ArrayBuffer'); |
| | | } |
| | | |
| | | validatePublishOptions(options); |
| | | |
| | | return client.publish(topic, payload, options || {}); |
| | | }; |
| | | |
| | | /** |
| | | * Subscribes to a topic. |
| | | * @param {string} topic The topic filter to subscribe to. |
| | | * @param {object} [options] Subscription options. |
| | | * @param {number} [options.qos=0] The maximum QoS level at which to receive messages. |
| | | * @returns {void} |
| | | * @example |
| | | * dxmqttclient.subscribe('commands/light', { qos: 1 }); |
| | | */ |
| | | dxmqttclient.subscribe = function (topic, options) { |
| | | checkClientInitialized(); |
| | | validateTopic(topic, 'Subscribe topic'); |
| | | validateSubscribeOptions(options); |
| | | |
| | | const qos = (options && options.qos) || 0; |
| | | client.subscribe(topic, qos); |
| | | }; |
| | | |
| | | /** |
| | | * Unsubscribes from a topic. |
| | | * @param {string} topic The topic filter to unsubscribe from. |
| | | * @returns {void} |
| | | */ |
| | | dxmqttclient.unsubscribe = function (topic) { |
| | | checkClientInitialized(); |
| | | validateTopic(topic, 'Unsubscribe topic'); |
| | | client.unsubscribe(topic); |
| | | }; |
| | | |
| | | /** |
| | | * Sets the callback handlers for MQTT events. |
| | | * @param {object} callbacks An object containing the callback functions. |
| | | * @param {function()} [callbacks.onConnectSuccess] Fired when the client successfully connects to the broker. |
| | | * @param {function(string, string, number, boolean)} [callbacks.onMessage] Fired when a message is received. |
| | | * @param {function(number)} [callbacks.onDelivery] Fired when a published message has been delivered (for QoS > 0). |
| | | * @param {function(string)} [callbacks.onConnectionLost] Fired when the connection to the broker is lost. |
| | | */ |
| | | dxmqttclient.setCallbacks = function (callbacks) { |
| | | checkClientInitialized(); |
| | | |
| | | if (!callbacks || typeof callbacks !== 'object') { |
| | | throw new Error('Callbacks must be an object'); |
| | | } |
| | | |
| | | const callbackNames = ['onConnectSuccess', 'onMessage', 'onDelivery', 'onConnectionLost']; |
| | | callbackNames.forEach(name => { |
| | | if (callbacks[name] !== undefined && typeof callbacks[name] !== 'function') { |
| | | throw new Error(`${name} must be a function`); |
| | | } |
| | | }); |
| | | |
| | | client.setCallbacks(callbacks); |
| | | }; |
| | | |
| | | /** |
| | | * Processes events from the MQTT event queue. |
| | | * This should be called periodically to handle message arrivals, |
| | | * delivery confirmations, and connection loss events. |
| | | * It's recommended to use this with `setInterval`. |
| | | * @example |
| | | * // In your application thread loop: |
| | | * setInterval(() => { |
| | | * dxmqttclient.loop(); |
| | | * },50); // Process events every 50ms |
| | | */ |
| | | dxmqttclient.loop = function () { |
| | | try { |
| | | checkClientInitialized(); |
| | | client.loop(); |
| | | } catch (e) { |
| | | log.error('Error in MQTT loop:', e); |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * Checks if the client is currently connected to the broker. |
| | | * @returns {boolean} `true` if connected, `false` otherwise. |
| | | */ |
| | | dxmqttclient.isConnected = function () { |
| | | checkClientInitialized(); |
| | | return client.isConnected(); |
| | | }; |
| | | |
| | | /** |
| | | * Deinitializes the client instance, allowing for re-initialization. |
| | | */ |
| | | dxmqttclient.deinit = function () { |
| | | if (client) { |
| | | // The C++ finalizer handles disconnection and resource cleanup. |
| | | // Setting client to null allows the garbage collector to reclaim it. |
| | | client = null; |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * Get the native client object. |
| | | * @returns {Object|null} The native client object, or null if not initialized. |
| | | */ |
| | | dxmqttclient.getNative = function () { |
| | | return client; |
| | | }; |
| | | |
| | | export default dxmqttclient; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * Network Module based on native network_bridge C library. |
| | | * This module provides a singleton interface to network management. |
| | | * Can be used across threads, but `on` and `loop` functions need to be called in the same thread. |
| | | * Features: |
| | | * - Initialize/deinitialize network stack |
| | | * - Connect/disconnect to Ethernet/WiFi/4G |
| | | * - Query network status, local IP, RSSI |
| | | * - Scan WiFi hotspots |
| | | * - Register event callbacks (status change, WiFi scan complete) |
| | | * |
| | | * Usage: |
| | | * - Call `init()` once to initialize. |
| | | * - Use connect/disconnect/getStatus/isConnected/getLocalIP/getRSSI/scanWifi as needed. |
| | | * - Use `on` to register event handlers. |
| | | * - Call loop() periodically to process events (e.g. in setInterval). |
| | | * |
| | | * Doc/Demo: https://github.com/DejaOS/DejaOS |
| | | */ |
| | | import { netClass } from './libvbar-m-dxnetwork.so' |
| | | |
| | | /** |
| | | * @typedef {object} NetOption |
| | | * @property {string} ip - Static IP address. |
| | | * @property {string} gateway - Static gateway address. |
| | | * @property {string} netmask - Static netmask. |
| | | * @property {string} [dns] - Static DNS server address. |
| | | */ |
| | | |
| | | const dxnetwork = {}; |
| | | |
| | | // 常é䏿䏾 |
| | | dxnetwork.NET_TYPE = { ETH: 1, WIFI: 2, MODEM: 4 }; // 4 = 4G Modem |
| | | dxnetwork.IP_MODE = { DHCP: 0, STATIC: 1 }; |
| | | |
| | | const net = new netClass(); |
| | | let _callbacks = {}; |
| | | |
| | | /** |
| | | * Initializes the network. |
| | | * @returns {void} |
| | | */ |
| | | dxnetwork.init = function () { |
| | | net.init(); |
| | | } |
| | | |
| | | /** |
| | | * Deinitializes the network stack and releases resources. |
| | | * @returns {void} |
| | | */ |
| | | dxnetwork.deinit = function () { |
| | | net.deinit(); |
| | | } |
| | | |
| | | /** |
| | | * Connects to a network (Ethernet/WiFi/4G). |
| | | * @param {object} options - Connection options. |
| | | * @param {number} options.netType - Network type: |
| | | * 1 = Ethernet, |
| | | * 2 = WiFi, |
| | | * 4 = 4G Modem. |
| | | * @param {number} [options.ipMode] - IP mode: 0 = DHCP, 1 = Static. |
| | | * @param {string} [options.ssid] - WiFi SSID (for WiFi only). |
| | | * @param {string} [options.psk] - WiFi password (for WiFi only). |
| | | * @param {string} [options.apn] - APN for 4G connection. |
| | | * @param {string} [options.user] - Username for 4G APN. |
| | | * @param {string} [options.password] - Password for 4G APN. |
| | | * @param {string} [options.ip] - Static IP address (for static mode). |
| | | * @param {string} [options.gateway] - Static gateway (for static mode). |
| | | * @param {string} [options.netmask] - Static netmask (for static mode). |
| | | * @param {string} [options.dns] - Static DNS (for static mode). |
| | | * @param {string} [options.macaddr] - Custom MAC address (for Ethernet only). |
| | | * @returns {void} |
| | | * @example |
| | | * dxnetwork.connect({ netType: 2, ssid: 'MyWiFi', psk: 'password' }); |
| | | */ |
| | | dxnetwork.connect = function (options) { |
| | | return net.connect(options); |
| | | } |
| | | |
| | | /** |
| | | * Connects to Ethernet with DHCP. |
| | | * @param {string} [macaddr] - Optional custom MAC address.Usually not needed. |
| | | * @returns {void} |
| | | * @example |
| | | * dxnetwork.connectEthWithDHCP(); |
| | | * dxnetwork.connectEthWithDHCP('00:11:22:33:44:55'); |
| | | */ |
| | | dxnetwork.connectEthWithDHCP = function (macaddr) { |
| | | const options = { |
| | | netType: 1, // Ethernet |
| | | ipMode: 0 // DHCP |
| | | }; |
| | | if (macaddr) { |
| | | options.macaddr = macaddr; |
| | | } |
| | | return net.connect(options); |
| | | }; |
| | | |
| | | /** |
| | | * Connects to Ethernet with a static IP configuration. |
| | | * @param {NetOption} netOption - The static IP configuration. |
| | | * @param {string} [macaddr] - Optional custom MAC address. Usually not needed. |
| | | * @returns {void} |
| | | * @example |
| | | * dxnetwork.connectEth({ |
| | | * ip: '192.168.1.100', |
| | | * gateway: '192.168.1.1', |
| | | * netmask: '255.255.255.0', |
| | | * dns: '8.8.8.8' |
| | | * }); |
| | | */ |
| | | dxnetwork.connectEth = function (netOption, macaddr) { |
| | | if (!netOption || !netOption.ip || !netOption.gateway || !netOption.netmask) { |
| | | throw new Error('Static IP configuration (ip, gateway, netmask) is required for connectEth.'); |
| | | } |
| | | const options = { |
| | | netType: 1, // Ethernet |
| | | ipMode: 1, // Static |
| | | ip: netOption.ip, |
| | | gateway: netOption.gateway, |
| | | netmask: netOption.netmask, |
| | | dns: netOption.dns |
| | | }; |
| | | if (macaddr) { |
| | | options.macaddr = macaddr; |
| | | } |
| | | return net.connect(options); |
| | | }; |
| | | |
| | | /** |
| | | * Connects to a WiFi network with DHCP. |
| | | * @param {string} ssid - The SSID of the WiFi network. |
| | | * @param {string} psk - The password (Pre-Shared Key) of the WiFi network. |
| | | * @returns {void} |
| | | * @example |
| | | * dxnetwork.connectWifiWithDHCP('MyWiFi', 'MyPassword'); |
| | | */ |
| | | dxnetwork.connectWifiWithDHCP = function (ssid, psk) { |
| | | if (!ssid) { |
| | | throw new Error('SSID is required for connectWifiWithDHCP.'); |
| | | } |
| | | const options = { |
| | | netType: 2, // WiFi |
| | | ipMode: 0, // DHCP |
| | | ssid: ssid, |
| | | psk: psk |
| | | }; |
| | | return net.connect(options); |
| | | }; |
| | | |
| | | /** |
| | | * Connects to a WiFi network with a static IP configuration. |
| | | * @param {string} ssid - The SSID of the WiFi network. |
| | | * @param {string} psk - The password (Pre-Shared Key) of the WiFi network. |
| | | * @param {NetOption} netOption - The static IP configuration. |
| | | * @returns {void} |
| | | * @example |
| | | * dxnetwork.connectWifi('MyWiFi', 'MyPassword', { |
| | | * ip: '192.168.1.101', |
| | | * gateway: '192.168.1.1', |
| | | * netmask: '255.255.255.0' |
| | | * }); |
| | | */ |
| | | dxnetwork.connectWifi = function (ssid, psk, netOption) { |
| | | if (!netOption || !netOption.ip || !netOption.gateway || !netOption.netmask) { |
| | | throw new Error('Static IP configuration (ip, gateway, netmask) is required for connectWifi with static IP.'); |
| | | } |
| | | if (!ssid) { |
| | | throw new Error('SSID is required for connectWifi with static IP.'); |
| | | } |
| | | const options = { |
| | | netType: 2, // WiFi |
| | | ipMode: 1, // Static |
| | | ssid: ssid, |
| | | psk: psk, |
| | | ip: netOption.ip, |
| | | gateway: netOption.gateway, |
| | | netmask: netOption.netmask, |
| | | dns: netOption.dns |
| | | }; |
| | | return net.connect(options); |
| | | }; |
| | | |
| | | /** |
| | | * Connects to a 4G mobile network with default settings. |
| | | * @returns {void} |
| | | * @example |
| | | * dxnetwork.connect4G(); |
| | | */ |
| | | dxnetwork.connect4G = function () { |
| | | const options = { |
| | | netType: 4, // 4G Modem |
| | | }; |
| | | return net.connect(options); |
| | | }; |
| | | |
| | | /** |
| | | * Disconnects from the current network. |
| | | * @returns {void} |
| | | */ |
| | | dxnetwork.disconnect = function () { |
| | | net.disconnect(); |
| | | } |
| | | |
| | | /** |
| | | * Gets the current network status. |
| | | * @returns {number} Network status code. |
| | | */ |
| | | dxnetwork.getStatus = function () { |
| | | return net.getStatus(); |
| | | } |
| | | |
| | | /** |
| | | * Gets the current network type |
| | | * @returns {number} Network type code. |
| | | */ |
| | | dxnetwork.getType = function () { |
| | | return net.getType(); |
| | | } |
| | | |
| | | /** |
| | | * Checks if the network is currently connected. |
| | | * @returns {boolean} True if connected, false otherwise. |
| | | */ |
| | | dxnetwork.isConnected = function () { |
| | | return net.isConnected(); |
| | | } |
| | | |
| | | /** |
| | | * Gets the local IP address. |
| | | * @returns {string} ip address. |
| | | * @returns {string} gateway address. |
| | | * @returns {string} netmask address. |
| | | * @returns {string} dns address. |
| | | */ |
| | | dxnetwork.getNetParam = function () { |
| | | return net.getNetParam(); |
| | | } |
| | | |
| | | /** |
| | | * Gets the current signal strength (RSSI). |
| | | * @returns {number} RSSI value. |
| | | */ |
| | | dxnetwork.getRSSI = function () { |
| | | return net.getRSSI(); |
| | | } |
| | | |
| | | /** |
| | | * Gets the current network MAC address. |
| | | * @returns {string} MAC address. |
| | | */ |
| | | dxnetwork.getNetMac = function () { |
| | | return net.getNetMac(); |
| | | } |
| | | |
| | | /** |
| | | * Scans for available WiFi hotspots. |
| | | * @param {number} [timeout=2500] - Timeout in milliseconds. |
| | | * @param {number} [interval=100] - Scan interval in milliseconds. |
| | | * @returns {Array} List of WiFi hotspots. |
| | | */ |
| | | dxnetwork.scanWifi = function (timeout, interval) { |
| | | return net.scanWifi(timeout, interval); |
| | | }; |
| | | |
| | | /** |
| | | * Sets callback handlers for network events. |
| | | * Current only support status change event. |
| | | * @param {object} callbacks - Callback functions. |
| | | * @param {function(netType:number, status:number)} [callbacks.onStatusChange] - Called when network status changes. |
| | | * @example |
| | | * dxnetwork.setCallbacks({ |
| | | * onStatusChange: function(netType, status) { |
| | | * } |
| | | * }); |
| | | * @returns {void} |
| | | */ |
| | | |
| | | dxnetwork.setCallbacks = function (callbacks) { |
| | | _callbacks = callbacks; |
| | | } |
| | | |
| | | /** |
| | | * Processes events from the network event queue. Should be called periodically (e.g. in setInterval). |
| | | * Handles status change event. |
| | | * @example |
| | | * setInterval(() => { |
| | | * try{ |
| | | * dxnetwork.loop(); |
| | | * } catch (e) { |
| | | * log.error('Error in network loop:', e); |
| | | * } |
| | | * }, 50); // Process events every 50ms |
| | | */ |
| | | dxnetwork.loop = function () { |
| | | let ev = net.getEvent() |
| | | if (ev && ev.type === 0 && _callbacks.onStatusChange) { |
| | | _callbacks.onStatusChange(ev.netType, ev.netStatus); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Gets the native network client object. |
| | | * @returns {Object|null} The native client object, or null if not initialized. |
| | | */ |
| | | dxnetwork.getNative = function () { |
| | | return net; |
| | | } |
| | | |
| | | export default dxnetwork; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | //build:20240715 |
| | | //éè¿è¿ä¸ªç»ä»¶æ¥è¯»åå¡ï¼å
æ¬M1å¡ï¼psamå¡ä¹ç±»ç |
| | | //ä¾èµç»ä»¶: dxDriver,dxMap,dxLogger,dxDriver,dxCommon,dxEventBus |
| | | import { nfcClass } from './libvbar-p-dxnfc.so' |
| | | import dxCommon from './dxCommon.js' |
| | | import bus from './dxEventBus.js' |
| | | import dxMap from './dxMap.js' |
| | | const nfcObj = new nfcClass(); |
| | | const map = dxMap.get("default") |
| | | const nfc = {} |
| | | |
| | | /** |
| | | * NFC åå§å |
| | | * @param {number} useEid éå¿
å¡«ï¼æ¯å¦ä½¿ç¨äºè¯ 0ä¸ä½¿ç¨ 1ä½¿ç¨ |
| | | */ |
| | | nfc.init = function (useEid = 0) { |
| | | let pointer = nfcObj.init(useEid) |
| | | if (pointer === undefined || pointer === null) { |
| | | throw new Error("nfc.init: init failed") |
| | | } |
| | | dxCommon.handleId("nfc", 'nfcid', pointer) |
| | | } |
| | | |
| | | /** |
| | | * NFC æ®é塿³¨ååè° |
| | | */ |
| | | nfc.cbRegister = function (callback) { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | return nfcObj.cbRegister(pointer, "nfc_cb", 1, callback) |
| | | } |
| | | |
| | | /** |
| | | * NFC PSAM塿³¨ååè° |
| | | */ |
| | | nfc.psamCbRegister = function (callback) { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | return nfcObj.nfcPsamCheckVgcardCallback(pointer, callback) |
| | | } |
| | | |
| | | /** |
| | | * NFC åæ¶åå§å |
| | | */ |
| | | nfc.deinit = function () { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | let ret = nfcObj.cbUnregister(pointer, "nfc_cb") |
| | | if (ret === false) { |
| | | throw new Error("nfc.cbUnregister: cbUnregister failed") |
| | | } |
| | | return nfcObj.deinit(pointer) |
| | | } |
| | | |
| | | /** |
| | | * NFC å¡ä¿¡æ¯å建 |
| | | * @param {number} cardType å¡è¯çç±»å(ååå®ä¹) |
| | | * @param {ArrayBuffer} cardId å¡å· |
| | | * @param {number} type å¡ç±»å(æä»¬èªå·±å®ä¹ç) |
| | | * @returns cardInfo(pointer) |
| | | */ |
| | | nfc.cardInfoCreate = function (cardType, cardId, type) { |
| | | if (!cardType) { |
| | | throw new Error("cardInfoCreate:cardType should not be null or empty") |
| | | } |
| | | if (!cardId) { |
| | | throw new Error("cardInfoCreate:cardId should not be null or empty") |
| | | } |
| | | if (!type) { |
| | | throw new Error("cardInfoCreate:type should not be null or empty") |
| | | } |
| | | return nfcObj.cardInfoCreate(cardType, cardId, type); |
| | | } |
| | | |
| | | /** |
| | | * NFC å¡ä¿¡æ¯éæ¯ |
| | | * @param {pointer} cardInfo å¡ä¿¡æ¯ |
| | | * @returns |
| | | */ |
| | | nfc.cardInfoDestory = function (cardInfo) { |
| | | if (!cardInfo) { |
| | | throw new Error("cardInfoDestory:cardInfo should not be null or empty") |
| | | } |
| | | return nfcObj.cardInfoDestory(cardInfo); |
| | | } |
| | | |
| | | /** |
| | | * NFC å¡ä¿¡æ¯å¤å¶ |
| | | * @param {pointer} cardInfo å¡ä¿¡æ¯ |
| | | * @returns cardInfo(pointer) |
| | | */ |
| | | nfc.cardInfoCopy = function (cardInfo) { |
| | | if (cardInfo == null) { |
| | | throw new Error("cardInfoCopy:cardInfo should not be null or empty") |
| | | } |
| | | return nfcObj.cardInfoCopy(cardInfo); |
| | | } |
| | | |
| | | /** |
| | | * NFC 夿æ¯å¦æå¡ |
| | | * @returns bool |
| | | */ |
| | | nfc.isCardIn = function () { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | return nfcObj.isCardIn(pointer); |
| | | } |
| | | |
| | | /** |
| | | * NFC 读M1å¡æåº |
| | | * @param {number} taskFlg 任塿 å¿ï¼ |
| | | * 0x00->AUTO åç¥æ«ç å¨è¯¥æä»¤å¯åç¬æ§è¡ï¼æ æä»¤é´çä¾èµå
³ç³»ã |
| | | * 0x01->START åç¥æ«ç å¨å¼å§å¯¹å¡æä½æå¯¹å¡æä½å°æªç»æï¼ä¸æä»¤é´å¯è½åå¨ä¾èµå
³ç³»ã |
| | | * 0x02->FINISH åç¥æ«ç 卿¬æ¡æä»¤æ¯æä½å¡çæå䏿¡æä»¤ï¼å°å¡çæä½ç¯å¢æ¢å¤å°é»æã |
| | | * @param {number} secNum æåºå· |
| | | * @param {number} logicBlkNum åå·ï¼å¨æåºå
çé»è¾å·0~3) |
| | | * @param {number} blkNums åæ° |
| | | * @param {array} key å¯é¥, é¿åº¦6bytes |
| | | * @param {number} keyType å¯é¥ç±»å: A:0x60 B:0x61 |
| | | * @returns Array 读åç»æ undefined:失败 |
| | | */ |
| | | nfc.m1cardReadSector = function (taskFlg, secNum, logicBlkNum, blkNums, key, keyType) { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | _validate('m1cardReadSector', taskFlg, secNum, logicBlkNum, blkNums, key, keyType, ' ') |
| | | return nfcObj.m1cardReadSector(pointer, taskFlg, secNum, logicBlkNum, blkNums, key, keyType); |
| | | } |
| | | |
| | | /** |
| | | * NFC 读M1å¡æåº |
| | | * @param {number} taskFlg 任塿 å¿ï¼ |
| | | * 0x00->AUTO åç¥æ«ç å¨è¯¥æä»¤å¯åç¬æ§è¡ï¼æ æä»¤é´çä¾èµå
³ç³»ã |
| | | * 0x01->START åç¥æ«ç å¨å¼å§å¯¹å¡æä½æå¯¹å¡æä½å°æªç»æï¼ä¸æä»¤é´å¯è½åå¨ä¾èµå
³ç³»ã |
| | | * 0x02->FINISH åç¥æ«ç 卿¬æ¡æä»¤æ¯æä½å¡çæå䏿¡æä»¤ï¼å°å¡çæä½ç¯å¢æ¢å¤å°é»æã |
| | | * @param {number} secNum æåºå· |
| | | * @param {number} logicBlkNum åå·ï¼å¨æåºå
çé»è¾å·0~3) |
| | | * @param {number} blkNums åæ° |
| | | * @param {array} key å¯é¥, é¿åº¦6bytes |
| | | * @param {number} keyType å¯é¥ç±»å: A:0x60 B:0x61 |
| | | * @param {array} data åå
¥æ°æ® |
| | | * @returns int åå
¥é¿åº¦ -1:é误 |
| | | */ |
| | | nfc.m1cardWriteSector = function (taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data) { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | _validate('m1cardWriteSector', taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data) |
| | | return nfcObj.m1cardWriteSector(pointer, taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data); |
| | | } |
| | | |
| | | /** |
| | | * |
| | | * @param {number} taskFlg 任塿 å¿ï¼ |
| | | * 0x00->AUTO åç¥æ«ç å¨è¯¥æä»¤å¯åç¬æ§è¡ï¼æ æä»¤é´çä¾èµå
³ç³»ã |
| | | * 0x01->START åç¥æ«ç å¨å¼å§å¯¹å¡æä½æå¯¹å¡æä½å°æªç»æï¼ä¸æä»¤é´å¯è½åå¨ä¾èµå
³ç³»ã |
| | | * 0x02->FINISH åç¥æ«ç 卿¬æ¡æä»¤æ¯æä½å¡çæå䏿¡æä»¤ï¼å°å¡çæä½ç¯å¢æ¢å¤å°é»æã |
| | | * @param {number} blkNums åå· |
| | | * @param {array} key å¯é¥, é¿åº¦6bytes |
| | | * @param {number} keyType å¯é¥ç±»å: A:0x60 B:0x61 |
| | | * @returns Array 读åç»æ undefined:失败 |
| | | */ |
| | | nfc.m1cardReadBlk = function (taskFlg, blkNum, key, keyType) { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | _validate('m1cardReadBlk', taskFlg, 1, 0, blkNum, key, keyType, ' ') |
| | | return nfcObj.m1cardReadBlk(pointer, taskFlg, blkNum, key, keyType); |
| | | } |
| | | |
| | | /** |
| | | * |
| | | * @param {number} taskFlg 任塿 å¿ï¼ |
| | | * 0x00->AUTO åç¥æ«ç å¨è¯¥æä»¤å¯åç¬æ§è¡ï¼æ æä»¤é´çä¾èµå
³ç³»ã |
| | | * 0x01->START åç¥æ«ç å¨å¼å§å¯¹å¡æä½æå¯¹å¡æä½å°æªç»æï¼ä¸æä»¤é´å¯è½åå¨ä¾èµå
³ç³»ã |
| | | * 0x02->FINISH åç¥æ«ç 卿¬æ¡æä»¤æ¯æä½å¡çæå䏿¡æä»¤ï¼å°å¡çæä½ç¯å¢æ¢å¤å°é»æã |
| | | * @param {number} blkNums åå· |
| | | * @param {array} key å¯é¥, é¿åº¦6bytes |
| | | * @param {number} keyType å¯é¥ç±»å: A:0x60 B:0x61 |
| | | * @param {array} data åå
¥æ°æ® |
| | | * @returns int åå
¥é¿åº¦ -1:é误 |
| | | */ |
| | | nfc.m1cardWriteBlk = function (taskFlg, blkNum, key, keyType, data) { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | _validate('m1cardWriteBlk', taskFlg, 1, 0, blkNum, key, keyType, data) |
| | | return nfcObj.m1cardWriteBlk(pointer, taskFlg, blkNum, key, keyType, data); |
| | | } |
| | | /** |
| | | * ATSæ£æµ |
| | | */ |
| | | nfc.nfc_iso14443_type_a_get_ats = function () { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | return nfcObj.nfc_iso14443_type_a_get_ats(pointer) |
| | | } |
| | | |
| | | /** |
| | | * |
| | | * @param {number} taskFlg 任塿 å¿ï¼ |
| | | * 0x00->AUTO åç¥æ«ç å¨è¯¥æä»¤å¯åç¬æ§è¡ï¼æ æä»¤é´çä¾èµå
³ç³»ã |
| | | * 0x01->START åç¥æ«ç å¨å¼å§å¯¹å¡æä½æå¯¹å¡æä½å°æªç»æï¼ä¸æä»¤é´å¯è½åå¨ä¾èµå
³ç³»ã |
| | | * 0x02->FINISH åç¥æ«ç 卿¬æ¡æä»¤æ¯æä½å¡çæå䏿¡æä»¤ï¼å°å¡çæä½ç¯å¢æ¢å¤å°é»æã |
| | | * @param {ArrayBuffer} buffer è¦åéçæ°æ® |
| | | * @param {number} bufferLen è¦åéçæ°æ®é¿åº¦ |
| | | * @returns buffer |
| | | */ |
| | | nfc.iso14443Apdu = function (taskFlg, buffer, bufferLen) { |
| | | let pointer = dxCommon.handleId("nfc", "nfcid") |
| | | return nfcObj.iso14443Apdu(pointer, taskFlg, buffer, bufferLen); |
| | | } |
| | | |
| | | /** |
| | | * PSAMå¡æçµ |
| | | */ |
| | | nfc.nfcPsamPowerDown = function () { |
| | | let pointer = dxCommon.handleId("nfc", "nfcid") |
| | | return nfcObj.nfcPsamPowerDown(pointer); |
| | | } |
| | | |
| | | /** |
| | | * NFC æ¹åç¶æ |
| | | */ |
| | | nfc.nfcPsamChangeBaud = function () { |
| | | let pointer = dxCommon.handleId("nfc", "nfcid") |
| | | return nfcObj.nfcPsamChangeBaud(pointer); |
| | | } |
| | | |
| | | /** |
| | | * PSAMå¡éç½® |
| | | */ |
| | | nfc.nfcPsamCardReset = function (force) { |
| | | let pointer = dxCommon.handleId("nfc", "nfcid") |
| | | return nfcObj.nfcPsamCardReset(pointer, force); |
| | | } |
| | | |
| | | /** |
| | | * åéPSAM APDUæä»¤ |
| | | */ |
| | | nfc.nfcPsamCardApdu = function (buffer) { |
| | | let pointer = dxCommon.handleId("nfc", "nfcid") |
| | | return nfcObj.nfcPsamCardApdu(pointer, buffer); |
| | | } |
| | | |
| | | /** |
| | | * EID æ´æ°äºè¯é
ç½® |
| | | * @param {object} eidConfig äºè¯é
ç½® |
| | | * @param {string} eidConfig.appid å¹³å°åé
ç»åºç¨çappid |
| | | * @param {number} eidConfig.read_len; // 忬¡è¯»å¡é¿åº¦ï¼é»è®¤0x80 |
| | | * @param {number} eidConfig.declevel; // æ¯å¦è¯»åç
§çï¼1为ä¸è¯»åï¼2为读å |
| | | * @param {number} eidConfig.loglevel; //æ¥å¿çº§å«ï¼æ¯æ0ï¼1ï¼2 |
| | | * @param {number} eidConfig.model; // æ¯å¦ç´æ¥æ¥åºä¿¡æ¯ 0æ¯ 1å¦ ï¼å³0æ¯åè·¯è¿åï¼è¿å身份信æ¯ï¼1æ¯è½¬åï¼è¿åreqidï¼ |
| | | * @param {number} eidConfig.type; // å¡çç±»åï¼0 èº«ä»½è¯ 1çµåè¯ç
§ |
| | | * @param {number} eidConfig.pic_type; // ç
§çè§£ç æ°æ®ç±»å 0 wlt 1 jpg |
| | | * @param {number} eidConfig.envCode; // ç¯å¢è¯å«ç |
| | | * @param {string} eidConfig.sn[128]; // 设å¤åºåå· |
| | | * @param {string} eidConfig.device_model[128]; // 设å¤åå· |
| | | * @param {number} eidConfig.info_type; // ä¿¡æ¯è¿åç±»åï¼0 身份信æ¯ç»æä½ ï¼1åå§æ°æ® char |
| | | */ |
| | | nfc.eidUpdateConfig = function (eidConfig) { |
| | | if (eidConfig == null) { |
| | | throw new Error("eidUpdateConfig:eidConfig should not be null or empty") |
| | | } |
| | | return nfcObj.eidUpdateConfig(eidConfig); |
| | | } |
| | | |
| | | /** |
| | | * 读NTAGçæ¬å· |
| | | * @param {number} hdl nfc奿 |
| | | * @returns {ArrayBuffer} buffer |
| | | */ |
| | | nfc.nfcNtagReadVersion = function () { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | return nfcObj.nfcNtagReadVersion(pointer); |
| | | } |
| | | |
| | | /** |
| | | * 读NTAG页å
容 åºå®è¯»å4页å
±16åè |
| | | * @param {number} hdl nfc奿 |
| | | * @param {number} pageNum èµ·å§é¡µå°åï¼ |
| | | * æ¯æ¬¡è¯»åå个页 |
| | | * 妿å°å(Addr)æ¯04hï¼åè¿å页04hã05hã06hã07hå
容 |
| | | * @returns {ArrayBuffer} buffer |
| | | */ |
| | | nfc.nfcNtagReadPage = function (pageNum) { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | if (pageNum == null) { |
| | | throw new Error("nfcNtagReadPage:pageNum should not be null or empty") |
| | | } |
| | | return nfcObj.nfcNtagReadPage(pointer, pageNum); |
| | | } |
| | | |
| | | /** |
| | | * 读NTAGå¤é¡µå
容 è¯»åæ°æ®çbuffer,æå°ä¸º 页æ°*4ï¼è¦è¯»åçæ°æ®é¿åº¦ 页æ°*4 |
| | | * @param {number} hdl nfc奿 |
| | | * @param {number} start_addr èµ·å§é¡µå°å |
| | | * @param {number} end_addr ç»æé¡µå°å |
| | | * @returns {ArrayBuffer} buffer |
| | | */ |
| | | nfc.nfcNtagFastReadPage = function (start_page, end_page) { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | if (start_page == null) { |
| | | throw new Error("nfcNtagFastReadPage:start_page should not be null or empty") |
| | | } |
| | | if (end_page == null) { |
| | | throw new Error("nfcNtagFastReadPage:end_page should not be null or empty") |
| | | } |
| | | return nfcObj.nfcNtagFastReadPage(pointer, start_page, end_page); |
| | | } |
| | | |
| | | /** |
| | | * åNTAG页å
容 |
| | | * @param {number} hdl nfc奿 |
| | | * @param {number} pageNum åå
¥çé¡µå· ï¼ææAddråæ° |
| | | * 对äºNTAG213ï¼é¡µå°å02hè³2Ch |
| | | * 对äºNTAG215ï¼é¡µå°å02hè³86h |
| | | * 对äºNTAG216ï¼é¡µå°å02hè³E6h |
| | | * @param {ArrayBuffer} pageData åå
¥é¡µçå
容ï¼ååè |
| | | * @returns {boolean} ture/false |
| | | */ |
| | | nfc.nfcNtagWritePage = function (pageNum, pageData) { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | if (pageNum == null) { |
| | | throw new Error("nfcNtagWritePage:pageNum should not be null or empty") |
| | | } |
| | | if (!pageData) { |
| | | throw new Error("nfcNtagWritePage:pageData should not be null or empty") |
| | | } |
| | | return nfcObj.nfcNtagWritePage(pointer, pageNum, pageData); |
| | | } |
| | | |
| | | /** |
| | | * 夿nfcæ¶æ¯é忝å¦ä¸ºç©º |
| | | * @returns bool |
| | | */ |
| | | nfc.msgIsEmpty = function () { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | return nfcObj.msgIsEmpty(pointer) |
| | | } |
| | | |
| | | /** |
| | | * ä»nfcæ¶æ¯éåä¸è¯»åæ°æ® |
| | | * @returns jsonæ¶æ¯å¯¹è±¡ |
| | | */ |
| | | nfc.msgReceive = function () { |
| | | let pointer = dxCommon.handleId("nfc", 'nfcid') |
| | | let msg = nfcObj.msgReceive(pointer) |
| | | return JSON.parse(msg); |
| | | } |
| | | |
| | | function _validate(fun, taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data) { |
| | | if (![0x00, 0x01, 0x02].includes(taskFlg)) { |
| | | throw new Error(fun, ":taskFlg error") |
| | | } |
| | | if (!(secNum >= 0)) { |
| | | throw new Error(fun, ":secNum error") |
| | | } |
| | | if (logicBlkNum == null || logicBlkNum == undefined || logicBlkNum < 0 || logicBlkNum > 3) { |
| | | throw new Error(fun, ":logicBlkNum error") |
| | | } |
| | | if (blkNums == null || blkNums == undefined || blkNums < 0 || blkNums > 59) { |
| | | throw new Error(fun, ":blkNums error") |
| | | } |
| | | if (key == null || key === undefined || key.length < 0) { |
| | | throw new Error(fun, ":key error") |
| | | } |
| | | if (![0x60, 0x61].includes(keyType)) { |
| | | throw new Error(fun, ":keyType error") |
| | | } |
| | | if (data === null || data === undefined) { |
| | | throw new Error(fun, ":data error") |
| | | } |
| | | } |
| | | |
| | | nfc.RECEIVE_MSG = '__nfc__MsgReceive' |
| | | |
| | | /** |
| | | * ç®åNFCç»ä»¶ç使ç¨ï¼æ é轮询å»è·åç½ç»ç¶æï¼ç½ç»çç¶æä¼éè¿eventcenteråéåºå» |
| | | * run åªä¼æ§è¡ä¸æ¬¡ï¼æ§è¡ä¹åç½ç»åºæ¬é
ç½®ä¸è½ä¿®æ¹ |
| | | * 妿éè¦å®æ¶è·åå·å¡æ°æ®ï¼å¯ä»¥è®¢é
eventCenterçäºä»¶ï¼äºä»¶çtopicæ¯nfc.CARDï¼äºä»¶çå
容æ¯ç±»ä¼¼ |
| | | * {id:'å¡id',card_type:å¡è¯çç±»å,id_len:å¡å·é¿åº¦,typeï¼å¡ç±»å,timestamp:'å·å¡æ¶é´æ³',monotonic_timestamp:'ç¸å¯¹å¼æºçæ¶é´'} |
| | | * @param {*} options |
| | | * @param {boolean} options.m1 éå¿
å¡«ï¼æ®éå¡åè°å¼å
³ |
| | | * @param {boolean} options.psam éå¿
å¡«ï¼psamå¡åè°å¼å
³ |
| | | */ |
| | | nfc.run = function (options) { |
| | | if (options === undefined || options.length === 0) { |
| | | throw new Error("dxnfc.run:'options' parameter should not be null or empty") |
| | | } |
| | | let init = map.get("__nfc__run_init") |
| | | if (!init) {//ç¡®ä¿åªåå§å䏿¬¡ |
| | | map.put("__nfc__run_init", options) |
| | | bus.newWorker("__nfc", '/app/code/dxmodules/nfcWorker.js') |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 妿nfcåç¬ä¸ä¸ªçº¿ç¨ï¼å¯ä»¥ç´æ¥ä½¿ç¨run彿°ï¼ä¼èªå¨å¯å¨ä¸ä¸ªçº¿ç¨ï¼ |
| | | * 妿æ³å å
¥å°å
¶ä»å·²æç线ç¨ï¼å¯ä»¥ä½¿ç¨ä»¥ä¸å°è£
ç彿° |
| | | */ |
| | | nfc.worker = { |
| | | //å¨while循ç¯å |
| | | beforeLoop: function (options) { |
| | | nfc.init(options.useEid) |
| | | // PSAMåæ®éå¡åè° |
| | | if (options.m1) { |
| | | nfc.cbRegister() |
| | | } |
| | | if (options.psam) { |
| | | nfc.psamCbRegister() |
| | | } |
| | | }, |
| | | //å¨while循ç¯é |
| | | loop: function () { |
| | | if (!nfc.msgIsEmpty()) { |
| | | let res = nfc.msgReceive(); |
| | | bus.fire(nfc.RECEIVE_MSG, res) |
| | | } |
| | | } |
| | | } |
| | | export default nfc; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * @file dxNfcCard.js |
| | | * @module dxNfcCard |
| | | * @description |
| | | * NFC module based on the native nfc_bridge C library. |
| | | * This module provides a singleton interface for interacting with NFC cards. |
| | | * It supports detecting, reading, and writing various basic NFC card types, |
| | | * including M1, CPU, and NTAG cards. |
| | | * |
| | | * Additionally, the module integrates eID (Chinese 2nd Generation ID card) reading functionality. |
| | | * **Note**: The eID feature requires a network connection and currently only supports Chinese 2nd Generation ID cards. |
| | | * |
| | | * @usage |
| | | * // 1. Import the module |
| | | * import { dxNfcCard } from 'dxNfcCard.js'; |
| | | * |
| | | * // 2. Initialize |
| | | * dxNfcCard.init(); |
| | | * |
| | | * // 3. (Optional) Initialize eID functionality |
| | | * dxNfcCard.eidInit({ |
| | | * config: { |
| | | * device_model: "your_device_model" |
| | | * } |
| | | * }); |
| | | * |
| | | * // 4. Set callbacks |
| | | * dxNfcCard.setCallbacks({ |
| | | * onCardDetected: (cardInfo) => { console.log('NFC Card:', cardInfo); }, |
| | | * onEidDetected: (eidInfo) => { console.log('eID Card:', eidInfo); } |
| | | * }); |
| | | * |
| | | * // 5. Poll for events in a timer |
| | | * setInterval(dxNfcCard.loop, 100); |
| | | * |
| | | * // 6. Call specific operations, e.g., read M1 block |
| | | * // const data = dxNfcCard.m1ReadBlock(...); |
| | | */ |
| | | import { nfc } from './libvbar-m-dxnfccard.so'; |
| | | |
| | | const dxNfcCard = {}; |
| | | |
| | | let _callbacks = {}; |
| | | |
| | | /** |
| | | * Initializes the NFC module. Must be called before any other operations. |
| | | * @returns {void} |
| | | */ |
| | | dxNfcCard.init = function () { |
| | | nfc.init(); |
| | | }; |
| | | |
| | | /** |
| | | * Deinitializes the NFC module and releases all resources. |
| | | * @returns {void} |
| | | */ |
| | | dxNfcCard.deinit = function () { |
| | | nfc.deinit(); |
| | | }; |
| | | |
| | | /** |
| | | * @typedef {object} NfcConfig |
| | | * @property {boolean} afi_enable - Enable Application Family Identifier. |
| | | * @property {number} afi - Application Family Identifier value. |
| | | * @property {number} card_protocol - Bitmask for card protocols to support. |
| | | * @property {boolean} identity_card_enable - Enable reading of identity cards. |
| | | * @property {number} read_timeout_ms - Read timeout in milliseconds. |
| | | * @property {number} braud_tx - TX baud rate. |
| | | * @property {number} braud_rx - RX baud rate. |
| | | * @property {boolean} i14443p4_switch - Enable ISO14443-4 protocol. |
| | | * @property {number} felica_braud - FeliCa baud rate. |
| | | * @property {number} nfc_sak28 - SAK value handling for specific cards. |
| | | * @property {number} felica_syscode - FeliCa system code. |
| | | * @property {number} felica_request_code - FeliCa request code. |
| | | */ |
| | | |
| | | /** |
| | | * Retrieves the current NFC configuration. |
| | | * @returns {NfcConfig} The current configuration object. |
| | | */ |
| | | dxNfcCard.getConfig = function () { |
| | | return nfc.getConfig(); |
| | | }; |
| | | |
| | | /** |
| | | * Updates the NFC configuration. |
| | | * Not neccecary to modify, use default values unless special requirements. |
| | | * @param {Partial<NfcConfig>} config - A configuration object with properties to update. |
| | | * @returns {void} |
| | | */ |
| | | dxNfcCard.updateConfig = function (config) { |
| | | return nfc.updateConfig(config); |
| | | }; |
| | | |
| | | /** |
| | | * Checks if a card is currently present in the NFC field. |
| | | * @returns {boolean} True if a card is present, false otherwise. |
| | | */ |
| | | dxNfcCard.isCardIn = function () { |
| | | return nfc.isCardIn(); |
| | | }; |
| | | |
| | | /** |
| | | * Reads a 16-byte block from an M1 card. |
| | | * @param {number} blockNumber - The block number to read (0-63 for 1K, 0-255 for 4K). |
| | | * @param {ArrayBuffer} key - A 6-byte ArrayBuffer containing the key (A or B). |
| | | * @param {number} keyType - The key type: 0x60 for Key A, 0x61 for Key B. |
| | | * @param {number} [taskFlag=0] - Optional task flag for card selection (0: AUTO, 1: ACTIVE, 2: IDLE). |
| | | * @returns {ArrayBuffer} A 16-byte ArrayBuffer containing the block data. |
| | | */ |
| | | dxNfcCard.m1ReadBlock = function (blockNumber, key, keyType, taskFlag = 0x00) { |
| | | return nfc.m1ReadBlock(blockNumber, key, keyType, taskFlag); |
| | | }; |
| | | |
| | | /** |
| | | * Writes a 16-byte block to an M1 card. |
| | | * @param {number} blockNumber - The block number to write. |
| | | * @param {ArrayBuffer} data - A 16-byte ArrayBuffer containing the data to write. |
| | | * @param {ArrayBuffer} key - A 6-byte ArrayBuffer containing the key (A or B). |
| | | * @param {number} keyType - The key type: 0x60 for Key A, 0x61 for Key B. |
| | | * @param {number} [taskFlag=0] - Optional task flag for card selection. |
| | | * @returns {number} 0 on success. |
| | | */ |
| | | dxNfcCard.m1WriteBlock = function (blockNumber, data, key, keyType, taskFlag = 0x00) { |
| | | return nfc.m1WriteBlock(blockNumber, data, key, keyType, taskFlag); |
| | | }; |
| | | |
| | | /** |
| | | * Reads one or more blocks from a sector of an M1 card. |
| | | * @param {number} sectorNum - The sector number to read from (0-39). |
| | | * @param {number} logicBlkNum - The starting block number within the sector (0-3 for small sectors, 0-15 for large sectors). |
| | | * @param {number} blkCount - The number of blocks to read. |
| | | * @param {ArrayBuffer} key - A 6-byte ArrayBuffer for authentication. |
| | | * @param {number} keyType - The key type (0x60 for Key A, 0x61 for Key B). |
| | | * @param {number} [taskFlag=0] - Optional task flag for card selection. |
| | | * @returns {ArrayBuffer} An ArrayBuffer containing the data read from the sector. |
| | | */ |
| | | dxNfcCard.m1ReadSector = function (sectorNum, logicBlkNum, blkCount, key, keyType, taskFlag = 0x00) { |
| | | return nfc.m1ReadSector(sectorNum, logicBlkNum, blkCount, key, keyType, taskFlag); |
| | | }; |
| | | |
| | | /** |
| | | * Writes one or more blocks to a sector of an M1 card. |
| | | * @param {number} sectorNum - The sector number to write to (0-39). |
| | | * @param {number} logicBlkNum - The starting block number within the sector. |
| | | * @param {ArrayBuffer} data - Data to write. The length must be a multiple of 16. The number of blocks to write is determined by data.length / 16. |
| | | * @param {ArrayBuffer} key - A 6-byte ArrayBuffer for authentication. |
| | | * @param {number} keyType - The key type (0x60 for Key A, 0x61 for Key B). |
| | | * @param {number} [taskFlag=0] - Optional task flag for card selection. |
| | | * @returns {number} The number of bytes written on success. |
| | | */ |
| | | dxNfcCard.m1WriteSector = function (sectorNum, logicBlkNum, data, key, keyType, taskFlag = 0x00) { |
| | | return nfc.m1WriteSector(sectorNum, logicBlkNum, data, key, keyType, taskFlag); |
| | | }; |
| | | |
| | | /** |
| | | * Reads the version information from an NTAG card. |
| | | * @returns {ArrayBuffer} An ArrayBuffer containing the version data. |
| | | */ |
| | | dxNfcCard.ntagReadVersion = function () { |
| | | return nfc.ntagReadVersion(); |
| | | }; |
| | | |
| | | /** |
| | | * Reads 4 pages (16 bytes) from an NTAG card, starting at the specified page number. |
| | | * @param {number} pageNum - The starting page number to read from. |
| | | * @returns {ArrayBuffer} A 16-byte ArrayBuffer containing the data from 4 pages. |
| | | */ |
| | | dxNfcCard.ntagReadPage = function (pageNum) { |
| | | return nfc.ntagReadPage(pageNum); |
| | | }; |
| | | |
| | | /** |
| | | * Writes one page (4 bytes) to an NTAG card. |
| | | * @param {number} pageNum - The page number to write to. |
| | | * @param {ArrayBuffer} data - A 4-byte ArrayBuffer containing the data to write. |
| | | * @returns {void} |
| | | */ |
| | | dxNfcCard.ntagWritePage = function (pageNum, data) { |
| | | return nfc.ntagWritePage(pageNum, data); |
| | | }; |
| | | |
| | | /** |
| | | * Reads a range of pages from an NTAG card quickly. |
| | | * @param {number} startPage - The starting page number. |
| | | * @param {number} endPage - The ending page number. |
| | | * @returns {ArrayBuffer} An ArrayBuffer containing the data from the specified page range. |
| | | */ |
| | | dxNfcCard.ntagFastReadPage = function (startPage, endPage) { |
| | | return nfc.ntagFastReadPage(startPage, endPage); |
| | | }; |
| | | |
| | | /** |
| | | * Sends an ISO14443-A APDU command to the card. |
| | | * @param {ArrayBuffer} command - The APDU command to send. |
| | | * @param {number} [taskFlag=0] - Optional task flag for card selection. |
| | | * @returns {ArrayBuffer} An ArrayBuffer containing the APDU response from the card. |
| | | */ |
| | | dxNfcCard.iso14443Apdu = function (command, taskFlag = 0x00) { |
| | | return nfc.iso14443Apdu(command, taskFlag); |
| | | }; |
| | | |
| | | /** |
| | | * Initializes the eID (electronic ID) reading functionality. |
| | | * After calling this, swiping a supported ID card will trigger the `onEidDetected` callback. |
| | | * This function requires an active network connection. |
| | | * @param {object} [options] - Configuration for the eID service. Can be omitted to use default values. |
| | | * @param {string} [options.ip="deviceid.dxiot.com"] - The IP address of the eID server. |
| | | * @param {number} [options.port=9889] - The port of the eID server. |
| | | * @param {object} options.config - Advanced eID parameters. |
| | | * @param {number} [options.config.read_len=54] - Read length per transaction, default is 0x36 (54). |
| | | * @param {number} [options.config.declevel=2] - Whether to read the photo (1: no, 2: yes). |
| | | * @param {number} [options.config.loglevel] - Log level (0, 1, or 2). |
| | | * @param {number} [options.config.model=0] - 0: return ID info, 1: return reqid for forwarding. |
| | | * @param {number} [options.config.type=0] - Card type (0: ID card, 1: e-license). |
| | | * @param {number} [options.config.pic_type=1] - Photo data type (0: wlt, 1: jpg). |
| | | * @param {number} [options.config.envCode=52302] - Environment code. |
| | | * @param {string} options.config.device_model - Device model. |
| | | * @param {number} [options.config.info_type=0] - Return type (0: struct, 1: raw data). |
| | | * @returns {void} |
| | | * @throws {Error} If required config properties are missing. |
| | | */ |
| | | dxNfcCard.eidInit = function (options = { ip: "deviceid.dxiot.com", port: 9889 }) { |
| | | if (!options.config || |
| | | typeof options.config.device_model !== 'string') { |
| | | throw new Error("eidInit requires options.config with string properties: device_model."); |
| | | } |
| | | return nfc.eidInit(options); |
| | | } |
| | | |
| | | /** |
| | | * Activates the eID module using an activation code and device information. |
| | | * This is typically done once to bind the device to the eID service. |
| | | * This function requires an active network connection. |
| | | * @param {object} options - Activation options. |
| | | * @param {string} options.codeMsg - The activation code message. |
| | | * @param {string} options.version - Firmware version. |
| | | * @param {string} options.macAddr - Device MAC address. |
| | | * @returns {number} 0 on success, negative value on failure. |
| | | * @throws {Error} If any of the required options are missing or invalid. |
| | | */ |
| | | dxNfcCard.eidActive = function (options) { |
| | | if (!options || |
| | | typeof options.codeMsg !== 'string' || |
| | | typeof options.version !== 'string' || |
| | | typeof options.macAddr !== 'string') { |
| | | throw new Error("eidActive requires an object with string properties: codeMsg, version, and macAddr."); |
| | | } |
| | | return nfc.eidActive(options); |
| | | } |
| | | |
| | | /** |
| | | * Deinitializes the eID functionality. |
| | | * @returns {void} |
| | | */ |
| | | dxNfcCard.eidDeinit = function () { |
| | | return nfc.eidDeinit(); |
| | | } |
| | | |
| | | /** |
| | | * Sets callback handlers for NFC events. |
| | | * @typedef {object} CardInfo |
| | | * @property {number} card_type - The type of the card. |
| | | * @property {string} id - The card's unique identifier as a hex string. |
| | | * @property {number} id_len - The length of the card's ID in bytes. |
| | | * @property {number} type - Detailed card type. |
| | | * @property {number} sak - SAK value (Select Acknowledge). |
| | | * @property {number} timestamp - The timestamp of the event (system time). |
| | | * @property {number} monotonic_timestamp - The monotonic timestamp of the event. |
| | | * |
| | | * @typedef {object} EidInfo |
| | | * @property {string} name - Full name. |
| | | * @property {string} sex - Sex / Gender. |
| | | * @property {string} nation - Ethnic group. |
| | | * @property {string} birthday - Date of birth (Format: YYYYMMDD). |
| | | * @property {string} address - Residential address. |
| | | * @property {string} idCardNo - Citizen identification number. |
| | | * @property {string} grantDept - Issuing authority. |
| | | * @property {string} userLifeBegin - Valid from date (Format: YYYYMMDD). |
| | | * @property {string} userLifeEnd - Valid until date (Format: YYYYMMDD or "é¿æ" for long-term). |
| | | * @property {string} picture - Base64 encoded string of the ID photo. |
| | | * |
| | | * @param {object} callbacks - An object containing callback functions. |
| | | * @param {function(cardInfo: CardInfo)} [callbacks.onCardDetected] - Called when a standard NFC card is detected. |
| | | * @param {function(eidInfo: EidInfo)} [callbacks.onEidDetected] - Called when an eID (ID card) is successfully read. |
| | | * @returns {void} |
| | | */ |
| | | dxNfcCard.setCallbacks = function (callbacks) { |
| | | _callbacks = callbacks; |
| | | }; |
| | | |
| | | /** |
| | | * Processes events from the NFC event queue. Should be called periodically (e.g., in setInterval). |
| | | * @example |
| | | * setInterval(() => { |
| | | * try { |
| | | * dxNfcCard.loop(); |
| | | * } catch (e) { |
| | | * logger.error('Error in NFC loop:', e); |
| | | * } |
| | | * }, 50); // Process events every 50ms |
| | | */ |
| | | dxNfcCard.loop = function () { |
| | | // Process regular card events |
| | | let card_ev = nfc.getEvent(); |
| | | if (card_ev && _callbacks.onCardDetected) { |
| | | _callbacks.onCardDetected(card_ev); |
| | | } |
| | | |
| | | // Process eID events |
| | | let eid_ev_str = nfc.getEidEvent(); |
| | | if (eid_ev_str && _callbacks.onEidDetected) { |
| | | const eid_info = JSON.parse(eid_ev_str); |
| | | _callbacks.onEidDetected(eid_info); |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * Gets the native NFC client object. |
| | | * @returns {object} The native client object. |
| | | */ |
| | | dxNfcCard.getNative = function () { |
| | | return nfc; |
| | | }; |
| | | |
| | | /** |
| | | * @readonly |
| | | * @enum {number} |
| | | * Enum for card types. |
| | | */ |
| | | dxNfcCard.CARD_TYPE = Object.freeze({ |
| | | /** Unspecified Type A protocol card */ |
| | | TYPE_A: 64, |
| | | /** Mifare Ultralight card */ |
| | | MIFARE_ULTRALIGHT: 65, |
| | | /** Mifare Classic EV1 1K (4-byte UID) */ |
| | | MIFARE_CLASSIC_1K_4B: 66, |
| | | /** Mifare Classic EV1 4K */ |
| | | MIFARE_CLASSIC_4K: 67, |
| | | /** CPU card (Type A protocol) */ |
| | | CPU_A: 68, |
| | | /** Mifare Desfire series */ |
| | | MIFARE_DESFIRE: 69, |
| | | /** Physical ID card (Type B protocol) */ |
| | | IDENTITY_CARD: 70, |
| | | /** ISO15693 protocol card (long-range IC card) */ |
| | | ISO15693: 71, |
| | | /** Unspecified Type B protocol card */ |
| | | TYPE_B: 74, |
| | | /** CPU card (Type B protocol) */ |
| | | CPU_B: 75, |
| | | /** Generic M1 card (sometimes synonymous with 66) */ |
| | | M1: 76, |
| | | /** Japanese Felica card (Sony standard) */ |
| | | FELICA: 77, |
| | | /** Mifare Plus series */ |
| | | MIFARE_PLUS: 78, |
| | | /** Also an ID card (sometimes an IDCard type read by the logical layer or CPU) */ |
| | | IDCARD: 97, |
| | | /** Unsupported or unrecognized card */ |
| | | NOT_SUPPORT: 127, |
| | | }); |
| | | |
| | | export default dxNfcCard; |
| vf107/dxmodules/dxNtp.js
vf107/dxmodules/dxOs.js
vf107/dxmodules/dxOta.js
vf107/dxmodules/dxPwm.js
vf107/dxmodules/dxQrRule.js
vf107/dxmodules/dxSqliteDB.js
vf107/dxmodules/dxStd.js
vf107/dxmodules/dxTimeZones.js
vf107/dxmodules/dxUart.js
vf107/dxmodules/dxVgBle.js
vf107/dxmodules/dxWatchdog.js
vf107/dxmodules/dxWorkerPool.js
vf107/dxmodules/libasound.so.2
vf107/dxmodules/libatopology.so.2
vf107/dxmodules/libpaho-mqtt3cs.so.1
vf107/dxmodules/libvbar-b-dxgpio.so
vf107/dxmodules/libvbar-b-dxpwm.so
vf107/dxmodules/libvbar-drv-audio_gain.so
vf107/dxmodules/libvbar-drv-capcal.so
vf107/dxmodules/libvbar-drv-capturer.so
vf107/dxmodules/libvbar-drv-display.so
vf107/dxmodules/libvbar-drv-face.so
vf107/dxmodules/libvbar-drv-gpio.so
vf107/dxmodules/libvbar-drv-memory.so
vf107/dxmodules/libvbar-drv-pwm.so
vf107/dxmodules/libvbar-drv-soc.so
vf107/dxmodules/libvbar-drv-tts.so
vf107/dxmodules/libvbar-drv-watchdog.so
vf107/dxmodules/libvbar-m-audio.so
vf107/dxmodules/libvbar-m-capturer.so
vf107/dxmodules/libvbar-m-channel.so
vf107/dxmodules/libvbar-m-common.so
vf107/dxmodules/libvbar-m-dxaudio.so
vf107/dxmodules/libvbar-m-dxchannel.so
vf107/dxmodules/libvbar-m-dxcommon.so
vf107/dxmodules/libvbar-m-dxcommonutils.so
vf107/dxmodules/libvbar-m-dxdisplay.so
vf107/dxmodules/libvbar-m-dxfacial.so
vf107/dxmodules/libvbar-m-dxhttpclient.so
vf107/dxmodules/libvbar-m-dxhttpserver.so
vf107/dxmodules/libvbar-m-dxkey.so
vf107/dxmodules/libvbar-m-dxmap.so
vf107/dxmodules/libvbar-m-dxmqttclient.so
vf107/dxmodules/libvbar-m-dxnetwork.so
vf107/dxmodules/libvbar-m-dxnfccard.so
vf107/dxmodules/libvbar-m-dxos.so
vf107/dxmodules/libvbar-m-dxsqlitedb.so
vf107/dxmodules/libvbar-m-dxuart.so
vf107/dxmodules/libvbar-m-dxwatchdog.so
vf107/dxmodules/libvbar-m-eid.so
vf107/dxmodules/libvbar-m-key.so
vf107/dxmodules/libvbar-m-net.so
vf107/dxmodules/libvbar-p-nfc.so
vf107/dxmodules/libzbar.so
vf107/dxmodules/vbar_version
vf107/dxmodules/vgUartWorker.js
vf107/dxmodules/zoneinfo/Africa/Abidjan
vf107/dxmodules/zoneinfo/Africa/Accra
vf107/dxmodules/zoneinfo/Africa/Addis_Ababa
vf107/dxmodules/zoneinfo/Africa/Algiers
vf107/dxmodules/zoneinfo/Africa/Asmara
vf107/dxmodules/zoneinfo/Africa/Asmera
vf107/dxmodules/zoneinfo/Africa/Bamako
vf107/dxmodules/zoneinfo/Africa/Bangui
vf107/dxmodules/zoneinfo/Africa/Banjul
vf107/dxmodules/zoneinfo/Africa/Bissau
vf107/dxmodules/zoneinfo/Africa/Blantyre
vf107/dxmodules/zoneinfo/Africa/Brazzaville
vf107/dxmodules/zoneinfo/Africa/Bujumbura
vf107/dxmodules/zoneinfo/Africa/Cairo
vf107/dxmodules/zoneinfo/Africa/Casablanca
vf107/dxmodules/zoneinfo/Africa/Ceuta
vf107/dxmodules/zoneinfo/Africa/Conakry
vf107/dxmodules/zoneinfo/Africa/Dakar
vf107/dxmodules/zoneinfo/Africa/Dar_es_Salaam
vf107/dxmodules/zoneinfo/Africa/Djibouti
vf107/dxmodules/zoneinfo/Africa/Douala
vf107/dxmodules/zoneinfo/Africa/El_Aaiun
vf107/dxmodules/zoneinfo/Africa/Freetown
vf107/dxmodules/zoneinfo/Africa/Gaborone
vf107/dxmodules/zoneinfo/Africa/Harare
vf107/dxmodules/zoneinfo/Africa/Johannesburg
vf107/dxmodules/zoneinfo/Africa/Juba
vf107/dxmodules/zoneinfo/Africa/Kampala
vf107/dxmodules/zoneinfo/Africa/Khartoum
vf107/dxmodules/zoneinfo/Africa/Kigali
vf107/dxmodules/zoneinfo/Africa/Kinshasa
vf107/dxmodules/zoneinfo/Africa/Lagos
vf107/dxmodules/zoneinfo/Africa/Libreville
vf107/dxmodules/zoneinfo/Africa/Lome
vf107/dxmodules/zoneinfo/Africa/Luanda
vf107/dxmodules/zoneinfo/Africa/Lubumbashi
vf107/dxmodules/zoneinfo/Africa/Lusaka
vf107/dxmodules/zoneinfo/Africa/Malabo
vf107/dxmodules/zoneinfo/Africa/Maputo
vf107/dxmodules/zoneinfo/Africa/Maseru
vf107/dxmodules/zoneinfo/Africa/Mbabane
vf107/dxmodules/zoneinfo/Africa/Mogadishu
vf107/dxmodules/zoneinfo/Africa/Monrovia
vf107/dxmodules/zoneinfo/Africa/Nairobi
vf107/dxmodules/zoneinfo/Africa/Ndjamena
vf107/dxmodules/zoneinfo/Africa/Niamey
vf107/dxmodules/zoneinfo/Africa/Nouakchott
vf107/dxmodules/zoneinfo/Africa/Ouagadougou
vf107/dxmodules/zoneinfo/Africa/Porto-Novo
vf107/dxmodules/zoneinfo/Africa/Sao_Tome
vf107/dxmodules/zoneinfo/Africa/Timbuktu
vf107/dxmodules/zoneinfo/Africa/Tripoli
vf107/dxmodules/zoneinfo/Africa/Tunis
vf107/dxmodules/zoneinfo/Africa/Windhoek
vf107/dxmodules/zoneinfo/America/Adak
vf107/dxmodules/zoneinfo/America/Anchorage
vf107/dxmodules/zoneinfo/America/Anguilla
vf107/dxmodules/zoneinfo/America/Antigua
vf107/dxmodules/zoneinfo/America/Araguaina
vf107/dxmodules/zoneinfo/America/Argentina/Buenos_Aires
vf107/dxmodules/zoneinfo/America/Argentina/Catamarca
vf107/dxmodules/zoneinfo/America/Argentina/ComodRivadavia
vf107/dxmodules/zoneinfo/America/Argentina/Cordoba
vf107/dxmodules/zoneinfo/America/Argentina/Jujuy
vf107/dxmodules/zoneinfo/America/Argentina/La_Rioja
vf107/dxmodules/zoneinfo/America/Argentina/Mendoza
vf107/dxmodules/zoneinfo/America/Argentina/Rio_Gallegos
vf107/dxmodules/zoneinfo/America/Argentina/Salta
vf107/dxmodules/zoneinfo/America/Argentina/San_Juan
vf107/dxmodules/zoneinfo/America/Argentina/San_Luis
vf107/dxmodules/zoneinfo/America/Argentina/Tucuman
vf107/dxmodules/zoneinfo/America/Argentina/Ushuaia
vf107/dxmodules/zoneinfo/America/Aruba
vf107/dxmodules/zoneinfo/America/Asuncion
vf107/dxmodules/zoneinfo/America/Atikokan
vf107/dxmodules/zoneinfo/America/Atka
vf107/dxmodules/zoneinfo/America/Bahia
vf107/dxmodules/zoneinfo/America/Bahia_Banderas
vf107/dxmodules/zoneinfo/America/Barbados
vf107/dxmodules/zoneinfo/America/Belem
vf107/dxmodules/zoneinfo/America/Belize
vf107/dxmodules/zoneinfo/America/Blanc-Sablon
vf107/dxmodules/zoneinfo/America/Boa_Vista
vf107/dxmodules/zoneinfo/America/Bogota
vf107/dxmodules/zoneinfo/America/Boise
vf107/dxmodules/zoneinfo/America/Buenos_Aires
vf107/dxmodules/zoneinfo/America/Cambridge_Bay
vf107/dxmodules/zoneinfo/America/Campo_Grande
vf107/dxmodules/zoneinfo/America/Cancun
vf107/dxmodules/zoneinfo/America/Caracas
vf107/dxmodules/zoneinfo/America/Catamarca
vf107/dxmodules/zoneinfo/America/Cayenne
vf107/dxmodules/zoneinfo/America/Cayman
vf107/dxmodules/zoneinfo/America/Chicago
vf107/dxmodules/zoneinfo/America/Chihuahua
vf107/dxmodules/zoneinfo/America/Coral_Harbour
vf107/dxmodules/zoneinfo/America/Cordoba
vf107/dxmodules/zoneinfo/America/Costa_Rica
vf107/dxmodules/zoneinfo/America/Creston
vf107/dxmodules/zoneinfo/America/Cuiaba
vf107/dxmodules/zoneinfo/America/Curacao
vf107/dxmodules/zoneinfo/America/Danmarkshavn
vf107/dxmodules/zoneinfo/America/Dawson
vf107/dxmodules/zoneinfo/America/Dawson_Creek
vf107/dxmodules/zoneinfo/America/Denver
vf107/dxmodules/zoneinfo/America/Detroit
vf107/dxmodules/zoneinfo/America/Dominica
vf107/dxmodules/zoneinfo/America/Edmonton
vf107/dxmodules/zoneinfo/America/Eirunepe
vf107/dxmodules/zoneinfo/America/El_Salvador
vf107/dxmodules/zoneinfo/America/Ensenada
vf107/dxmodules/zoneinfo/America/Fort_Nelson
vf107/dxmodules/zoneinfo/America/Fort_Wayne
vf107/dxmodules/zoneinfo/America/Fortaleza
vf107/dxmodules/zoneinfo/America/Glace_Bay
vf107/dxmodules/zoneinfo/America/Godthab
vf107/dxmodules/zoneinfo/America/Goose_Bay
vf107/dxmodules/zoneinfo/America/Grand_Turk
vf107/dxmodules/zoneinfo/America/Grenada
vf107/dxmodules/zoneinfo/America/Guadeloupe
vf107/dxmodules/zoneinfo/America/Guatemala
vf107/dxmodules/zoneinfo/America/Guayaquil
vf107/dxmodules/zoneinfo/America/Guyana
vf107/dxmodules/zoneinfo/America/Halifax
vf107/dxmodules/zoneinfo/America/Havana
vf107/dxmodules/zoneinfo/America/Hermosillo
vf107/dxmodules/zoneinfo/America/Indiana/Indianapolis
vf107/dxmodules/zoneinfo/America/Indiana/Knox
vf107/dxmodules/zoneinfo/America/Indiana/Marengo
vf107/dxmodules/zoneinfo/America/Indiana/Petersburg
vf107/dxmodules/zoneinfo/America/Indiana/Tell_City
vf107/dxmodules/zoneinfo/America/Indiana/Vevay
vf107/dxmodules/zoneinfo/America/Indiana/Vincennes
vf107/dxmodules/zoneinfo/America/Indiana/Winamac
vf107/dxmodules/zoneinfo/America/Indianapolis
vf107/dxmodules/zoneinfo/America/Inuvik
vf107/dxmodules/zoneinfo/America/Iqaluit
vf107/dxmodules/zoneinfo/America/Jamaica
vf107/dxmodules/zoneinfo/America/Jujuy
vf107/dxmodules/zoneinfo/America/Juneau
vf107/dxmodules/zoneinfo/America/Kentucky/Louisville
vf107/dxmodules/zoneinfo/America/Kentucky/Monticello
vf107/dxmodules/zoneinfo/America/Knox_IN
vf107/dxmodules/zoneinfo/America/Kralendijk
vf107/dxmodules/zoneinfo/America/La_Paz
vf107/dxmodules/zoneinfo/America/Lima
vf107/dxmodules/zoneinfo/America/Los_Angeles
vf107/dxmodules/zoneinfo/America/Louisville
vf107/dxmodules/zoneinfo/America/Lower_Princes
vf107/dxmodules/zoneinfo/America/Maceio
vf107/dxmodules/zoneinfo/America/Managua
vf107/dxmodules/zoneinfo/America/Manaus
vf107/dxmodules/zoneinfo/America/Marigot
vf107/dxmodules/zoneinfo/America/Martinique
vf107/dxmodules/zoneinfo/America/Matamoros
vf107/dxmodules/zoneinfo/America/Mazatlan
vf107/dxmodules/zoneinfo/America/Mendoza
vf107/dxmodules/zoneinfo/America/Menominee
vf107/dxmodules/zoneinfo/America/Merida
vf107/dxmodules/zoneinfo/America/Metlakatla
vf107/dxmodules/zoneinfo/America/Mexico_City
vf107/dxmodules/zoneinfo/America/Miquelon
vf107/dxmodules/zoneinfo/America/Moncton
vf107/dxmodules/zoneinfo/America/Monterrey
vf107/dxmodules/zoneinfo/America/Montevideo
vf107/dxmodules/zoneinfo/America/Montreal
vf107/dxmodules/zoneinfo/America/Montserrat
vf107/dxmodules/zoneinfo/America/Nassau
vf107/dxmodules/zoneinfo/America/New_York
vf107/dxmodules/zoneinfo/America/Nipigon
vf107/dxmodules/zoneinfo/America/Nome
vf107/dxmodules/zoneinfo/America/Noronha
vf107/dxmodules/zoneinfo/America/North_Dakota/Beulah
vf107/dxmodules/zoneinfo/America/North_Dakota/Center
vf107/dxmodules/zoneinfo/America/North_Dakota/New_Salem
vf107/dxmodules/zoneinfo/America/Nuuk
vf107/dxmodules/zoneinfo/America/Ojinaga
vf107/dxmodules/zoneinfo/America/Panama
vf107/dxmodules/zoneinfo/America/Pangnirtung
vf107/dxmodules/zoneinfo/America/Paramaribo
vf107/dxmodules/zoneinfo/America/Phoenix
vf107/dxmodules/zoneinfo/America/Port-au-Prince
vf107/dxmodules/zoneinfo/America/Port_of_Spain
vf107/dxmodules/zoneinfo/America/Porto_Acre
vf107/dxmodules/zoneinfo/America/Porto_Velho
vf107/dxmodules/zoneinfo/America/Puerto_Rico
vf107/dxmodules/zoneinfo/America/Punta_Arenas
vf107/dxmodules/zoneinfo/America/Rainy_River
vf107/dxmodules/zoneinfo/America/Rankin_Inlet
vf107/dxmodules/zoneinfo/America/Recife
vf107/dxmodules/zoneinfo/America/Regina
vf107/dxmodules/zoneinfo/America/Resolute
vf107/dxmodules/zoneinfo/America/Rio_Branco
vf107/dxmodules/zoneinfo/America/Rosario
vf107/dxmodules/zoneinfo/America/Santa_Isabel
vf107/dxmodules/zoneinfo/America/Santarem
vf107/dxmodules/zoneinfo/America/Santiago
vf107/dxmodules/zoneinfo/America/Santo_Domingo
vf107/dxmodules/zoneinfo/America/Sao_Paulo
vf107/dxmodules/zoneinfo/America/Scoresbysund
vf107/dxmodules/zoneinfo/America/Shiprock
vf107/dxmodules/zoneinfo/America/Sitka
vf107/dxmodules/zoneinfo/America/St_Barthelemy
vf107/dxmodules/zoneinfo/America/St_Johns
vf107/dxmodules/zoneinfo/America/St_Kitts
vf107/dxmodules/zoneinfo/America/St_Lucia
vf107/dxmodules/zoneinfo/America/St_Thomas
vf107/dxmodules/zoneinfo/America/St_Vincent
vf107/dxmodules/zoneinfo/America/Swift_Current
vf107/dxmodules/zoneinfo/America/Tegucigalpa
vf107/dxmodules/zoneinfo/America/Thule
vf107/dxmodules/zoneinfo/America/Thunder_Bay
vf107/dxmodules/zoneinfo/America/Tijuana
vf107/dxmodules/zoneinfo/America/Toronto
vf107/dxmodules/zoneinfo/America/Tortola
vf107/dxmodules/zoneinfo/America/Vancouver
vf107/dxmodules/zoneinfo/America/Virgin
vf107/dxmodules/zoneinfo/America/Whitehorse
vf107/dxmodules/zoneinfo/America/Winnipeg
vf107/dxmodules/zoneinfo/America/Yakutat
vf107/dxmodules/zoneinfo/America/Yellowknife
vf107/dxmodules/zoneinfo/Antarctica/Casey
vf107/dxmodules/zoneinfo/Antarctica/Davis
vf107/dxmodules/zoneinfo/Antarctica/DumontDUrville
vf107/dxmodules/zoneinfo/Antarctica/Macquarie
vf107/dxmodules/zoneinfo/Antarctica/Mawson
vf107/dxmodules/zoneinfo/Antarctica/McMurdo
vf107/dxmodules/zoneinfo/Antarctica/Palmer
vf107/dxmodules/zoneinfo/Antarctica/Rothera
vf107/dxmodules/zoneinfo/Antarctica/South_Pole
vf107/dxmodules/zoneinfo/Antarctica/Syowa
vf107/dxmodules/zoneinfo/Antarctica/Troll
vf107/dxmodules/zoneinfo/Antarctica/Vostok
vf107/dxmodules/zoneinfo/Arctic/Longyearbyen
vf107/dxmodules/zoneinfo/Asia/Aden
vf107/dxmodules/zoneinfo/Asia/Almaty
vf107/dxmodules/zoneinfo/Asia/Amman
vf107/dxmodules/zoneinfo/Asia/Anadyr
vf107/dxmodules/zoneinfo/Asia/Aqtau
vf107/dxmodules/zoneinfo/Asia/Aqtobe
vf107/dxmodules/zoneinfo/Asia/Ashgabat
vf107/dxmodules/zoneinfo/Asia/Ashkhabad
vf107/dxmodules/zoneinfo/Asia/Atyrau
vf107/dxmodules/zoneinfo/Asia/Baghdad
vf107/dxmodules/zoneinfo/Asia/Bahrain
vf107/dxmodules/zoneinfo/Asia/Baku
vf107/dxmodules/zoneinfo/Asia/Bangkok
vf107/dxmodules/zoneinfo/Asia/Barnaul
vf107/dxmodules/zoneinfo/Asia/Beirut
vf107/dxmodules/zoneinfo/Asia/Bishkek
vf107/dxmodules/zoneinfo/Asia/Brunei
vf107/dxmodules/zoneinfo/Asia/Calcutta
vf107/dxmodules/zoneinfo/Asia/Chita
vf107/dxmodules/zoneinfo/Asia/Choibalsan
vf107/dxmodules/zoneinfo/Asia/Chongqing
vf107/dxmodules/zoneinfo/Asia/Chungking
vf107/dxmodules/zoneinfo/Asia/Colombo
vf107/dxmodules/zoneinfo/Asia/Dacca
vf107/dxmodules/zoneinfo/Asia/Damascus
vf107/dxmodules/zoneinfo/Asia/Dhaka
vf107/dxmodules/zoneinfo/Asia/Dili
vf107/dxmodules/zoneinfo/Asia/Dubai
vf107/dxmodules/zoneinfo/Asia/Dushanbe
vf107/dxmodules/zoneinfo/Asia/Famagusta
vf107/dxmodules/zoneinfo/Asia/Gaza
vf107/dxmodules/zoneinfo/Asia/Harbin
vf107/dxmodules/zoneinfo/Asia/Hebron
vf107/dxmodules/zoneinfo/Asia/Ho_Chi_Minh
vf107/dxmodules/zoneinfo/Asia/Hong_Kong
vf107/dxmodules/zoneinfo/Asia/Hovd
vf107/dxmodules/zoneinfo/Asia/Irkutsk
vf107/dxmodules/zoneinfo/Asia/Istanbul
vf107/dxmodules/zoneinfo/Asia/Jakarta
vf107/dxmodules/zoneinfo/Asia/Jayapura
vf107/dxmodules/zoneinfo/Asia/Jerusalem
vf107/dxmodules/zoneinfo/Asia/Kabul
vf107/dxmodules/zoneinfo/Asia/Kamchatka
vf107/dxmodules/zoneinfo/Asia/Karachi
vf107/dxmodules/zoneinfo/Asia/Kashgar
vf107/dxmodules/zoneinfo/Asia/Kathmandu
vf107/dxmodules/zoneinfo/Asia/Katmandu
vf107/dxmodules/zoneinfo/Asia/Khandyga
vf107/dxmodules/zoneinfo/Asia/Kolkata
vf107/dxmodules/zoneinfo/Asia/Krasnoyarsk
vf107/dxmodules/zoneinfo/Asia/Kuala_Lumpur
vf107/dxmodules/zoneinfo/Asia/Kuching
vf107/dxmodules/zoneinfo/Asia/Kuwait
vf107/dxmodules/zoneinfo/Asia/Macao
vf107/dxmodules/zoneinfo/Asia/Macau
vf107/dxmodules/zoneinfo/Asia/Magadan
vf107/dxmodules/zoneinfo/Asia/Makassar
vf107/dxmodules/zoneinfo/Asia/Manila
vf107/dxmodules/zoneinfo/Asia/Muscat
vf107/dxmodules/zoneinfo/Asia/Nicosia
vf107/dxmodules/zoneinfo/Asia/Novokuznetsk
vf107/dxmodules/zoneinfo/Asia/Novosibirsk
vf107/dxmodules/zoneinfo/Asia/Omsk
vf107/dxmodules/zoneinfo/Asia/Oral
vf107/dxmodules/zoneinfo/Asia/Phnom_Penh
vf107/dxmodules/zoneinfo/Asia/Pontianak
vf107/dxmodules/zoneinfo/Asia/Pyongyang
vf107/dxmodules/zoneinfo/Asia/Qatar
vf107/dxmodules/zoneinfo/Asia/Qostanay
vf107/dxmodules/zoneinfo/Asia/Qyzylorda
vf107/dxmodules/zoneinfo/Asia/Rangoon
vf107/dxmodules/zoneinfo/Asia/Riyadh
vf107/dxmodules/zoneinfo/Asia/Saigon
vf107/dxmodules/zoneinfo/Asia/Sakhalin
vf107/dxmodules/zoneinfo/Asia/Samarkand
vf107/dxmodules/zoneinfo/Asia/Seoul
vf107/dxmodules/zoneinfo/Asia/Shanghai
vf107/dxmodules/zoneinfo/Asia/Singapore
vf107/dxmodules/zoneinfo/Asia/Srednekolymsk
vf107/dxmodules/zoneinfo/Asia/Taipei
vf107/dxmodules/zoneinfo/Asia/Tashkent
vf107/dxmodules/zoneinfo/Asia/Tbilisi
vf107/dxmodules/zoneinfo/Asia/Tehran
vf107/dxmodules/zoneinfo/Asia/Tel_Aviv
vf107/dxmodules/zoneinfo/Asia/Thimbu
vf107/dxmodules/zoneinfo/Asia/Thimphu
vf107/dxmodules/zoneinfo/Asia/Tokyo
vf107/dxmodules/zoneinfo/Asia/Tomsk
vf107/dxmodules/zoneinfo/Asia/Ujung_Pandang
vf107/dxmodules/zoneinfo/Asia/Ulaanbaatar
vf107/dxmodules/zoneinfo/Asia/Ulan_Bator
vf107/dxmodules/zoneinfo/Asia/Urumqi
vf107/dxmodules/zoneinfo/Asia/Ust-Nera
vf107/dxmodules/zoneinfo/Asia/Vientiane
vf107/dxmodules/zoneinfo/Asia/Vladivostok
vf107/dxmodules/zoneinfo/Asia/Yakutsk
vf107/dxmodules/zoneinfo/Asia/Yangon
vf107/dxmodules/zoneinfo/Asia/Yekaterinburg
vf107/dxmodules/zoneinfo/Asia/Yerevan
vf107/dxmodules/zoneinfo/Atlantic/Azores
vf107/dxmodules/zoneinfo/Atlantic/Bermuda
vf107/dxmodules/zoneinfo/Atlantic/Canary
vf107/dxmodules/zoneinfo/Atlantic/Cape_Verde
vf107/dxmodules/zoneinfo/Atlantic/Faeroe
vf107/dxmodules/zoneinfo/Atlantic/Faroe
vf107/dxmodules/zoneinfo/Atlantic/Jan_Mayen
vf107/dxmodules/zoneinfo/Atlantic/Madeira
vf107/dxmodules/zoneinfo/Atlantic/Reykjavik
vf107/dxmodules/zoneinfo/Atlantic/South_Georgia
vf107/dxmodules/zoneinfo/Atlantic/St_Helena
vf107/dxmodules/zoneinfo/Atlantic/Stanley
vf107/dxmodules/zoneinfo/Australia/ACT
vf107/dxmodules/zoneinfo/Australia/Adelaide
vf107/dxmodules/zoneinfo/Australia/Brisbane
vf107/dxmodules/zoneinfo/Australia/Broken_Hill
vf107/dxmodules/zoneinfo/Australia/Canberra
vf107/dxmodules/zoneinfo/Australia/Currie
vf107/dxmodules/zoneinfo/Australia/Darwin
vf107/dxmodules/zoneinfo/Australia/Eucla
vf107/dxmodules/zoneinfo/Australia/Hobart
vf107/dxmodules/zoneinfo/Australia/LHI
vf107/dxmodules/zoneinfo/Australia/Lindeman
vf107/dxmodules/zoneinfo/Australia/Lord_Howe
vf107/dxmodules/zoneinfo/Australia/Melbourne
vf107/dxmodules/zoneinfo/Australia/NSW
vf107/dxmodules/zoneinfo/Australia/North
vf107/dxmodules/zoneinfo/Australia/Perth
vf107/dxmodules/zoneinfo/Australia/Queensland
vf107/dxmodules/zoneinfo/Australia/South
vf107/dxmodules/zoneinfo/Australia/Sydney
vf107/dxmodules/zoneinfo/Australia/Tasmania
vf107/dxmodules/zoneinfo/Australia/Victoria
vf107/dxmodules/zoneinfo/Australia/West
vf107/dxmodules/zoneinfo/Australia/Yancowinna
vf107/dxmodules/zoneinfo/Brazil/Acre
vf107/dxmodules/zoneinfo/Brazil/DeNoronha
vf107/dxmodules/zoneinfo/Brazil/East
vf107/dxmodules/zoneinfo/Brazil/West
vf107/dxmodules/zoneinfo/CET
vf107/dxmodules/zoneinfo/CST6CDT
vf107/dxmodules/zoneinfo/Canada/Atlantic
vf107/dxmodules/zoneinfo/Canada/Central
vf107/dxmodules/zoneinfo/Canada/Eastern
vf107/dxmodules/zoneinfo/Canada/Mountain
vf107/dxmodules/zoneinfo/Canada/Newfoundland
vf107/dxmodules/zoneinfo/Canada/Pacific
vf107/dxmodules/zoneinfo/Canada/Saskatchewan
vf107/dxmodules/zoneinfo/Canada/Yukon
vf107/dxmodules/zoneinfo/Chile/Continental
vf107/dxmodules/zoneinfo/Chile/EasterIsland
vf107/dxmodules/zoneinfo/Cuba
vf107/dxmodules/zoneinfo/EET
vf107/dxmodules/zoneinfo/EST
vf107/dxmodules/zoneinfo/EST5EDT
vf107/dxmodules/zoneinfo/Egypt
vf107/dxmodules/zoneinfo/Eire
vf107/dxmodules/zoneinfo/Etc/GMT
vf107/dxmodules/zoneinfo/Etc/GMT+0
vf107/dxmodules/zoneinfo/Etc/GMT+1
vf107/dxmodules/zoneinfo/Etc/GMT+10
vf107/dxmodules/zoneinfo/Etc/GMT+11
vf107/dxmodules/zoneinfo/Etc/GMT+12
vf107/dxmodules/zoneinfo/Etc/GMT+2
vf107/dxmodules/zoneinfo/Etc/GMT+3
vf107/dxmodules/zoneinfo/Etc/GMT+4
vf107/dxmodules/zoneinfo/Etc/GMT+5
vf107/dxmodules/zoneinfo/Etc/GMT+6
vf107/dxmodules/zoneinfo/Etc/GMT+7
vf107/dxmodules/zoneinfo/Etc/GMT+8
vf107/dxmodules/zoneinfo/Etc/GMT+9
vf107/dxmodules/zoneinfo/Etc/GMT-0
vf107/dxmodules/zoneinfo/Etc/GMT-1
vf107/dxmodules/zoneinfo/Etc/GMT-10
vf107/dxmodules/zoneinfo/Etc/GMT-11
vf107/dxmodules/zoneinfo/Etc/GMT-12
vf107/dxmodules/zoneinfo/Etc/GMT-13
vf107/dxmodules/zoneinfo/Etc/GMT-14
vf107/dxmodules/zoneinfo/Etc/GMT-2
vf107/dxmodules/zoneinfo/Etc/GMT-3
vf107/dxmodules/zoneinfo/Etc/GMT-4
vf107/dxmodules/zoneinfo/Etc/GMT-5
vf107/dxmodules/zoneinfo/Etc/GMT-6
vf107/dxmodules/zoneinfo/Etc/GMT-7
vf107/dxmodules/zoneinfo/Etc/GMT-8
vf107/dxmodules/zoneinfo/Etc/GMT-9
vf107/dxmodules/zoneinfo/Etc/GMT0
vf107/dxmodules/zoneinfo/Etc/Greenwich
vf107/dxmodules/zoneinfo/Etc/UCT
vf107/dxmodules/zoneinfo/Etc/UTC
vf107/dxmodules/zoneinfo/Etc/Universal
vf107/dxmodules/zoneinfo/Etc/Zulu
vf107/dxmodules/zoneinfo/Europe/Amsterdam
vf107/dxmodules/zoneinfo/Europe/Andorra
vf107/dxmodules/zoneinfo/Europe/Astrakhan
vf107/dxmodules/zoneinfo/Europe/Athens
vf107/dxmodules/zoneinfo/Europe/Belfast
vf107/dxmodules/zoneinfo/Europe/Belgrade
vf107/dxmodules/zoneinfo/Europe/Berlin
vf107/dxmodules/zoneinfo/Europe/Bratislava
vf107/dxmodules/zoneinfo/Europe/Brussels
vf107/dxmodules/zoneinfo/Europe/Bucharest
vf107/dxmodules/zoneinfo/Europe/Budapest
vf107/dxmodules/zoneinfo/Europe/Busingen
vf107/dxmodules/zoneinfo/Europe/Chisinau
vf107/dxmodules/zoneinfo/Europe/Copenhagen
vf107/dxmodules/zoneinfo/Europe/Dublin
vf107/dxmodules/zoneinfo/Europe/Gibraltar
vf107/dxmodules/zoneinfo/Europe/Guernsey
vf107/dxmodules/zoneinfo/Europe/Helsinki
vf107/dxmodules/zoneinfo/Europe/Isle_of_Man
vf107/dxmodules/zoneinfo/Europe/Istanbul
vf107/dxmodules/zoneinfo/Europe/Jersey
vf107/dxmodules/zoneinfo/Europe/Kaliningrad
vf107/dxmodules/zoneinfo/Europe/Kiev
vf107/dxmodules/zoneinfo/Europe/Kirov
vf107/dxmodules/zoneinfo/Europe/Lisbon
vf107/dxmodules/zoneinfo/Europe/Ljubljana
vf107/dxmodules/zoneinfo/Europe/London
vf107/dxmodules/zoneinfo/Europe/Luxembourg
vf107/dxmodules/zoneinfo/Europe/Madrid
vf107/dxmodules/zoneinfo/Europe/Malta
vf107/dxmodules/zoneinfo/Europe/Mariehamn
vf107/dxmodules/zoneinfo/Europe/Minsk
vf107/dxmodules/zoneinfo/Europe/Monaco
vf107/dxmodules/zoneinfo/Europe/Moscow
vf107/dxmodules/zoneinfo/Europe/Nicosia
vf107/dxmodules/zoneinfo/Europe/Oslo
vf107/dxmodules/zoneinfo/Europe/Paris
vf107/dxmodules/zoneinfo/Europe/Podgorica
vf107/dxmodules/zoneinfo/Europe/Prague
vf107/dxmodules/zoneinfo/Europe/Riga
vf107/dxmodules/zoneinfo/Europe/Rome
vf107/dxmodules/zoneinfo/Europe/Samara
vf107/dxmodules/zoneinfo/Europe/San_Marino
vf107/dxmodules/zoneinfo/Europe/Sarajevo
vf107/dxmodules/zoneinfo/Europe/Saratov
vf107/dxmodules/zoneinfo/Europe/Simferopol
vf107/dxmodules/zoneinfo/Europe/Skopje
vf107/dxmodules/zoneinfo/Europe/Sofia
vf107/dxmodules/zoneinfo/Europe/Stockholm
vf107/dxmodules/zoneinfo/Europe/Tallinn
vf107/dxmodules/zoneinfo/Europe/Tirane
vf107/dxmodules/zoneinfo/Europe/Tiraspol
vf107/dxmodules/zoneinfo/Europe/Ulyanovsk
vf107/dxmodules/zoneinfo/Europe/Uzhgorod
vf107/dxmodules/zoneinfo/Europe/Vaduz
vf107/dxmodules/zoneinfo/Europe/Vatican
vf107/dxmodules/zoneinfo/Europe/Vienna
vf107/dxmodules/zoneinfo/Europe/Vilnius
vf107/dxmodules/zoneinfo/Europe/Volgograd
vf107/dxmodules/zoneinfo/Europe/Warsaw
vf107/dxmodules/zoneinfo/Europe/Zagreb
vf107/dxmodules/zoneinfo/Europe/Zaporozhye
vf107/dxmodules/zoneinfo/Europe/Zurich
vf107/dxmodules/zoneinfo/GB
vf107/dxmodules/zoneinfo/GB-Eire
vf107/dxmodules/zoneinfo/GMT
vf107/dxmodules/zoneinfo/GMT+0
vf107/dxmodules/zoneinfo/GMT-0
vf107/dxmodules/zoneinfo/GMT0
vf107/dxmodules/zoneinfo/Greenwich
vf107/dxmodules/zoneinfo/HST
vf107/dxmodules/zoneinfo/Hongkong
vf107/dxmodules/zoneinfo/Iceland
vf107/dxmodules/zoneinfo/Indian/Antananarivo
vf107/dxmodules/zoneinfo/Indian/Chagos
vf107/dxmodules/zoneinfo/Indian/Christmas
vf107/dxmodules/zoneinfo/Indian/Cocos
vf107/dxmodules/zoneinfo/Indian/Comoro
vf107/dxmodules/zoneinfo/Indian/Kerguelen
vf107/dxmodules/zoneinfo/Indian/Mahe
vf107/dxmodules/zoneinfo/Indian/Maldives
vf107/dxmodules/zoneinfo/Indian/Mauritius
vf107/dxmodules/zoneinfo/Indian/Mayotte
vf107/dxmodules/zoneinfo/Indian/Reunion
vf107/dxmodules/zoneinfo/Iran
vf107/dxmodules/zoneinfo/Israel
vf107/dxmodules/zoneinfo/Jamaica
vf107/dxmodules/zoneinfo/Japan
vf107/dxmodules/zoneinfo/Kwajalein
vf107/dxmodules/zoneinfo/Libya
vf107/dxmodules/zoneinfo/MET
vf107/dxmodules/zoneinfo/MST
vf107/dxmodules/zoneinfo/MST7MDT
vf107/dxmodules/zoneinfo/Mexico/BajaNorte
vf107/dxmodules/zoneinfo/Mexico/BajaSur
vf107/dxmodules/zoneinfo/Mexico/General
vf107/dxmodules/zoneinfo/NZ
vf107/dxmodules/zoneinfo/NZ-CHAT
vf107/dxmodules/zoneinfo/Navajo
vf107/dxmodules/zoneinfo/PRC
vf107/dxmodules/zoneinfo/PST8PDT
vf107/dxmodules/zoneinfo/Pacific/Apia
vf107/dxmodules/zoneinfo/Pacific/Auckland
vf107/dxmodules/zoneinfo/Pacific/Bougainville
vf107/dxmodules/zoneinfo/Pacific/Chatham
vf107/dxmodules/zoneinfo/Pacific/Chuuk
vf107/dxmodules/zoneinfo/Pacific/Easter
vf107/dxmodules/zoneinfo/Pacific/Efate
vf107/dxmodules/zoneinfo/Pacific/Enderbury
vf107/dxmodules/zoneinfo/Pacific/Fakaofo
vf107/dxmodules/zoneinfo/Pacific/Fiji
vf107/dxmodules/zoneinfo/Pacific/Funafuti
vf107/dxmodules/zoneinfo/Pacific/Galapagos
vf107/dxmodules/zoneinfo/Pacific/Gambier
vf107/dxmodules/zoneinfo/Pacific/Guadalcanal
vf107/dxmodules/zoneinfo/Pacific/Guam
vf107/dxmodules/zoneinfo/Pacific/Honolulu
vf107/dxmodules/zoneinfo/Pacific/Johnston
vf107/dxmodules/zoneinfo/Pacific/Kiritimati
vf107/dxmodules/zoneinfo/Pacific/Kosrae
vf107/dxmodules/zoneinfo/Pacific/Kwajalein
vf107/dxmodules/zoneinfo/Pacific/Majuro
vf107/dxmodules/zoneinfo/Pacific/Marquesas
vf107/dxmodules/zoneinfo/Pacific/Midway
vf107/dxmodules/zoneinfo/Pacific/Nauru
vf107/dxmodules/zoneinfo/Pacific/Niue
vf107/dxmodules/zoneinfo/Pacific/Norfolk
vf107/dxmodules/zoneinfo/Pacific/Noumea
vf107/dxmodules/zoneinfo/Pacific/Pago_Pago
vf107/dxmodules/zoneinfo/Pacific/Palau
vf107/dxmodules/zoneinfo/Pacific/Pitcairn
vf107/dxmodules/zoneinfo/Pacific/Pohnpei
vf107/dxmodules/zoneinfo/Pacific/Ponape
vf107/dxmodules/zoneinfo/Pacific/Port_Moresby
vf107/dxmodules/zoneinfo/Pacific/Rarotonga
vf107/dxmodules/zoneinfo/Pacific/Saipan
vf107/dxmodules/zoneinfo/Pacific/Samoa
vf107/dxmodules/zoneinfo/Pacific/Tahiti
vf107/dxmodules/zoneinfo/Pacific/Tarawa
vf107/dxmodules/zoneinfo/Pacific/Tongatapu
vf107/dxmodules/zoneinfo/Pacific/Truk
vf107/dxmodules/zoneinfo/Pacific/Wake
vf107/dxmodules/zoneinfo/Pacific/Wallis
vf107/dxmodules/zoneinfo/Pacific/Yap
vf107/dxmodules/zoneinfo/Poland
vf107/dxmodules/zoneinfo/Portugal
vf107/dxmodules/zoneinfo/ROC
vf107/dxmodules/zoneinfo/ROK
vf107/dxmodules/zoneinfo/Singapore
vf107/dxmodules/zoneinfo/Turkey
vf107/dxmodules/zoneinfo/UCT
vf107/dxmodules/zoneinfo/US/Alaska
vf107/dxmodules/zoneinfo/US/Aleutian
vf107/dxmodules/zoneinfo/US/Arizona
vf107/dxmodules/zoneinfo/US/Central
vf107/dxmodules/zoneinfo/US/East-Indiana
vf107/dxmodules/zoneinfo/US/Eastern
vf107/dxmodules/zoneinfo/US/Hawaii
vf107/dxmodules/zoneinfo/US/Indiana-Starke
vf107/dxmodules/zoneinfo/US/Michigan
vf107/dxmodules/zoneinfo/US/Mountain
vf107/dxmodules/zoneinfo/US/Pacific
vf107/dxmodules/zoneinfo/US/Samoa
vf107/dxmodules/zoneinfo/UTC
vf107/dxmodules/zoneinfo/Universal
vf107/dxmodules/zoneinfo/W-SU
vf107/dxmodules/zoneinfo/WET
vf107/dxmodules/zoneinfo/Zulu
vf107/dxmodules/zoneinfo/iso3166.tab
vf107/dxmodules/zoneinfo/leapseconds
vf107/dxmodules/zoneinfo/posix/Africa/Abidjan
vf107/dxmodules/zoneinfo/posix/Africa/Accra
vf107/dxmodules/zoneinfo/posix/Africa/Addis_Ababa
vf107/dxmodules/zoneinfo/posix/Africa/Algiers
vf107/dxmodules/zoneinfo/posix/Africa/Asmara
vf107/dxmodules/zoneinfo/posix/Africa/Asmera
vf107/dxmodules/zoneinfo/posix/Africa/Bamako
vf107/dxmodules/zoneinfo/posix/Africa/Bangui
vf107/dxmodules/zoneinfo/posix/Africa/Banjul
vf107/dxmodules/zoneinfo/posix/Africa/Bissau
vf107/dxmodules/zoneinfo/posix/Africa/Blantyre
vf107/dxmodules/zoneinfo/posix/Africa/Brazzaville
vf107/dxmodules/zoneinfo/posix/Africa/Bujumbura
vf107/dxmodules/zoneinfo/posix/Africa/Cairo
vf107/dxmodules/zoneinfo/posix/Africa/Casablanca
vf107/dxmodules/zoneinfo/posix/Africa/Ceuta
vf107/dxmodules/zoneinfo/posix/Africa/Conakry
vf107/dxmodules/zoneinfo/posix/Africa/Dakar
vf107/dxmodules/zoneinfo/posix/Africa/Dar_es_Salaam
vf107/dxmodules/zoneinfo/posix/Africa/Djibouti
vf107/dxmodules/zoneinfo/posix/Africa/Douala
vf107/dxmodules/zoneinfo/posix/Africa/El_Aaiun
vf107/dxmodules/zoneinfo/posix/Africa/Freetown
vf107/dxmodules/zoneinfo/posix/Africa/Gaborone
vf107/dxmodules/zoneinfo/posix/Africa/Harare
vf107/dxmodules/zoneinfo/posix/Africa/Johannesburg
vf107/dxmodules/zoneinfo/posix/Africa/Juba
vf107/dxmodules/zoneinfo/posix/Africa/Kampala
vf107/dxmodules/zoneinfo/posix/Africa/Khartoum
vf107/dxmodules/zoneinfo/posix/Africa/Kigali
vf107/dxmodules/zoneinfo/posix/Africa/Kinshasa
vf107/dxmodules/zoneinfo/posix/Africa/Lagos
vf107/dxmodules/zoneinfo/posix/Africa/Libreville
vf107/dxmodules/zoneinfo/posix/Africa/Lome
vf107/dxmodules/zoneinfo/posix/Africa/Luanda
vf107/dxmodules/zoneinfo/posix/Africa/Lubumbashi
vf107/dxmodules/zoneinfo/posix/Africa/Lusaka
vf107/dxmodules/zoneinfo/posix/Africa/Malabo
vf107/dxmodules/zoneinfo/posix/Africa/Maputo
vf107/dxmodules/zoneinfo/posix/Africa/Maseru
vf107/dxmodules/zoneinfo/posix/Africa/Mbabane
vf107/dxmodules/zoneinfo/posix/Africa/Mogadishu
vf107/dxmodules/zoneinfo/posix/Africa/Monrovia
vf107/dxmodules/zoneinfo/posix/Africa/Nairobi
vf107/dxmodules/zoneinfo/posix/Africa/Ndjamena
vf107/dxmodules/zoneinfo/posix/Africa/Niamey
vf107/dxmodules/zoneinfo/posix/Africa/Nouakchott
vf107/dxmodules/zoneinfo/posix/Africa/Ouagadougou
vf107/dxmodules/zoneinfo/posix/Africa/Porto-Novo
vf107/dxmodules/zoneinfo/posix/Africa/Sao_Tome
vf107/dxmodules/zoneinfo/posix/Africa/Timbuktu
vf107/dxmodules/zoneinfo/posix/Africa/Tripoli
vf107/dxmodules/zoneinfo/posix/Africa/Tunis
vf107/dxmodules/zoneinfo/posix/Africa/Windhoek
vf107/dxmodules/zoneinfo/posix/America/Adak
vf107/dxmodules/zoneinfo/posix/America/Anchorage
vf107/dxmodules/zoneinfo/posix/America/Anguilla
vf107/dxmodules/zoneinfo/posix/America/Antigua
vf107/dxmodules/zoneinfo/posix/America/Araguaina
vf107/dxmodules/zoneinfo/posix/America/Argentina/Buenos_Aires
vf107/dxmodules/zoneinfo/posix/America/Argentina/Catamarca
vf107/dxmodules/zoneinfo/posix/America/Argentina/ComodRivadavia
vf107/dxmodules/zoneinfo/posix/America/Argentina/Cordoba
vf107/dxmodules/zoneinfo/posix/America/Argentina/Jujuy
vf107/dxmodules/zoneinfo/posix/America/Argentina/La_Rioja
vf107/dxmodules/zoneinfo/posix/America/Argentina/Mendoza
vf107/dxmodules/zoneinfo/posix/America/Argentina/Rio_Gallegos
vf107/dxmodules/zoneinfo/posix/America/Argentina/Salta
vf107/dxmodules/zoneinfo/posix/America/Argentina/San_Juan
vf107/dxmodules/zoneinfo/posix/America/Argentina/San_Luis
vf107/dxmodules/zoneinfo/posix/America/Argentina/Tucuman
vf107/dxmodules/zoneinfo/posix/America/Argentina/Ushuaia
vf107/dxmodules/zoneinfo/posix/America/Aruba
vf107/dxmodules/zoneinfo/posix/America/Asuncion
vf107/dxmodules/zoneinfo/posix/America/Atikokan
vf107/dxmodules/zoneinfo/posix/America/Atka
vf107/dxmodules/zoneinfo/posix/America/Bahia
vf107/dxmodules/zoneinfo/posix/America/Bahia_Banderas
vf107/dxmodules/zoneinfo/posix/America/Barbados
vf107/dxmodules/zoneinfo/posix/America/Belem
vf107/dxmodules/zoneinfo/posix/America/Belize
vf107/dxmodules/zoneinfo/posix/America/Blanc-Sablon
vf107/dxmodules/zoneinfo/posix/America/Boa_Vista
vf107/dxmodules/zoneinfo/posix/America/Bogota
vf107/dxmodules/zoneinfo/posix/America/Boise
vf107/dxmodules/zoneinfo/posix/America/Buenos_Aires
vf107/dxmodules/zoneinfo/posix/America/Cambridge_Bay
vf107/dxmodules/zoneinfo/posix/America/Campo_Grande
vf107/dxmodules/zoneinfo/posix/America/Cancun
vf107/dxmodules/zoneinfo/posix/America/Caracas
vf107/dxmodules/zoneinfo/posix/America/Catamarca
vf107/dxmodules/zoneinfo/posix/America/Cayenne
vf107/dxmodules/zoneinfo/posix/America/Cayman
vf107/dxmodules/zoneinfo/posix/America/Chicago
vf107/dxmodules/zoneinfo/posix/America/Chihuahua
vf107/dxmodules/zoneinfo/posix/America/Coral_Harbour
vf107/dxmodules/zoneinfo/posix/America/Cordoba
vf107/dxmodules/zoneinfo/posix/America/Costa_Rica
vf107/dxmodules/zoneinfo/posix/America/Creston
vf107/dxmodules/zoneinfo/posix/America/Cuiaba
vf107/dxmodules/zoneinfo/posix/America/Curacao
vf107/dxmodules/zoneinfo/posix/America/Danmarkshavn
vf107/dxmodules/zoneinfo/posix/America/Dawson
vf107/dxmodules/zoneinfo/posix/America/Dawson_Creek
vf107/dxmodules/zoneinfo/posix/America/Denver
vf107/dxmodules/zoneinfo/posix/America/Detroit
vf107/dxmodules/zoneinfo/posix/America/Dominica
vf107/dxmodules/zoneinfo/posix/America/Edmonton
vf107/dxmodules/zoneinfo/posix/America/Eirunepe
vf107/dxmodules/zoneinfo/posix/America/El_Salvador
vf107/dxmodules/zoneinfo/posix/America/Ensenada
vf107/dxmodules/zoneinfo/posix/America/Fort_Nelson
vf107/dxmodules/zoneinfo/posix/America/Fort_Wayne
vf107/dxmodules/zoneinfo/posix/America/Fortaleza
vf107/dxmodules/zoneinfo/posix/America/Glace_Bay
vf107/dxmodules/zoneinfo/posix/America/Godthab
vf107/dxmodules/zoneinfo/posix/America/Goose_Bay
vf107/dxmodules/zoneinfo/posix/America/Grand_Turk
vf107/dxmodules/zoneinfo/posix/America/Grenada
vf107/dxmodules/zoneinfo/posix/America/Guadeloupe
vf107/dxmodules/zoneinfo/posix/America/Guatemala
vf107/dxmodules/zoneinfo/posix/America/Guayaquil
vf107/dxmodules/zoneinfo/posix/America/Guyana
vf107/dxmodules/zoneinfo/posix/America/Halifax
vf107/dxmodules/zoneinfo/posix/America/Havana
vf107/dxmodules/zoneinfo/posix/America/Hermosillo
vf107/dxmodules/zoneinfo/posix/America/Indiana/Indianapolis
vf107/dxmodules/zoneinfo/posix/America/Indiana/Knox
vf107/dxmodules/zoneinfo/posix/America/Indiana/Marengo
vf107/dxmodules/zoneinfo/posix/America/Indiana/Petersburg
vf107/dxmodules/zoneinfo/posix/America/Indiana/Tell_City
vf107/dxmodules/zoneinfo/posix/America/Indiana/Vevay
vf107/dxmodules/zoneinfo/posix/America/Indiana/Vincennes
vf107/dxmodules/zoneinfo/posix/America/Indiana/Winamac
vf107/dxmodules/zoneinfo/posix/America/Indianapolis
vf107/dxmodules/zoneinfo/posix/America/Inuvik
vf107/dxmodules/zoneinfo/posix/America/Iqaluit
vf107/dxmodules/zoneinfo/posix/America/Jamaica
vf107/dxmodules/zoneinfo/posix/America/Jujuy
vf107/dxmodules/zoneinfo/posix/America/Juneau
vf107/dxmodules/zoneinfo/posix/America/Kentucky/Louisville
vf107/dxmodules/zoneinfo/posix/America/Kentucky/Monticello
vf107/dxmodules/zoneinfo/posix/America/Knox_IN
vf107/dxmodules/zoneinfo/posix/America/Kralendijk
vf107/dxmodules/zoneinfo/posix/America/La_Paz
vf107/dxmodules/zoneinfo/posix/America/Lima
vf107/dxmodules/zoneinfo/posix/America/Los_Angeles
vf107/dxmodules/zoneinfo/posix/America/Louisville
vf107/dxmodules/zoneinfo/posix/America/Lower_Princes
vf107/dxmodules/zoneinfo/posix/America/Maceio
vf107/dxmodules/zoneinfo/posix/America/Managua
vf107/dxmodules/zoneinfo/posix/America/Manaus
vf107/dxmodules/zoneinfo/posix/America/Marigot
vf107/dxmodules/zoneinfo/posix/America/Martinique
vf107/dxmodules/zoneinfo/posix/America/Matamoros
vf107/dxmodules/zoneinfo/posix/America/Mazatlan
vf107/dxmodules/zoneinfo/posix/America/Mendoza
vf107/dxmodules/zoneinfo/posix/America/Menominee
vf107/dxmodules/zoneinfo/posix/America/Merida
vf107/dxmodules/zoneinfo/posix/America/Metlakatla
vf107/dxmodules/zoneinfo/posix/America/Mexico_City
vf107/dxmodules/zoneinfo/posix/America/Miquelon
vf107/dxmodules/zoneinfo/posix/America/Moncton
vf107/dxmodules/zoneinfo/posix/America/Monterrey
vf107/dxmodules/zoneinfo/posix/America/Montevideo
vf107/dxmodules/zoneinfo/posix/America/Montreal
vf107/dxmodules/zoneinfo/posix/America/Montserrat
vf107/dxmodules/zoneinfo/posix/America/Nassau
vf107/dxmodules/zoneinfo/posix/America/New_York
vf107/dxmodules/zoneinfo/posix/America/Nipigon
vf107/dxmodules/zoneinfo/posix/America/Nome
vf107/dxmodules/zoneinfo/posix/America/Noronha
vf107/dxmodules/zoneinfo/posix/America/North_Dakota/Beulah
vf107/dxmodules/zoneinfo/posix/America/North_Dakota/Center
vf107/dxmodules/zoneinfo/posix/America/North_Dakota/New_Salem
vf107/dxmodules/zoneinfo/posix/America/Nuuk
vf107/dxmodules/zoneinfo/posix/America/Ojinaga
vf107/dxmodules/zoneinfo/posix/America/Panama
vf107/dxmodules/zoneinfo/posix/America/Pangnirtung
vf107/dxmodules/zoneinfo/posix/America/Paramaribo
vf107/dxmodules/zoneinfo/posix/America/Phoenix
vf107/dxmodules/zoneinfo/posix/America/Port-au-Prince
vf107/dxmodules/zoneinfo/posix/America/Port_of_Spain
vf107/dxmodules/zoneinfo/posix/America/Porto_Acre
vf107/dxmodules/zoneinfo/posix/America/Porto_Velho
vf107/dxmodules/zoneinfo/posix/America/Puerto_Rico
vf107/dxmodules/zoneinfo/posix/America/Punta_Arenas
vf107/dxmodules/zoneinfo/posix/America/Rainy_River
vf107/dxmodules/zoneinfo/posix/America/Rankin_Inlet
vf107/dxmodules/zoneinfo/posix/America/Recife
vf107/dxmodules/zoneinfo/posix/America/Regina
vf107/dxmodules/zoneinfo/posix/America/Resolute
vf107/dxmodules/zoneinfo/posix/America/Rio_Branco
vf107/dxmodules/zoneinfo/posix/America/Rosario
vf107/dxmodules/zoneinfo/posix/America/Santa_Isabel
vf107/dxmodules/zoneinfo/posix/America/Santarem
vf107/dxmodules/zoneinfo/posix/America/Santiago
vf107/dxmodules/zoneinfo/posix/America/Santo_Domingo
vf107/dxmodules/zoneinfo/posix/America/Sao_Paulo
vf107/dxmodules/zoneinfo/posix/America/Scoresbysund
vf107/dxmodules/zoneinfo/posix/America/Shiprock
vf107/dxmodules/zoneinfo/posix/America/Sitka
vf107/dxmodules/zoneinfo/posix/America/St_Barthelemy
vf107/dxmodules/zoneinfo/posix/America/St_Johns
vf107/dxmodules/zoneinfo/posix/America/St_Kitts
vf107/dxmodules/zoneinfo/posix/America/St_Lucia
vf107/dxmodules/zoneinfo/posix/America/St_Thomas
vf107/dxmodules/zoneinfo/posix/America/St_Vincent
vf107/dxmodules/zoneinfo/posix/America/Swift_Current
vf107/dxmodules/zoneinfo/posix/America/Tegucigalpa
vf107/dxmodules/zoneinfo/posix/America/Thule
vf107/dxmodules/zoneinfo/posix/America/Thunder_Bay
vf107/dxmodules/zoneinfo/posix/America/Tijuana
vf107/dxmodules/zoneinfo/posix/America/Toronto
vf107/dxmodules/zoneinfo/posix/America/Tortola
vf107/dxmodules/zoneinfo/posix/America/Vancouver
vf107/dxmodules/zoneinfo/posix/America/Virgin
vf107/dxmodules/zoneinfo/posix/America/Whitehorse
vf107/dxmodules/zoneinfo/posix/America/Winnipeg
vf107/dxmodules/zoneinfo/posix/America/Yakutat
vf107/dxmodules/zoneinfo/posix/America/Yellowknife
vf107/dxmodules/zoneinfo/posix/Antarctica/Casey
vf107/dxmodules/zoneinfo/posix/Antarctica/Davis
vf107/dxmodules/zoneinfo/posix/Antarctica/DumontDUrville
vf107/dxmodules/zoneinfo/posix/Antarctica/Macquarie
vf107/dxmodules/zoneinfo/posix/Antarctica/Mawson
vf107/dxmodules/zoneinfo/posix/Antarctica/McMurdo
vf107/dxmodules/zoneinfo/posix/Antarctica/Palmer
vf107/dxmodules/zoneinfo/posix/Antarctica/Rothera
vf107/dxmodules/zoneinfo/posix/Antarctica/South_Pole
vf107/dxmodules/zoneinfo/posix/Antarctica/Syowa
vf107/dxmodules/zoneinfo/posix/Antarctica/Troll
vf107/dxmodules/zoneinfo/posix/Antarctica/Vostok
vf107/dxmodules/zoneinfo/posix/Arctic/Longyearbyen
vf107/dxmodules/zoneinfo/posix/Asia/Aden
vf107/dxmodules/zoneinfo/posix/Asia/Almaty
vf107/dxmodules/zoneinfo/posix/Asia/Amman
vf107/dxmodules/zoneinfo/posix/Asia/Anadyr
vf107/dxmodules/zoneinfo/posix/Asia/Aqtau
vf107/dxmodules/zoneinfo/posix/Asia/Aqtobe
vf107/dxmodules/zoneinfo/posix/Asia/Ashgabat
vf107/dxmodules/zoneinfo/posix/Asia/Ashkhabad
vf107/dxmodules/zoneinfo/posix/Asia/Atyrau
vf107/dxmodules/zoneinfo/posix/Asia/Baghdad
vf107/dxmodules/zoneinfo/posix/Asia/Bahrain
vf107/dxmodules/zoneinfo/posix/Asia/Baku
vf107/dxmodules/zoneinfo/posix/Asia/Bangkok
vf107/dxmodules/zoneinfo/posix/Asia/Barnaul
vf107/dxmodules/zoneinfo/posix/Asia/Beirut
vf107/dxmodules/zoneinfo/posix/Asia/Bishkek
vf107/dxmodules/zoneinfo/posix/Asia/Brunei
vf107/dxmodules/zoneinfo/posix/Asia/Calcutta
vf107/dxmodules/zoneinfo/posix/Asia/Chita
vf107/dxmodules/zoneinfo/posix/Asia/Choibalsan
vf107/dxmodules/zoneinfo/posix/Asia/Chongqing
vf107/dxmodules/zoneinfo/posix/Asia/Chungking
vf107/dxmodules/zoneinfo/posix/Asia/Colombo
vf107/dxmodules/zoneinfo/posix/Asia/Dacca
vf107/dxmodules/zoneinfo/posix/Asia/Damascus
vf107/dxmodules/zoneinfo/posix/Asia/Dhaka
vf107/dxmodules/zoneinfo/posix/Asia/Dili
vf107/dxmodules/zoneinfo/posix/Asia/Dubai
vf107/dxmodules/zoneinfo/posix/Asia/Dushanbe
vf107/dxmodules/zoneinfo/posix/Asia/Famagusta
vf107/dxmodules/zoneinfo/posix/Asia/Gaza
vf107/dxmodules/zoneinfo/posix/Asia/Harbin
vf107/dxmodules/zoneinfo/posix/Asia/Hebron
vf107/dxmodules/zoneinfo/posix/Asia/Ho_Chi_Minh
vf107/dxmodules/zoneinfo/posix/Asia/Hong_Kong
vf107/dxmodules/zoneinfo/posix/Asia/Hovd
vf107/dxmodules/zoneinfo/posix/Asia/Irkutsk
vf107/dxmodules/zoneinfo/posix/Asia/Istanbul
vf107/dxmodules/zoneinfo/posix/Asia/Jakarta
vf107/dxmodules/zoneinfo/posix/Asia/Jayapura
vf107/dxmodules/zoneinfo/posix/Asia/Jerusalem
vf107/dxmodules/zoneinfo/posix/Asia/Kabul
vf107/dxmodules/zoneinfo/posix/Asia/Kamchatka
vf107/dxmodules/zoneinfo/posix/Asia/Karachi
vf107/dxmodules/zoneinfo/posix/Asia/Kashgar
vf107/dxmodules/zoneinfo/posix/Asia/Kathmandu
vf107/dxmodules/zoneinfo/posix/Asia/Katmandu
vf107/dxmodules/zoneinfo/posix/Asia/Khandyga
vf107/dxmodules/zoneinfo/posix/Asia/Kolkata
vf107/dxmodules/zoneinfo/posix/Asia/Krasnoyarsk
vf107/dxmodules/zoneinfo/posix/Asia/Kuala_Lumpur
vf107/dxmodules/zoneinfo/posix/Asia/Kuching
vf107/dxmodules/zoneinfo/posix/Asia/Kuwait
vf107/dxmodules/zoneinfo/posix/Asia/Macao
vf107/dxmodules/zoneinfo/posix/Asia/Macau
vf107/dxmodules/zoneinfo/posix/Asia/Magadan
vf107/dxmodules/zoneinfo/posix/Asia/Makassar
vf107/dxmodules/zoneinfo/posix/Asia/Manila
vf107/dxmodules/zoneinfo/posix/Asia/Muscat
vf107/dxmodules/zoneinfo/posix/Asia/Nicosia
vf107/dxmodules/zoneinfo/posix/Asia/Novokuznetsk
vf107/dxmodules/zoneinfo/posix/Asia/Novosibirsk
vf107/dxmodules/zoneinfo/posix/Asia/Omsk
vf107/dxmodules/zoneinfo/posix/Asia/Oral
vf107/dxmodules/zoneinfo/posix/Asia/Phnom_Penh
vf107/dxmodules/zoneinfo/posix/Asia/Pontianak
vf107/dxmodules/zoneinfo/posix/Asia/Pyongyang
vf107/dxmodules/zoneinfo/posix/Asia/Qatar
vf107/dxmodules/zoneinfo/posix/Asia/Qostanay
vf107/dxmodules/zoneinfo/posix/Asia/Qyzylorda
vf107/dxmodules/zoneinfo/posix/Asia/Rangoon
vf107/dxmodules/zoneinfo/posix/Asia/Riyadh
vf107/dxmodules/zoneinfo/posix/Asia/Saigon
vf107/dxmodules/zoneinfo/posix/Asia/Sakhalin
vf107/dxmodules/zoneinfo/posix/Asia/Samarkand
vf107/dxmodules/zoneinfo/posix/Asia/Seoul
vf107/dxmodules/zoneinfo/posix/Asia/Shanghai
vf107/dxmodules/zoneinfo/posix/Asia/Singapore
vf107/dxmodules/zoneinfo/posix/Asia/Srednekolymsk
vf107/dxmodules/zoneinfo/posix/Asia/Taipei
vf107/dxmodules/zoneinfo/posix/Asia/Tashkent
vf107/dxmodules/zoneinfo/posix/Asia/Tbilisi
vf107/dxmodules/zoneinfo/posix/Asia/Tehran
vf107/dxmodules/zoneinfo/posix/Asia/Tel_Aviv
vf107/dxmodules/zoneinfo/posix/Asia/Thimbu
vf107/dxmodules/zoneinfo/posix/Asia/Thimphu
vf107/dxmodules/zoneinfo/posix/Asia/Tokyo
vf107/dxmodules/zoneinfo/posix/Asia/Tomsk
vf107/dxmodules/zoneinfo/posix/Asia/Ujung_Pandang
vf107/dxmodules/zoneinfo/posix/Asia/Ulaanbaatar
vf107/dxmodules/zoneinfo/posix/Asia/Ulan_Bator
vf107/dxmodules/zoneinfo/posix/Asia/Urumqi
vf107/dxmodules/zoneinfo/posix/Asia/Ust-Nera
vf107/dxmodules/zoneinfo/posix/Asia/Vientiane
vf107/dxmodules/zoneinfo/posix/Asia/Vladivostok
vf107/dxmodules/zoneinfo/posix/Asia/Yakutsk
vf107/dxmodules/zoneinfo/posix/Asia/Yangon
vf107/dxmodules/zoneinfo/posix/Asia/Yekaterinburg
vf107/dxmodules/zoneinfo/posix/Asia/Yerevan
vf107/dxmodules/zoneinfo/posix/Atlantic/Azores
vf107/dxmodules/zoneinfo/posix/Atlantic/Bermuda
vf107/dxmodules/zoneinfo/posix/Atlantic/Canary
vf107/dxmodules/zoneinfo/posix/Atlantic/Cape_Verde
vf107/dxmodules/zoneinfo/posix/Atlantic/Faeroe
vf107/dxmodules/zoneinfo/posix/Atlantic/Faroe
vf107/dxmodules/zoneinfo/posix/Atlantic/Jan_Mayen
vf107/dxmodules/zoneinfo/posix/Atlantic/Madeira
vf107/dxmodules/zoneinfo/posix/Atlantic/Reykjavik
vf107/dxmodules/zoneinfo/posix/Atlantic/South_Georgia
vf107/dxmodules/zoneinfo/posix/Atlantic/St_Helena
vf107/dxmodules/zoneinfo/posix/Atlantic/Stanley
vf107/dxmodules/zoneinfo/posix/Australia/ACT
vf107/dxmodules/zoneinfo/posix/Australia/Adelaide
vf107/dxmodules/zoneinfo/posix/Australia/Brisbane
vf107/dxmodules/zoneinfo/posix/Australia/Broken_Hill
vf107/dxmodules/zoneinfo/posix/Australia/Canberra
vf107/dxmodules/zoneinfo/posix/Australia/Currie
vf107/dxmodules/zoneinfo/posix/Australia/Darwin
vf107/dxmodules/zoneinfo/posix/Australia/Eucla
vf107/dxmodules/zoneinfo/posix/Australia/Hobart
vf107/dxmodules/zoneinfo/posix/Australia/LHI
vf107/dxmodules/zoneinfo/posix/Australia/Lindeman
vf107/dxmodules/zoneinfo/posix/Australia/Lord_Howe
vf107/dxmodules/zoneinfo/posix/Australia/Melbourne
vf107/dxmodules/zoneinfo/posix/Australia/NSW
vf107/dxmodules/zoneinfo/posix/Australia/North
vf107/dxmodules/zoneinfo/posix/Australia/Perth
vf107/dxmodules/zoneinfo/posix/Australia/Queensland
vf107/dxmodules/zoneinfo/posix/Australia/South
vf107/dxmodules/zoneinfo/posix/Australia/Sydney
vf107/dxmodules/zoneinfo/posix/Australia/Tasmania
vf107/dxmodules/zoneinfo/posix/Australia/Victoria
vf107/dxmodules/zoneinfo/posix/Australia/West
vf107/dxmodules/zoneinfo/posix/Australia/Yancowinna
vf107/dxmodules/zoneinfo/posix/Brazil/Acre
vf107/dxmodules/zoneinfo/posix/Brazil/DeNoronha
vf107/dxmodules/zoneinfo/posix/Brazil/East
vf107/dxmodules/zoneinfo/posix/Brazil/West
vf107/dxmodules/zoneinfo/posix/CET
vf107/dxmodules/zoneinfo/posix/CST6CDT
vf107/dxmodules/zoneinfo/posix/Canada/Atlantic
vf107/dxmodules/zoneinfo/posix/Canada/Central
vf107/dxmodules/zoneinfo/posix/Canada/Eastern
vf107/dxmodules/zoneinfo/posix/Canada/Mountain
vf107/dxmodules/zoneinfo/posix/Canada/Newfoundland
vf107/dxmodules/zoneinfo/posix/Canada/Pacific
vf107/dxmodules/zoneinfo/posix/Canada/Saskatchewan
vf107/dxmodules/zoneinfo/posix/Canada/Yukon
vf107/dxmodules/zoneinfo/posix/Chile/Continental
vf107/dxmodules/zoneinfo/posix/Chile/EasterIsland
vf107/dxmodules/zoneinfo/posix/Cuba
vf107/dxmodules/zoneinfo/posix/EET
vf107/dxmodules/zoneinfo/posix/EST
vf107/dxmodules/zoneinfo/posix/EST5EDT
vf107/dxmodules/zoneinfo/posix/Egypt
vf107/dxmodules/zoneinfo/posix/Eire
vf107/dxmodules/zoneinfo/posix/Etc/GMT
vf107/dxmodules/zoneinfo/posix/Etc/GMT+0
vf107/dxmodules/zoneinfo/posix/Etc/GMT+1
vf107/dxmodules/zoneinfo/posix/Etc/GMT+10
vf107/dxmodules/zoneinfo/posix/Etc/GMT+11
vf107/dxmodules/zoneinfo/posix/Etc/GMT+12
vf107/dxmodules/zoneinfo/posix/Etc/GMT+2
vf107/dxmodules/zoneinfo/posix/Etc/GMT+3
vf107/dxmodules/zoneinfo/posix/Etc/GMT+4
vf107/dxmodules/zoneinfo/posix/Etc/GMT+5
vf107/dxmodules/zoneinfo/posix/Etc/GMT+6
vf107/dxmodules/zoneinfo/posix/Etc/GMT+7
vf107/dxmodules/zoneinfo/posix/Etc/GMT+8
vf107/dxmodules/zoneinfo/posix/Etc/GMT+9
vf107/dxmodules/zoneinfo/posix/Etc/GMT-0
vf107/dxmodules/zoneinfo/posix/Etc/GMT-1
vf107/dxmodules/zoneinfo/posix/Etc/GMT-10
vf107/dxmodules/zoneinfo/posix/Etc/GMT-11
vf107/dxmodules/zoneinfo/posix/Etc/GMT-12
vf107/dxmodules/zoneinfo/posix/Etc/GMT-13
vf107/dxmodules/zoneinfo/posix/Etc/GMT-14
vf107/dxmodules/zoneinfo/posix/Etc/GMT-2
vf107/dxmodules/zoneinfo/posix/Etc/GMT-3
vf107/dxmodules/zoneinfo/posix/Etc/GMT-4
vf107/dxmodules/zoneinfo/posix/Etc/GMT-5
vf107/dxmodules/zoneinfo/posix/Etc/GMT-6
vf107/dxmodules/zoneinfo/posix/Etc/GMT-7
vf107/dxmodules/zoneinfo/posix/Etc/GMT-8
vf107/dxmodules/zoneinfo/posix/Etc/GMT-9
vf107/dxmodules/zoneinfo/posix/Etc/GMT0
vf107/dxmodules/zoneinfo/posix/Etc/Greenwich
vf107/dxmodules/zoneinfo/posix/Etc/UCT
vf107/dxmodules/zoneinfo/posix/Etc/UTC
vf107/dxmodules/zoneinfo/posix/Etc/Universal
vf107/dxmodules/zoneinfo/posix/Etc/Zulu
vf107/dxmodules/zoneinfo/posix/Europe/Amsterdam
vf107/dxmodules/zoneinfo/posix/Europe/Andorra
vf107/dxmodules/zoneinfo/posix/Europe/Astrakhan
vf107/dxmodules/zoneinfo/posix/Europe/Athens
vf107/dxmodules/zoneinfo/posix/Europe/Belfast
vf107/dxmodules/zoneinfo/posix/Europe/Belgrade
vf107/dxmodules/zoneinfo/posix/Europe/Berlin
vf107/dxmodules/zoneinfo/posix/Europe/Bratislava
vf107/dxmodules/zoneinfo/posix/Europe/Brussels
vf107/dxmodules/zoneinfo/posix/Europe/Bucharest
vf107/dxmodules/zoneinfo/posix/Europe/Budapest
vf107/dxmodules/zoneinfo/posix/Europe/Busingen
vf107/dxmodules/zoneinfo/posix/Europe/Chisinau
vf107/dxmodules/zoneinfo/posix/Europe/Copenhagen
vf107/dxmodules/zoneinfo/posix/Europe/Dublin
vf107/dxmodules/zoneinfo/posix/Europe/Gibraltar
vf107/dxmodules/zoneinfo/posix/Europe/Guernsey
vf107/dxmodules/zoneinfo/posix/Europe/Helsinki
vf107/dxmodules/zoneinfo/posix/Europe/Isle_of_Man
vf107/dxmodules/zoneinfo/posix/Europe/Istanbul
vf107/dxmodules/zoneinfo/posix/Europe/Jersey
vf107/dxmodules/zoneinfo/posix/Europe/Kaliningrad
vf107/dxmodules/zoneinfo/posix/Europe/Kiev
vf107/dxmodules/zoneinfo/posix/Europe/Kirov
vf107/dxmodules/zoneinfo/posix/Europe/Lisbon
vf107/dxmodules/zoneinfo/posix/Europe/Ljubljana
vf107/dxmodules/zoneinfo/posix/Europe/London
vf107/dxmodules/zoneinfo/posix/Europe/Luxembourg
vf107/dxmodules/zoneinfo/posix/Europe/Madrid
vf107/dxmodules/zoneinfo/posix/Europe/Malta
vf107/dxmodules/zoneinfo/posix/Europe/Mariehamn
vf107/dxmodules/zoneinfo/posix/Europe/Minsk
vf107/dxmodules/zoneinfo/posix/Europe/Monaco
vf107/dxmodules/zoneinfo/posix/Europe/Moscow
vf107/dxmodules/zoneinfo/posix/Europe/Nicosia
vf107/dxmodules/zoneinfo/posix/Europe/Oslo
vf107/dxmodules/zoneinfo/posix/Europe/Paris
vf107/dxmodules/zoneinfo/posix/Europe/Podgorica
vf107/dxmodules/zoneinfo/posix/Europe/Prague
vf107/dxmodules/zoneinfo/posix/Europe/Riga
vf107/dxmodules/zoneinfo/posix/Europe/Rome
vf107/dxmodules/zoneinfo/posix/Europe/Samara
vf107/dxmodules/zoneinfo/posix/Europe/San_Marino
vf107/dxmodules/zoneinfo/posix/Europe/Sarajevo
vf107/dxmodules/zoneinfo/posix/Europe/Saratov
vf107/dxmodules/zoneinfo/posix/Europe/Simferopol
vf107/dxmodules/zoneinfo/posix/Europe/Skopje
vf107/dxmodules/zoneinfo/posix/Europe/Sofia
vf107/dxmodules/zoneinfo/posix/Europe/Stockholm
vf107/dxmodules/zoneinfo/posix/Europe/Tallinn
vf107/dxmodules/zoneinfo/posix/Europe/Tirane
vf107/dxmodules/zoneinfo/posix/Europe/Tiraspol
vf107/dxmodules/zoneinfo/posix/Europe/Ulyanovsk
vf107/dxmodules/zoneinfo/posix/Europe/Uzhgorod
vf107/dxmodules/zoneinfo/posix/Europe/Vaduz
vf107/dxmodules/zoneinfo/posix/Europe/Vatican
vf107/dxmodules/zoneinfo/posix/Europe/Vienna
vf107/dxmodules/zoneinfo/posix/Europe/Vilnius
vf107/dxmodules/zoneinfo/posix/Europe/Volgograd
vf107/dxmodules/zoneinfo/posix/Europe/Warsaw
vf107/dxmodules/zoneinfo/posix/Europe/Zagreb
vf107/dxmodules/zoneinfo/posix/Europe/Zaporozhye
vf107/dxmodules/zoneinfo/posix/Europe/Zurich
vf107/dxmodules/zoneinfo/posix/GB
vf107/dxmodules/zoneinfo/posix/GB-Eire
vf107/dxmodules/zoneinfo/posix/GMT
vf107/dxmodules/zoneinfo/posix/GMT+0
vf107/dxmodules/zoneinfo/posix/GMT-0
vf107/dxmodules/zoneinfo/posix/GMT0
vf107/dxmodules/zoneinfo/posix/Greenwich
vf107/dxmodules/zoneinfo/posix/HST
vf107/dxmodules/zoneinfo/posix/Hongkong
vf107/dxmodules/zoneinfo/posix/Iceland
vf107/dxmodules/zoneinfo/posix/Indian/Antananarivo
vf107/dxmodules/zoneinfo/posix/Indian/Chagos
vf107/dxmodules/zoneinfo/posix/Indian/Christmas
vf107/dxmodules/zoneinfo/posix/Indian/Cocos
vf107/dxmodules/zoneinfo/posix/Indian/Comoro
vf107/dxmodules/zoneinfo/posix/Indian/Kerguelen
vf107/dxmodules/zoneinfo/posix/Indian/Mahe
vf107/dxmodules/zoneinfo/posix/Indian/Maldives
vf107/dxmodules/zoneinfo/posix/Indian/Mauritius
vf107/dxmodules/zoneinfo/posix/Indian/Mayotte
vf107/dxmodules/zoneinfo/posix/Indian/Reunion
vf107/dxmodules/zoneinfo/posix/Iran
vf107/dxmodules/zoneinfo/posix/Israel
vf107/dxmodules/zoneinfo/posix/Jamaica
vf107/dxmodules/zoneinfo/posix/Japan
vf107/dxmodules/zoneinfo/posix/Kwajalein
vf107/dxmodules/zoneinfo/posix/Libya
vf107/dxmodules/zoneinfo/posix/MET
vf107/dxmodules/zoneinfo/posix/MST
vf107/dxmodules/zoneinfo/posix/MST7MDT
vf107/dxmodules/zoneinfo/posix/Mexico/BajaNorte
vf107/dxmodules/zoneinfo/posix/Mexico/BajaSur
vf107/dxmodules/zoneinfo/posix/Mexico/General
vf107/dxmodules/zoneinfo/posix/NZ
vf107/dxmodules/zoneinfo/posix/NZ-CHAT
vf107/dxmodules/zoneinfo/posix/Navajo
vf107/dxmodules/zoneinfo/posix/PRC
vf107/dxmodules/zoneinfo/posix/PST8PDT
vf107/dxmodules/zoneinfo/posix/Pacific/Apia
vf107/dxmodules/zoneinfo/posix/Pacific/Auckland
vf107/dxmodules/zoneinfo/posix/Pacific/Bougainville
vf107/dxmodules/zoneinfo/posix/Pacific/Chatham
vf107/dxmodules/zoneinfo/posix/Pacific/Chuuk
vf107/dxmodules/zoneinfo/posix/Pacific/Easter
vf107/dxmodules/zoneinfo/posix/Pacific/Efate
vf107/dxmodules/zoneinfo/posix/Pacific/Enderbury
vf107/dxmodules/zoneinfo/posix/Pacific/Fakaofo
vf107/dxmodules/zoneinfo/posix/Pacific/Fiji
vf107/dxmodules/zoneinfo/posix/Pacific/Funafuti
vf107/dxmodules/zoneinfo/posix/Pacific/Galapagos
vf107/dxmodules/zoneinfo/posix/Pacific/Gambier
vf107/dxmodules/zoneinfo/posix/Pacific/Guadalcanal
vf107/dxmodules/zoneinfo/posix/Pacific/Guam
vf107/dxmodules/zoneinfo/posix/Pacific/Honolulu
vf107/dxmodules/zoneinfo/posix/Pacific/Johnston
vf107/dxmodules/zoneinfo/posix/Pacific/Kiritimati
vf107/dxmodules/zoneinfo/posix/Pacific/Kosrae
vf107/dxmodules/zoneinfo/posix/Pacific/Kwajalein
vf107/dxmodules/zoneinfo/posix/Pacific/Majuro
vf107/dxmodules/zoneinfo/posix/Pacific/Marquesas
vf107/dxmodules/zoneinfo/posix/Pacific/Midway
vf107/dxmodules/zoneinfo/posix/Pacific/Nauru
vf107/dxmodules/zoneinfo/posix/Pacific/Niue
vf107/dxmodules/zoneinfo/posix/Pacific/Norfolk
vf107/dxmodules/zoneinfo/posix/Pacific/Noumea
vf107/dxmodules/zoneinfo/posix/Pacific/Pago_Pago
vf107/dxmodules/zoneinfo/posix/Pacific/Palau
vf107/dxmodules/zoneinfo/posix/Pacific/Pitcairn
vf107/dxmodules/zoneinfo/posix/Pacific/Pohnpei
vf107/dxmodules/zoneinfo/posix/Pacific/Ponape
vf107/dxmodules/zoneinfo/posix/Pacific/Port_Moresby
vf107/dxmodules/zoneinfo/posix/Pacific/Rarotonga
vf107/dxmodules/zoneinfo/posix/Pacific/Saipan
vf107/dxmodules/zoneinfo/posix/Pacific/Samoa
vf107/dxmodules/zoneinfo/posix/Pacific/Tahiti
vf107/dxmodules/zoneinfo/posix/Pacific/Tarawa
vf107/dxmodules/zoneinfo/posix/Pacific/Tongatapu
vf107/dxmodules/zoneinfo/posix/Pacific/Truk
vf107/dxmodules/zoneinfo/posix/Pacific/Wake
vf107/dxmodules/zoneinfo/posix/Pacific/Wallis
vf107/dxmodules/zoneinfo/posix/Pacific/Yap
vf107/dxmodules/zoneinfo/posix/Poland
vf107/dxmodules/zoneinfo/posix/Portugal
vf107/dxmodules/zoneinfo/posix/ROC
vf107/dxmodules/zoneinfo/posix/ROK
vf107/dxmodules/zoneinfo/posix/Singapore
vf107/dxmodules/zoneinfo/posix/Turkey
vf107/dxmodules/zoneinfo/posix/UCT
vf107/dxmodules/zoneinfo/posix/US/Alaska
vf107/dxmodules/zoneinfo/posix/US/Aleutian
vf107/dxmodules/zoneinfo/posix/US/Arizona
vf107/dxmodules/zoneinfo/posix/US/Central
vf107/dxmodules/zoneinfo/posix/US/East-Indiana
vf107/dxmodules/zoneinfo/posix/US/Eastern
vf107/dxmodules/zoneinfo/posix/US/Hawaii
vf107/dxmodules/zoneinfo/posix/US/Indiana-Starke
vf107/dxmodules/zoneinfo/posix/US/Michigan
vf107/dxmodules/zoneinfo/posix/US/Mountain
vf107/dxmodules/zoneinfo/posix/US/Pacific
vf107/dxmodules/zoneinfo/posix/US/Samoa
vf107/dxmodules/zoneinfo/posix/UTC
vf107/dxmodules/zoneinfo/posix/Universal
vf107/dxmodules/zoneinfo/posix/W-SU
vf107/dxmodules/zoneinfo/posix/WET
vf107/dxmodules/zoneinfo/posix/Zulu
vf107/dxmodules/zoneinfo/posixrules
vf107/dxmodules/zoneinfo/right/Africa/Abidjan
vf107/dxmodules/zoneinfo/right/Africa/Accra
vf107/dxmodules/zoneinfo/right/Africa/Addis_Ababa
vf107/dxmodules/zoneinfo/right/Africa/Algiers
vf107/dxmodules/zoneinfo/right/Africa/Asmara
vf107/dxmodules/zoneinfo/right/Africa/Asmera
vf107/dxmodules/zoneinfo/right/Africa/Bamako
vf107/dxmodules/zoneinfo/right/Africa/Bangui
vf107/dxmodules/zoneinfo/right/Africa/Banjul
vf107/dxmodules/zoneinfo/right/Africa/Bissau
vf107/dxmodules/zoneinfo/right/Africa/Blantyre
vf107/dxmodules/zoneinfo/right/Africa/Brazzaville
vf107/dxmodules/zoneinfo/right/Africa/Bujumbura
vf107/dxmodules/zoneinfo/right/Africa/Cairo
vf107/dxmodules/zoneinfo/right/Africa/Casablanca
vf107/dxmodules/zoneinfo/right/Africa/Ceuta
vf107/dxmodules/zoneinfo/right/Africa/Conakry
vf107/dxmodules/zoneinfo/right/Africa/Dakar
vf107/dxmodules/zoneinfo/right/Africa/Dar_es_Salaam
vf107/dxmodules/zoneinfo/right/Africa/Djibouti
vf107/dxmodules/zoneinfo/right/Africa/Douala
vf107/dxmodules/zoneinfo/right/Africa/El_Aaiun
vf107/dxmodules/zoneinfo/right/Africa/Freetown
vf107/dxmodules/zoneinfo/right/Africa/Gaborone
vf107/dxmodules/zoneinfo/right/Africa/Harare
vf107/dxmodules/zoneinfo/right/Africa/Johannesburg
vf107/dxmodules/zoneinfo/right/Africa/Juba
vf107/dxmodules/zoneinfo/right/Africa/Kampala
vf107/dxmodules/zoneinfo/right/Africa/Khartoum
vf107/dxmodules/zoneinfo/right/Africa/Kigali
vf107/dxmodules/zoneinfo/right/Africa/Kinshasa
vf107/dxmodules/zoneinfo/right/Africa/Lagos
vf107/dxmodules/zoneinfo/right/Africa/Libreville
vf107/dxmodules/zoneinfo/right/Africa/Lome
vf107/dxmodules/zoneinfo/right/Africa/Luanda
vf107/dxmodules/zoneinfo/right/Africa/Lubumbashi
vf107/dxmodules/zoneinfo/right/Africa/Lusaka
vf107/dxmodules/zoneinfo/right/Africa/Malabo
vf107/dxmodules/zoneinfo/right/Africa/Maputo
vf107/dxmodules/zoneinfo/right/Africa/Maseru
vf107/dxmodules/zoneinfo/right/Africa/Mbabane
vf107/dxmodules/zoneinfo/right/Africa/Mogadishu
vf107/dxmodules/zoneinfo/right/Africa/Monrovia
vf107/dxmodules/zoneinfo/right/Africa/Nairobi
vf107/dxmodules/zoneinfo/right/Africa/Ndjamena
vf107/dxmodules/zoneinfo/right/Africa/Niamey
vf107/dxmodules/zoneinfo/right/Africa/Nouakchott
vf107/dxmodules/zoneinfo/right/Africa/Ouagadougou
vf107/dxmodules/zoneinfo/right/Africa/Porto-Novo
vf107/dxmodules/zoneinfo/right/Africa/Sao_Tome
vf107/dxmodules/zoneinfo/right/Africa/Timbuktu
vf107/dxmodules/zoneinfo/right/Africa/Tripoli
vf107/dxmodules/zoneinfo/right/Africa/Tunis
vf107/dxmodules/zoneinfo/right/Africa/Windhoek
vf107/dxmodules/zoneinfo/right/America/Adak
vf107/dxmodules/zoneinfo/right/America/Anchorage
vf107/dxmodules/zoneinfo/right/America/Anguilla
vf107/dxmodules/zoneinfo/right/America/Antigua
vf107/dxmodules/zoneinfo/right/America/Araguaina
vf107/dxmodules/zoneinfo/right/America/Argentina/Buenos_Aires
vf107/dxmodules/zoneinfo/right/America/Argentina/Catamarca
vf107/dxmodules/zoneinfo/right/America/Argentina/ComodRivadavia
vf107/dxmodules/zoneinfo/right/America/Argentina/Cordoba
vf107/dxmodules/zoneinfo/right/America/Argentina/Jujuy
vf107/dxmodules/zoneinfo/right/America/Argentina/La_Rioja
vf107/dxmodules/zoneinfo/right/America/Argentina/Mendoza
vf107/dxmodules/zoneinfo/right/America/Argentina/Rio_Gallegos
vf107/dxmodules/zoneinfo/right/America/Argentina/Salta
vf107/dxmodules/zoneinfo/right/America/Argentina/San_Juan
vf107/dxmodules/zoneinfo/right/America/Argentina/San_Luis
vf107/dxmodules/zoneinfo/right/America/Argentina/Tucuman
vf107/dxmodules/zoneinfo/right/America/Argentina/Ushuaia
vf107/dxmodules/zoneinfo/right/America/Aruba
vf107/dxmodules/zoneinfo/right/America/Asuncion
vf107/dxmodules/zoneinfo/right/America/Atikokan
vf107/dxmodules/zoneinfo/right/America/Atka
vf107/dxmodules/zoneinfo/right/America/Bahia
vf107/dxmodules/zoneinfo/right/America/Bahia_Banderas
vf107/dxmodules/zoneinfo/right/America/Barbados
vf107/dxmodules/zoneinfo/right/America/Belem
vf107/dxmodules/zoneinfo/right/America/Belize
vf107/dxmodules/zoneinfo/right/America/Blanc-Sablon
vf107/dxmodules/zoneinfo/right/America/Boa_Vista
vf107/dxmodules/zoneinfo/right/America/Bogota
vf107/dxmodules/zoneinfo/right/America/Boise
vf107/dxmodules/zoneinfo/right/America/Buenos_Aires
vf107/dxmodules/zoneinfo/right/America/Cambridge_Bay
vf107/dxmodules/zoneinfo/right/America/Campo_Grande
vf107/dxmodules/zoneinfo/right/America/Cancun
vf107/dxmodules/zoneinfo/right/America/Caracas
vf107/dxmodules/zoneinfo/right/America/Catamarca
vf107/dxmodules/zoneinfo/right/America/Cayenne
vf107/dxmodules/zoneinfo/right/America/Cayman
vf107/dxmodules/zoneinfo/right/America/Chicago
vf107/dxmodules/zoneinfo/right/America/Chihuahua
vf107/dxmodules/zoneinfo/right/America/Coral_Harbour
vf107/dxmodules/zoneinfo/right/America/Cordoba
vf107/dxmodules/zoneinfo/right/America/Costa_Rica
vf107/dxmodules/zoneinfo/right/America/Creston
vf107/dxmodules/zoneinfo/right/America/Cuiaba
vf107/dxmodules/zoneinfo/right/America/Curacao
vf107/dxmodules/zoneinfo/right/America/Danmarkshavn
vf107/dxmodules/zoneinfo/right/America/Dawson
vf107/dxmodules/zoneinfo/right/America/Dawson_Creek
vf107/dxmodules/zoneinfo/right/America/Denver
vf107/dxmodules/zoneinfo/right/America/Detroit
vf107/dxmodules/zoneinfo/right/America/Dominica
vf107/dxmodules/zoneinfo/right/America/Edmonton
vf107/dxmodules/zoneinfo/right/America/Eirunepe
vf107/dxmodules/zoneinfo/right/America/El_Salvador
vf107/dxmodules/zoneinfo/right/America/Ensenada
vf107/dxmodules/zoneinfo/right/America/Fort_Nelson
vf107/dxmodules/zoneinfo/right/America/Fort_Wayne
vf107/dxmodules/zoneinfo/right/America/Fortaleza
vf107/dxmodules/zoneinfo/right/America/Glace_Bay
vf107/dxmodules/zoneinfo/right/America/Godthab
vf107/dxmodules/zoneinfo/right/America/Goose_Bay
vf107/dxmodules/zoneinfo/right/America/Grand_Turk
vf107/dxmodules/zoneinfo/right/America/Grenada
vf107/dxmodules/zoneinfo/right/America/Guadeloupe
vf107/dxmodules/zoneinfo/right/America/Guatemala
vf107/dxmodules/zoneinfo/right/America/Guayaquil
vf107/dxmodules/zoneinfo/right/America/Guyana
vf107/dxmodules/zoneinfo/right/America/Halifax
vf107/dxmodules/zoneinfo/right/America/Havana
vf107/dxmodules/zoneinfo/right/America/Hermosillo
vf107/dxmodules/zoneinfo/right/America/Indiana/Indianapolis
vf107/dxmodules/zoneinfo/right/America/Indiana/Knox
vf107/dxmodules/zoneinfo/right/America/Indiana/Marengo
vf107/dxmodules/zoneinfo/right/America/Indiana/Petersburg
vf107/dxmodules/zoneinfo/right/America/Indiana/Tell_City
vf107/dxmodules/zoneinfo/right/America/Indiana/Vevay
vf107/dxmodules/zoneinfo/right/America/Indiana/Vincennes
vf107/dxmodules/zoneinfo/right/America/Indiana/Winamac
vf107/dxmodules/zoneinfo/right/America/Indianapolis
vf107/dxmodules/zoneinfo/right/America/Inuvik
vf107/dxmodules/zoneinfo/right/America/Iqaluit
vf107/dxmodules/zoneinfo/right/America/Jamaica
vf107/dxmodules/zoneinfo/right/America/Jujuy
vf107/dxmodules/zoneinfo/right/America/Juneau
vf107/dxmodules/zoneinfo/right/America/Kentucky/Louisville
vf107/dxmodules/zoneinfo/right/America/Kentucky/Monticello
vf107/dxmodules/zoneinfo/right/America/Knox_IN
vf107/dxmodules/zoneinfo/right/America/Kralendijk
vf107/dxmodules/zoneinfo/right/America/La_Paz
vf107/dxmodules/zoneinfo/right/America/Lima
vf107/dxmodules/zoneinfo/right/America/Los_Angeles
vf107/dxmodules/zoneinfo/right/America/Louisville
vf107/dxmodules/zoneinfo/right/America/Lower_Princes
vf107/dxmodules/zoneinfo/right/America/Maceio
vf107/dxmodules/zoneinfo/right/America/Managua
vf107/dxmodules/zoneinfo/right/America/Manaus
vf107/dxmodules/zoneinfo/right/America/Marigot
vf107/dxmodules/zoneinfo/right/America/Martinique
vf107/dxmodules/zoneinfo/right/America/Matamoros
vf107/dxmodules/zoneinfo/right/America/Mazatlan
vf107/dxmodules/zoneinfo/right/America/Mendoza
vf107/dxmodules/zoneinfo/right/America/Menominee
vf107/dxmodules/zoneinfo/right/America/Merida
vf107/dxmodules/zoneinfo/right/America/Metlakatla
vf107/dxmodules/zoneinfo/right/America/Mexico_City
vf107/dxmodules/zoneinfo/right/America/Miquelon
vf107/dxmodules/zoneinfo/right/America/Moncton
vf107/dxmodules/zoneinfo/right/America/Monterrey
vf107/dxmodules/zoneinfo/right/America/Montevideo
vf107/dxmodules/zoneinfo/right/America/Montreal
vf107/dxmodules/zoneinfo/right/America/Montserrat
vf107/dxmodules/zoneinfo/right/America/Nassau
vf107/dxmodules/zoneinfo/right/America/New_York
vf107/dxmodules/zoneinfo/right/America/Nipigon
vf107/dxmodules/zoneinfo/right/America/Nome
vf107/dxmodules/zoneinfo/right/America/Noronha
vf107/dxmodules/zoneinfo/right/America/North_Dakota/Beulah
vf107/dxmodules/zoneinfo/right/America/North_Dakota/Center
vf107/dxmodules/zoneinfo/right/America/North_Dakota/New_Salem
vf107/dxmodules/zoneinfo/right/America/Nuuk
vf107/dxmodules/zoneinfo/right/America/Ojinaga
vf107/dxmodules/zoneinfo/right/America/Panama
vf107/dxmodules/zoneinfo/right/America/Pangnirtung
vf107/dxmodules/zoneinfo/right/America/Paramaribo
vf107/dxmodules/zoneinfo/right/America/Phoenix
vf107/dxmodules/zoneinfo/right/America/Port-au-Prince
vf107/dxmodules/zoneinfo/right/America/Port_of_Spain
vf107/dxmodules/zoneinfo/right/America/Porto_Acre
vf107/dxmodules/zoneinfo/right/America/Porto_Velho
vf107/dxmodules/zoneinfo/right/America/Puerto_Rico
vf107/dxmodules/zoneinfo/right/America/Punta_Arenas
vf107/dxmodules/zoneinfo/right/America/Rainy_River
vf107/dxmodules/zoneinfo/right/America/Rankin_Inlet
vf107/dxmodules/zoneinfo/right/America/Recife
vf107/dxmodules/zoneinfo/right/America/Regina
vf107/dxmodules/zoneinfo/right/America/Resolute
vf107/dxmodules/zoneinfo/right/America/Rio_Branco
vf107/dxmodules/zoneinfo/right/America/Rosario
vf107/dxmodules/zoneinfo/right/America/Santa_Isabel
vf107/dxmodules/zoneinfo/right/America/Santarem
vf107/dxmodules/zoneinfo/right/America/Santiago
vf107/dxmodules/zoneinfo/right/America/Santo_Domingo
vf107/dxmodules/zoneinfo/right/America/Sao_Paulo
vf107/dxmodules/zoneinfo/right/America/Scoresbysund
vf107/dxmodules/zoneinfo/right/America/Shiprock
vf107/dxmodules/zoneinfo/right/America/Sitka
vf107/dxmodules/zoneinfo/right/America/St_Barthelemy
vf107/dxmodules/zoneinfo/right/America/St_Johns
vf107/dxmodules/zoneinfo/right/America/St_Kitts
vf107/dxmodules/zoneinfo/right/America/St_Lucia
vf107/dxmodules/zoneinfo/right/America/St_Thomas
vf107/dxmodules/zoneinfo/right/America/St_Vincent
vf107/dxmodules/zoneinfo/right/America/Swift_Current
vf107/dxmodules/zoneinfo/right/America/Tegucigalpa
vf107/dxmodules/zoneinfo/right/America/Thule
vf107/dxmodules/zoneinfo/right/America/Thunder_Bay
vf107/dxmodules/zoneinfo/right/America/Tijuana
vf107/dxmodules/zoneinfo/right/America/Toronto
vf107/dxmodules/zoneinfo/right/America/Tortola
vf107/dxmodules/zoneinfo/right/America/Vancouver
vf107/dxmodules/zoneinfo/right/America/Virgin
vf107/dxmodules/zoneinfo/right/America/Whitehorse
vf107/dxmodules/zoneinfo/right/America/Winnipeg
vf107/dxmodules/zoneinfo/right/America/Yakutat
vf107/dxmodules/zoneinfo/right/America/Yellowknife
vf107/dxmodules/zoneinfo/right/Antarctica/Casey
vf107/dxmodules/zoneinfo/right/Antarctica/Davis
vf107/dxmodules/zoneinfo/right/Antarctica/DumontDUrville
vf107/dxmodules/zoneinfo/right/Antarctica/Macquarie
vf107/dxmodules/zoneinfo/right/Antarctica/Mawson
vf107/dxmodules/zoneinfo/right/Antarctica/McMurdo
vf107/dxmodules/zoneinfo/right/Antarctica/Palmer
vf107/dxmodules/zoneinfo/right/Antarctica/Rothera
vf107/dxmodules/zoneinfo/right/Antarctica/South_Pole
vf107/dxmodules/zoneinfo/right/Antarctica/Syowa
vf107/dxmodules/zoneinfo/right/Antarctica/Troll
vf107/dxmodules/zoneinfo/right/Antarctica/Vostok
vf107/dxmodules/zoneinfo/right/Arctic/Longyearbyen
vf107/dxmodules/zoneinfo/right/Asia/Aden
vf107/dxmodules/zoneinfo/right/Asia/Almaty
vf107/dxmodules/zoneinfo/right/Asia/Amman
vf107/dxmodules/zoneinfo/right/Asia/Anadyr
vf107/dxmodules/zoneinfo/right/Asia/Aqtau
vf107/dxmodules/zoneinfo/right/Asia/Aqtobe
vf107/dxmodules/zoneinfo/right/Asia/Ashgabat
vf107/dxmodules/zoneinfo/right/Asia/Ashkhabad
vf107/dxmodules/zoneinfo/right/Asia/Atyrau
vf107/dxmodules/zoneinfo/right/Asia/Baghdad
vf107/dxmodules/zoneinfo/right/Asia/Bahrain
vf107/dxmodules/zoneinfo/right/Asia/Baku
vf107/dxmodules/zoneinfo/right/Asia/Bangkok
vf107/dxmodules/zoneinfo/right/Asia/Barnaul
vf107/dxmodules/zoneinfo/right/Asia/Beirut
vf107/dxmodules/zoneinfo/right/Asia/Bishkek
vf107/dxmodules/zoneinfo/right/Asia/Brunei
vf107/dxmodules/zoneinfo/right/Asia/Calcutta
vf107/dxmodules/zoneinfo/right/Asia/Chita
vf107/dxmodules/zoneinfo/right/Asia/Choibalsan
vf107/dxmodules/zoneinfo/right/Asia/Chongqing
vf107/dxmodules/zoneinfo/right/Asia/Chungking
vf107/dxmodules/zoneinfo/right/Asia/Colombo
vf107/dxmodules/zoneinfo/right/Asia/Dacca
vf107/dxmodules/zoneinfo/right/Asia/Damascus
vf107/dxmodules/zoneinfo/right/Asia/Dhaka
vf107/dxmodules/zoneinfo/right/Asia/Dili
vf107/dxmodules/zoneinfo/right/Asia/Dubai
vf107/dxmodules/zoneinfo/right/Asia/Dushanbe
vf107/dxmodules/zoneinfo/right/Asia/Famagusta
vf107/dxmodules/zoneinfo/right/Asia/Gaza
vf107/dxmodules/zoneinfo/right/Asia/Harbin
vf107/dxmodules/zoneinfo/right/Asia/Hebron
vf107/dxmodules/zoneinfo/right/Asia/Ho_Chi_Minh
vf107/dxmodules/zoneinfo/right/Asia/Hong_Kong
vf107/dxmodules/zoneinfo/right/Asia/Hovd
vf107/dxmodules/zoneinfo/right/Asia/Irkutsk
vf107/dxmodules/zoneinfo/right/Asia/Istanbul
vf107/dxmodules/zoneinfo/right/Asia/Jakarta
vf107/dxmodules/zoneinfo/right/Asia/Jayapura
vf107/dxmodules/zoneinfo/right/Asia/Jerusalem
vf107/dxmodules/zoneinfo/right/Asia/Kabul
vf107/dxmodules/zoneinfo/right/Asia/Kamchatka
vf107/dxmodules/zoneinfo/right/Asia/Karachi
vf107/dxmodules/zoneinfo/right/Asia/Kashgar
vf107/dxmodules/zoneinfo/right/Asia/Kathmandu
vf107/dxmodules/zoneinfo/right/Asia/Katmandu
vf107/dxmodules/zoneinfo/right/Asia/Khandyga
vf107/dxmodules/zoneinfo/right/Asia/Kolkata
vf107/dxmodules/zoneinfo/right/Asia/Krasnoyarsk
vf107/dxmodules/zoneinfo/right/Asia/Kuala_Lumpur
vf107/dxmodules/zoneinfo/right/Asia/Kuching
vf107/dxmodules/zoneinfo/right/Asia/Kuwait
vf107/dxmodules/zoneinfo/right/Asia/Macao
vf107/dxmodules/zoneinfo/right/Asia/Macau
vf107/dxmodules/zoneinfo/right/Asia/Magadan
vf107/dxmodules/zoneinfo/right/Asia/Makassar
vf107/dxmodules/zoneinfo/right/Asia/Manila
vf107/dxmodules/zoneinfo/right/Asia/Muscat
vf107/dxmodules/zoneinfo/right/Asia/Nicosia
vf107/dxmodules/zoneinfo/right/Asia/Novokuznetsk
vf107/dxmodules/zoneinfo/right/Asia/Novosibirsk
vf107/dxmodules/zoneinfo/right/Asia/Omsk
vf107/dxmodules/zoneinfo/right/Asia/Oral
vf107/dxmodules/zoneinfo/right/Asia/Phnom_Penh
vf107/dxmodules/zoneinfo/right/Asia/Pontianak
vf107/dxmodules/zoneinfo/right/Asia/Pyongyang
vf107/dxmodules/zoneinfo/right/Asia/Qatar
vf107/dxmodules/zoneinfo/right/Asia/Qostanay
vf107/dxmodules/zoneinfo/right/Asia/Qyzylorda
vf107/dxmodules/zoneinfo/right/Asia/Rangoon
vf107/dxmodules/zoneinfo/right/Asia/Riyadh
vf107/dxmodules/zoneinfo/right/Asia/Saigon
vf107/dxmodules/zoneinfo/right/Asia/Sakhalin
vf107/dxmodules/zoneinfo/right/Asia/Samarkand
vf107/dxmodules/zoneinfo/right/Asia/Seoul
vf107/dxmodules/zoneinfo/right/Asia/Shanghai
vf107/dxmodules/zoneinfo/right/Asia/Singapore
vf107/dxmodules/zoneinfo/right/Asia/Srednekolymsk
vf107/dxmodules/zoneinfo/right/Asia/Taipei
vf107/dxmodules/zoneinfo/right/Asia/Tashkent
vf107/dxmodules/zoneinfo/right/Asia/Tbilisi
vf107/dxmodules/zoneinfo/right/Asia/Tehran
vf107/dxmodules/zoneinfo/right/Asia/Tel_Aviv
vf107/dxmodules/zoneinfo/right/Asia/Thimbu
vf107/dxmodules/zoneinfo/right/Asia/Thimphu
vf107/dxmodules/zoneinfo/right/Asia/Tokyo
vf107/dxmodules/zoneinfo/right/Asia/Tomsk
vf107/dxmodules/zoneinfo/right/Asia/Ujung_Pandang
vf107/dxmodules/zoneinfo/right/Asia/Ulaanbaatar
vf107/dxmodules/zoneinfo/right/Asia/Ulan_Bator
vf107/dxmodules/zoneinfo/right/Asia/Urumqi
vf107/dxmodules/zoneinfo/right/Asia/Ust-Nera
vf107/dxmodules/zoneinfo/right/Asia/Vientiane
vf107/dxmodules/zoneinfo/right/Asia/Vladivostok
vf107/dxmodules/zoneinfo/right/Asia/Yakutsk
vf107/dxmodules/zoneinfo/right/Asia/Yangon
vf107/dxmodules/zoneinfo/right/Asia/Yekaterinburg
vf107/dxmodules/zoneinfo/right/Asia/Yerevan
vf107/dxmodules/zoneinfo/right/Atlantic/Azores
vf107/dxmodules/zoneinfo/right/Atlantic/Bermuda
vf107/dxmodules/zoneinfo/right/Atlantic/Canary
vf107/dxmodules/zoneinfo/right/Atlantic/Cape_Verde
vf107/dxmodules/zoneinfo/right/Atlantic/Faeroe
vf107/dxmodules/zoneinfo/right/Atlantic/Faroe
vf107/dxmodules/zoneinfo/right/Atlantic/Jan_Mayen
vf107/dxmodules/zoneinfo/right/Atlantic/Madeira
vf107/dxmodules/zoneinfo/right/Atlantic/Reykjavik
vf107/dxmodules/zoneinfo/right/Atlantic/South_Georgia
vf107/dxmodules/zoneinfo/right/Atlantic/St_Helena
vf107/dxmodules/zoneinfo/right/Atlantic/Stanley
vf107/dxmodules/zoneinfo/right/Australia/ACT
vf107/dxmodules/zoneinfo/right/Australia/Adelaide
vf107/dxmodules/zoneinfo/right/Australia/Brisbane
vf107/dxmodules/zoneinfo/right/Australia/Broken_Hill
vf107/dxmodules/zoneinfo/right/Australia/Canberra
vf107/dxmodules/zoneinfo/right/Australia/Currie
vf107/dxmodules/zoneinfo/right/Australia/Darwin
vf107/dxmodules/zoneinfo/right/Australia/Eucla
vf107/dxmodules/zoneinfo/right/Australia/Hobart
vf107/dxmodules/zoneinfo/right/Australia/LHI
vf107/dxmodules/zoneinfo/right/Australia/Lindeman
vf107/dxmodules/zoneinfo/right/Australia/Lord_Howe
vf107/dxmodules/zoneinfo/right/Australia/Melbourne
vf107/dxmodules/zoneinfo/right/Australia/NSW
vf107/dxmodules/zoneinfo/right/Australia/North
vf107/dxmodules/zoneinfo/right/Australia/Perth
vf107/dxmodules/zoneinfo/right/Australia/Queensland
vf107/dxmodules/zoneinfo/right/Australia/South
vf107/dxmodules/zoneinfo/right/Australia/Sydney
vf107/dxmodules/zoneinfo/right/Australia/Tasmania
vf107/dxmodules/zoneinfo/right/Australia/Victoria
vf107/dxmodules/zoneinfo/right/Australia/West
vf107/dxmodules/zoneinfo/right/Australia/Yancowinna
vf107/dxmodules/zoneinfo/right/Brazil/Acre
vf107/dxmodules/zoneinfo/right/Brazil/DeNoronha
vf107/dxmodules/zoneinfo/right/Brazil/East
vf107/dxmodules/zoneinfo/right/Brazil/West
vf107/dxmodules/zoneinfo/right/CET
vf107/dxmodules/zoneinfo/right/CST6CDT
vf107/dxmodules/zoneinfo/right/Canada/Atlantic
vf107/dxmodules/zoneinfo/right/Canada/Central
vf107/dxmodules/zoneinfo/right/Canada/Eastern
vf107/dxmodules/zoneinfo/right/Canada/Mountain
vf107/dxmodules/zoneinfo/right/Canada/Newfoundland
vf107/dxmodules/zoneinfo/right/Canada/Pacific
vf107/dxmodules/zoneinfo/right/Canada/Saskatchewan
vf107/dxmodules/zoneinfo/right/Canada/Yukon
vf107/dxmodules/zoneinfo/right/Chile/Continental
vf107/dxmodules/zoneinfo/right/Chile/EasterIsland
vf107/dxmodules/zoneinfo/right/Cuba
vf107/dxmodules/zoneinfo/right/EET
vf107/dxmodules/zoneinfo/right/EST
vf107/dxmodules/zoneinfo/right/EST5EDT
vf107/dxmodules/zoneinfo/right/Egypt
vf107/dxmodules/zoneinfo/right/Eire
vf107/dxmodules/zoneinfo/right/Etc/GMT
vf107/dxmodules/zoneinfo/right/Etc/GMT+0
vf107/dxmodules/zoneinfo/right/Etc/GMT+1
vf107/dxmodules/zoneinfo/right/Etc/GMT+10
vf107/dxmodules/zoneinfo/right/Etc/GMT+11
vf107/dxmodules/zoneinfo/right/Etc/GMT+12
vf107/dxmodules/zoneinfo/right/Etc/GMT+2
vf107/dxmodules/zoneinfo/right/Etc/GMT+3
vf107/dxmodules/zoneinfo/right/Etc/GMT+4
vf107/dxmodules/zoneinfo/right/Etc/GMT+5
vf107/dxmodules/zoneinfo/right/Etc/GMT+6
vf107/dxmodules/zoneinfo/right/Etc/GMT+7
vf107/dxmodules/zoneinfo/right/Etc/GMT+8
vf107/dxmodules/zoneinfo/right/Etc/GMT+9
vf107/dxmodules/zoneinfo/right/Etc/GMT-0
vf107/dxmodules/zoneinfo/right/Etc/GMT-1
vf107/dxmodules/zoneinfo/right/Etc/GMT-10
vf107/dxmodules/zoneinfo/right/Etc/GMT-11
vf107/dxmodules/zoneinfo/right/Etc/GMT-12
vf107/dxmodules/zoneinfo/right/Etc/GMT-13
vf107/dxmodules/zoneinfo/right/Etc/GMT-14
vf107/dxmodules/zoneinfo/right/Etc/GMT-2
vf107/dxmodules/zoneinfo/right/Etc/GMT-3
vf107/dxmodules/zoneinfo/right/Etc/GMT-4
vf107/dxmodules/zoneinfo/right/Etc/GMT-5
vf107/dxmodules/zoneinfo/right/Etc/GMT-6
vf107/dxmodules/zoneinfo/right/Etc/GMT-7
vf107/dxmodules/zoneinfo/right/Etc/GMT-8
vf107/dxmodules/zoneinfo/right/Etc/GMT-9
vf107/dxmodules/zoneinfo/right/Etc/GMT0
vf107/dxmodules/zoneinfo/right/Etc/Greenwich
vf107/dxmodules/zoneinfo/right/Etc/UCT
vf107/dxmodules/zoneinfo/right/Etc/UTC
vf107/dxmodules/zoneinfo/right/Etc/Universal
vf107/dxmodules/zoneinfo/right/Etc/Zulu
vf107/dxmodules/zoneinfo/right/Europe/Amsterdam
vf107/dxmodules/zoneinfo/right/Europe/Andorra
vf107/dxmodules/zoneinfo/right/Europe/Astrakhan
vf107/dxmodules/zoneinfo/right/Europe/Athens
vf107/dxmodules/zoneinfo/right/Europe/Belfast
vf107/dxmodules/zoneinfo/right/Europe/Belgrade
vf107/dxmodules/zoneinfo/right/Europe/Berlin
vf107/dxmodules/zoneinfo/right/Europe/Bratislava
vf107/dxmodules/zoneinfo/right/Europe/Brussels
vf107/dxmodules/zoneinfo/right/Europe/Bucharest
vf107/dxmodules/zoneinfo/right/Europe/Budapest
vf107/dxmodules/zoneinfo/right/Europe/Busingen
vf107/dxmodules/zoneinfo/right/Europe/Chisinau
vf107/dxmodules/zoneinfo/right/Europe/Copenhagen
vf107/dxmodules/zoneinfo/right/Europe/Dublin
vf107/dxmodules/zoneinfo/right/Europe/Gibraltar
vf107/dxmodules/zoneinfo/right/Europe/Guernsey
vf107/dxmodules/zoneinfo/right/Europe/Helsinki
vf107/dxmodules/zoneinfo/right/Europe/Isle_of_Man
vf107/dxmodules/zoneinfo/right/Europe/Istanbul
vf107/dxmodules/zoneinfo/right/Europe/Jersey
vf107/dxmodules/zoneinfo/right/Europe/Kaliningrad
vf107/dxmodules/zoneinfo/right/Europe/Kiev
vf107/dxmodules/zoneinfo/right/Europe/Kirov
vf107/dxmodules/zoneinfo/right/Europe/Lisbon
vf107/dxmodules/zoneinfo/right/Europe/Ljubljana
vf107/dxmodules/zoneinfo/right/Europe/London
vf107/dxmodules/zoneinfo/right/Europe/Luxembourg
vf107/dxmodules/zoneinfo/right/Europe/Madrid
vf107/dxmodules/zoneinfo/right/Europe/Malta
vf107/dxmodules/zoneinfo/right/Europe/Mariehamn
vf107/dxmodules/zoneinfo/right/Europe/Minsk
vf107/dxmodules/zoneinfo/right/Europe/Monaco
vf107/dxmodules/zoneinfo/right/Europe/Moscow
vf107/dxmodules/zoneinfo/right/Europe/Nicosia
vf107/dxmodules/zoneinfo/right/Europe/Oslo
vf107/dxmodules/zoneinfo/right/Europe/Paris
vf107/dxmodules/zoneinfo/right/Europe/Podgorica
vf107/dxmodules/zoneinfo/right/Europe/Prague
vf107/dxmodules/zoneinfo/right/Europe/Riga
vf107/dxmodules/zoneinfo/right/Europe/Rome
vf107/dxmodules/zoneinfo/right/Europe/Samara
vf107/dxmodules/zoneinfo/right/Europe/San_Marino
vf107/dxmodules/zoneinfo/right/Europe/Sarajevo
vf107/dxmodules/zoneinfo/right/Europe/Saratov
vf107/dxmodules/zoneinfo/right/Europe/Simferopol
vf107/dxmodules/zoneinfo/right/Europe/Skopje
vf107/dxmodules/zoneinfo/right/Europe/Sofia
vf107/dxmodules/zoneinfo/right/Europe/Stockholm
vf107/dxmodules/zoneinfo/right/Europe/Tallinn
vf107/dxmodules/zoneinfo/right/Europe/Tirane
vf107/dxmodules/zoneinfo/right/Europe/Tiraspol
vf107/dxmodules/zoneinfo/right/Europe/Ulyanovsk
vf107/dxmodules/zoneinfo/right/Europe/Uzhgorod
vf107/dxmodules/zoneinfo/right/Europe/Vaduz
vf107/dxmodules/zoneinfo/right/Europe/Vatican
vf107/dxmodules/zoneinfo/right/Europe/Vienna
vf107/dxmodules/zoneinfo/right/Europe/Vilnius
vf107/dxmodules/zoneinfo/right/Europe/Volgograd
vf107/dxmodules/zoneinfo/right/Europe/Warsaw
vf107/dxmodules/zoneinfo/right/Europe/Zagreb
vf107/dxmodules/zoneinfo/right/Europe/Zaporozhye
vf107/dxmodules/zoneinfo/right/Europe/Zurich
vf107/dxmodules/zoneinfo/right/GB
vf107/dxmodules/zoneinfo/right/GB-Eire
vf107/dxmodules/zoneinfo/right/GMT
vf107/dxmodules/zoneinfo/right/GMT+0
vf107/dxmodules/zoneinfo/right/GMT-0
vf107/dxmodules/zoneinfo/right/GMT0
vf107/dxmodules/zoneinfo/right/Greenwich
vf107/dxmodules/zoneinfo/right/HST
vf107/dxmodules/zoneinfo/right/Hongkong
vf107/dxmodules/zoneinfo/right/Iceland
vf107/dxmodules/zoneinfo/right/Indian/Antananarivo
vf107/dxmodules/zoneinfo/right/Indian/Chagos
vf107/dxmodules/zoneinfo/right/Indian/Christmas
vf107/dxmodules/zoneinfo/right/Indian/Cocos
vf107/dxmodules/zoneinfo/right/Indian/Comoro
vf107/dxmodules/zoneinfo/right/Indian/Kerguelen
vf107/dxmodules/zoneinfo/right/Indian/Mahe
vf107/dxmodules/zoneinfo/right/Indian/Maldives
vf107/dxmodules/zoneinfo/right/Indian/Mauritius
vf107/dxmodules/zoneinfo/right/Indian/Mayotte
vf107/dxmodules/zoneinfo/right/Indian/Reunion
vf107/dxmodules/zoneinfo/right/Iran
vf107/dxmodules/zoneinfo/right/Israel
vf107/dxmodules/zoneinfo/right/Jamaica
vf107/dxmodules/zoneinfo/right/Japan
vf107/dxmodules/zoneinfo/right/Kwajalein
vf107/dxmodules/zoneinfo/right/Libya
vf107/dxmodules/zoneinfo/right/MET
vf107/dxmodules/zoneinfo/right/MST
vf107/dxmodules/zoneinfo/right/MST7MDT
vf107/dxmodules/zoneinfo/right/Mexico/BajaNorte
vf107/dxmodules/zoneinfo/right/Mexico/BajaSur
vf107/dxmodules/zoneinfo/right/Mexico/General
vf107/dxmodules/zoneinfo/right/NZ
vf107/dxmodules/zoneinfo/right/NZ-CHAT
vf107/dxmodules/zoneinfo/right/Navajo
vf107/dxmodules/zoneinfo/right/PRC
vf107/dxmodules/zoneinfo/right/PST8PDT
vf107/dxmodules/zoneinfo/right/Pacific/Apia
vf107/dxmodules/zoneinfo/right/Pacific/Auckland
vf107/dxmodules/zoneinfo/right/Pacific/Bougainville
vf107/dxmodules/zoneinfo/right/Pacific/Chatham
vf107/dxmodules/zoneinfo/right/Pacific/Chuuk
vf107/dxmodules/zoneinfo/right/Pacific/Easter
vf107/dxmodules/zoneinfo/right/Pacific/Efate
vf107/dxmodules/zoneinfo/right/Pacific/Enderbury
vf107/dxmodules/zoneinfo/right/Pacific/Fakaofo
vf107/dxmodules/zoneinfo/right/Pacific/Fiji
vf107/dxmodules/zoneinfo/right/Pacific/Funafuti
vf107/dxmodules/zoneinfo/right/Pacific/Galapagos
vf107/dxmodules/zoneinfo/right/Pacific/Gambier
vf107/dxmodules/zoneinfo/right/Pacific/Guadalcanal
vf107/dxmodules/zoneinfo/right/Pacific/Guam
vf107/dxmodules/zoneinfo/right/Pacific/Honolulu
vf107/dxmodules/zoneinfo/right/Pacific/Johnston
vf107/dxmodules/zoneinfo/right/Pacific/Kiritimati
vf107/dxmodules/zoneinfo/right/Pacific/Kosrae
vf107/dxmodules/zoneinfo/right/Pacific/Kwajalein
vf107/dxmodules/zoneinfo/right/Pacific/Majuro
vf107/dxmodules/zoneinfo/right/Pacific/Marquesas
vf107/dxmodules/zoneinfo/right/Pacific/Midway
vf107/dxmodules/zoneinfo/right/Pacific/Nauru
vf107/dxmodules/zoneinfo/right/Pacific/Niue
vf107/dxmodules/zoneinfo/right/Pacific/Norfolk
vf107/dxmodules/zoneinfo/right/Pacific/Noumea
vf107/dxmodules/zoneinfo/right/Pacific/Pago_Pago
vf107/dxmodules/zoneinfo/right/Pacific/Palau
vf107/dxmodules/zoneinfo/right/Pacific/Pitcairn
vf107/dxmodules/zoneinfo/right/Pacific/Pohnpei
vf107/dxmodules/zoneinfo/right/Pacific/Ponape
vf107/dxmodules/zoneinfo/right/Pacific/Port_Moresby
vf107/dxmodules/zoneinfo/right/Pacific/Rarotonga
vf107/dxmodules/zoneinfo/right/Pacific/Saipan
vf107/dxmodules/zoneinfo/right/Pacific/Samoa
vf107/dxmodules/zoneinfo/right/Pacific/Tahiti
vf107/dxmodules/zoneinfo/right/Pacific/Tarawa
vf107/dxmodules/zoneinfo/right/Pacific/Tongatapu
vf107/dxmodules/zoneinfo/right/Pacific/Truk
vf107/dxmodules/zoneinfo/right/Pacific/Wake
vf107/dxmodules/zoneinfo/right/Pacific/Wallis
vf107/dxmodules/zoneinfo/right/Pacific/Yap
vf107/dxmodules/zoneinfo/right/Poland
vf107/dxmodules/zoneinfo/right/Portugal
vf107/dxmodules/zoneinfo/right/ROC
vf107/dxmodules/zoneinfo/right/ROK
vf107/dxmodules/zoneinfo/right/Singapore
vf107/dxmodules/zoneinfo/right/Turkey
vf107/dxmodules/zoneinfo/right/UCT
vf107/dxmodules/zoneinfo/right/US/Alaska
vf107/dxmodules/zoneinfo/right/US/Aleutian
vf107/dxmodules/zoneinfo/right/US/Arizona
vf107/dxmodules/zoneinfo/right/US/Central
vf107/dxmodules/zoneinfo/right/US/East-Indiana
vf107/dxmodules/zoneinfo/right/US/Eastern
vf107/dxmodules/zoneinfo/right/US/Hawaii
vf107/dxmodules/zoneinfo/right/US/Indiana-Starke
vf107/dxmodules/zoneinfo/right/US/Michigan
vf107/dxmodules/zoneinfo/right/US/Mountain
vf107/dxmodules/zoneinfo/right/US/Pacific
vf107/dxmodules/zoneinfo/right/US/Samoa
vf107/dxmodules/zoneinfo/right/UTC
vf107/dxmodules/zoneinfo/right/Universal
vf107/dxmodules/zoneinfo/right/W-SU
vf107/dxmodules/zoneinfo/right/WET
vf107/dxmodules/zoneinfo/right/Zulu
vf107/dxmodules/zoneinfo/tzdata.zi
vf107/dxmodules/zoneinfo/zone.tab
vf107/dxmodules/zoneinfo/zone1970.tab
vf107/resource/CN/wav/access_f.wav
vf107/resource/CN/wav/access_s.wav
vf107/resource/CN/wav/btn11.wav
vf107/resource/CN/wav/btn12.wav
vf107/resource/CN/wav/btn13.wav
vf107/resource/CN/wav/btn21.wav
vf107/resource/CN/wav/btn22.wav
vf107/resource/CN/wav/btn23.wav
vf107/resource/CN/wav/btn31.wav
vf107/resource/CN/wav/btn32.wav
vf107/resource/CN/wav/btn33.wav
vf107/resource/CN/wav/calibration_s.wav
vf107/resource/CN/wav/control_f.wav
vf107/resource/CN/wav/door_close.wav
vf107/resource/CN/wav/door_open.wav
vf107/resource/CN/wav/emergency.wav
vf107/resource/CN/wav/emergency_f.wav
vf107/resource/CN/wav/emergency_s.wav
vf107/resource/CN/wav/failed.wav
vf107/resource/CN/wav/light_close.wav
vf107/resource/CN/wav/light_open.wav
vf107/resource/CN/wav/network.wav
vf107/resource/CN/wav/read.wav
vf107/resource/CN/wav/recg_f.wav
vf107/resource/CN/wav/recg_s.wav
vf107/resource/CN/wav/recognition.wav
vf107/resource/CN/wav/recognition_s.wav
vf107/resource/CN/wav/register.wav
vf107/resource/CN/wav/stranger.wav
vf107/resource/CN/wav/user2.wav
vf107/resource/CN/wav/user2_s.wav
vf107/resource/CN/wav/verify.wav
vf107/resource/CN/wav/verify_10x_f.wav
vf107/resource/CN/wav/verify_10x_s.wav
vf107/resource/CN/wav/verify_200_f.wav
vf107/resource/CN/wav/verify_200_s.wav
vf107/resource/CN/wav/verify_300_f.wav
vf107/resource/CN/wav/verify_300_s.wav
vf107/resource/CN/wav/verify_400_f.wav
vf107/resource/CN/wav/verify_400_s.wav
vf107/resource/EN/wav/calibration_s.wav
vf107/resource/EN/wav/network.wav
vf107/resource/EN/wav/read.wav
vf107/resource/EN/wav/recg_f.wav
vf107/resource/EN/wav/recg_s.wav
vf107/resource/EN/wav/recognition.wav
vf107/resource/EN/wav/recognition_s.wav
vf107/resource/EN/wav/register.wav
vf107/resource/EN/wav/stranger.wav
vf107/resource/EN/wav/verify.wav
vf107/resource/EN/wav/verify_10x_f.wav
vf107/resource/EN/wav/verify_10x_s.wav
vf107/resource/EN/wav/verify_200_f.wav
vf107/resource/EN/wav/verify_200_s.wav
vf107/resource/EN/wav/verify_300_f.wav
vf107/resource/EN/wav/verify_300_s.wav
vf107/resource/EN/wav/verify_400_f.wav
vf107/resource/EN/wav/verify_400_s.wav
vf107/resource/font/AlibabaPuHuiTi-3-65-Medium.ttf
vf107/resource/font/Arabic.ttf
vf107/resource/font/Korean.ttf
vf107/resource/i18n/CN.json
vf107/resource/i18n/EN.json
vf107/resource/image/4g.png
vf107/resource/image/4g_dark.png
vf107/resource/image/accessCtrl.png
vf107/resource/image/add.png
vf107/resource/image/advance.png
vf107/resource/image/app.png
vf107/resource/image/app_btn.png
vf107/resource/image/app_qrcode.png
vf107/resource/image/arrow_right.png
vf107/resource/image/back.png
vf107/resource/image/back_2.png
vf107/resource/image/background.jpg
vf107/resource/image/backspace.png
vf107/resource/image/basic.png
vf107/resource/image/black_btn.png
vf107/resource/image/card.png
vf107/resource/image/close.png
vf107/resource/image/close_small.png
vf107/resource/image/cloudCert.png
vf107/resource/image/co2_f.png
vf107/resource/image/co2_s.png
vf107/resource/image/commMgmt.png
vf107/resource/image/config.png
vf107/resource/image/config_btn.png
vf107/resource/image/delete.png
vf107/resource/image/delete_fill.png
vf107/resource/image/devInfo.png
vf107/resource/image/deviceInfo.png
vf107/resource/image/doorControl.png
vf107/resource/image/down.png
vf107/resource/image/emergencyOpen.png
vf107/resource/image/empty.png
vf107/resource/image/enter.png
vf107/resource/image/enter_b.png
vf107/resource/image/eth_disable.png
vf107/resource/image/eth_enable.png
vf107/resource/image/ethernet.png
vf107/resource/image/ethernet_dark.png
vf107/resource/image/eye-fill.png
vf107/resource/image/eye-off.png
vf107/resource/image/eye_fill.png
vf107/resource/image/eye_fill_show.png
vf107/resource/image/face.png
vf107/resource/image/faceAdd.png
vf107/resource/image/faceEmpty.png
vf107/resource/image/faceError.png
vf107/resource/image/faceRec.png
vf107/resource/image/faceRec2.png
vf107/resource/image/factoryTest.png
vf107/resource/image/failBg.png
vf107/resource/image/grey_btn.png
vf107/resource/image/help.png
vf107/resource/image/idleImage.jpg
vf107/resource/image/input_bg.png
vf107/resource/image/light_close.png
vf107/resource/image/light_open.png
vf107/resource/image/localUser.png
vf107/resource/image/lock.png
vf107/resource/image/logo.png
vf107/resource/image/menu_btn.png
vf107/resource/image/mini_app.png
vf107/resource/image/mini_background.png
vf107/resource/image/mini_config.png
vf107/resource/image/mini_password.png
vf107/resource/image/mqtt.png
vf107/resource/image/mqtt_dark.png
vf107/resource/image/mqtt_enable.png
vf107/resource/image/network.png
vf107/resource/image/networkSetting.png
vf107/resource/image/network_dark.png
vf107/resource/image/o2_f.png
vf107/resource/image/o2_s.png
vf107/resource/image/ph3_f.png
vf107/resource/image/ph3_s.png
vf107/resource/image/pwd_btn.png
vf107/resource/image/qrcode_small.png
vf107/resource/image/recQuery.png
vf107/resource/image/recordQuery.png
vf107/resource/image/rectangle.png
vf107/resource/image/register.png
vf107/resource/image/right.png
vf107/resource/image/select_arrow.png
vf107/resource/image/setting.png
vf107/resource/image/setting32.png
vf107/resource/image/space.png
vf107/resource/image/successBg.png
vf107/resource/image/success_fill.png
vf107/resource/image/sysSettings.png
vf107/resource/image/sys_info.png
vf107/resource/image/systemSetting.png
vf107/resource/image/title_bg.png
vf107/resource/image/trackFace.png
vf107/resource/image/unlock.png
vf107/resource/image/user.png
vf107/resource/image/userGuide.png
vf107/resource/image/userMgmt.png
vf107/resource/image/user_1.png
vf107/resource/image/user_f.png
vf107/resource/image/user_s.png
vf107/resource/image/user_w.png
vf107/resource/image/vf105/4g.png
vf107/resource/image/vf105/4g_dark.png
vf107/resource/image/vf105/accessCtrl.png
vf107/resource/image/vf105/add.png
vf107/resource/image/vf105/advance.png
vf107/resource/image/vf105/app.png
vf107/resource/image/vf105/app_btn.png
vf107/resource/image/vf105/app_qrcode.png
vf107/resource/image/vf105/arrow_right.png
vf107/resource/image/vf105/back.png
vf107/resource/image/vf105/back_2.png
vf107/resource/image/vf105/background.jpg
vf107/resource/image/vf105/backspace.png
vf107/resource/image/vf105/basic.png
vf107/resource/image/vf105/black_btn.png
vf107/resource/image/vf105/card.png
vf107/resource/image/vf105/close.png
vf107/resource/image/vf105/close_small.png
vf107/resource/image/vf105/cloudCert.png
vf107/resource/image/vf105/commMgmt.png
vf107/resource/image/vf105/config.png
vf107/resource/image/vf105/config_btn.png
vf107/resource/image/vf105/delete.png
vf107/resource/image/vf105/delete_fill.png
vf107/resource/image/vf105/devInfo.png
vf107/resource/image/vf105/developer.png
vf107/resource/image/vf105/deviceInfo.png
vf107/resource/image/vf105/doorControl.png
vf107/resource/image/vf105/down.png
vf107/resource/image/vf105/empty.png
vf107/resource/image/vf105/enter.png
vf107/resource/image/vf105/enter_b.png
vf107/resource/image/vf105/eth_disable.png
vf107/resource/image/vf105/eth_enable.png
vf107/resource/image/vf105/ethernet.png
vf107/resource/image/vf105/ethernet_dark.png
vf107/resource/image/vf105/eye-fill.png
vf107/resource/image/vf105/eye-off.png
vf107/resource/image/vf105/eye_fill.png
vf107/resource/image/vf105/eye_fill_show.png
vf107/resource/image/vf105/face.png
vf107/resource/image/vf105/faceAdd.png
vf107/resource/image/vf105/faceEmpty.png
vf107/resource/image/vf105/faceError.png
vf107/resource/image/vf105/faceRec.png
vf107/resource/image/vf105/faceRec2.png
vf107/resource/image/vf105/factoryTest.png
vf107/resource/image/vf105/failBg.png
vf107/resource/image/vf105/fingerBoxF.png
vf107/resource/image/vf105/fingerBoxS.png
vf107/resource/image/vf105/fingerRe0.png
vf107/resource/image/vf105/fingerRe1.png
vf107/resource/image/vf105/fingerRe2.png
vf107/resource/image/vf105/fingerRe3.png
vf107/resource/image/vf105/grey_btn.png
vf107/resource/image/vf105/help.png
vf107/resource/image/vf105/idleImage.jpg
vf107/resource/image/vf105/idleImage.png
vf107/resource/image/vf105/localUser.png
vf107/resource/image/vf105/lock.png
vf107/resource/image/vf105/menu_btn.png
vf107/resource/image/vf105/mini_app.png
vf107/resource/image/vf105/mini_background.png
vf107/resource/image/vf105/mini_config.png
vf107/resource/image/vf105/mini_password.png
vf107/resource/image/vf105/mqtt.png
vf107/resource/image/vf105/mqtt_dark.png
vf107/resource/image/vf105/network.png
vf107/resource/image/vf105/networkSetting.png
vf107/resource/image/vf105/network_dark.png
vf107/resource/image/vf105/pwd_btn.png
vf107/resource/image/vf105/qrcode_small.png
vf107/resource/image/vf105/recQuery.png
vf107/resource/image/vf105/recordQuery.png
vf107/resource/image/vf105/rectangle.png
vf107/resource/image/vf105/register.png
vf107/resource/image/vf105/right.png
vf107/resource/image/vf105/select_arrow.png
vf107/resource/image/vf105/setting.png
vf107/resource/image/vf105/setting32.png
vf107/resource/image/vf105/space.png
vf107/resource/image/vf105/successBg.png
vf107/resource/image/vf105/success_fill.png
vf107/resource/image/vf105/sysSettings.png
vf107/resource/image/vf105/sys_info.png
vf107/resource/image/vf105/systemSetting.png
vf107/resource/image/vf105/trackFace.png
vf107/resource/image/vf105/unlock.png
vf107/resource/image/vf105/user.png
vf107/resource/image/vf105/userGuide.png
vf107/resource/image/vf105/userMgmt.png
vf107/resource/image/vf105/vip.png
vf107/resource/image/vf105/voiceBroadcast.png
vf107/resource/image/vf105/wechat.png
vf107/resource/image/vf105/wifi.png
vf107/resource/image/vf105/wifi_dark.png
vf107/resource/image/vf114/4g.png
vf107/resource/image/vf114/4g_dark.png
vf107/resource/image/vf114/accessCtrl.png
vf107/resource/image/vf114/add.png
vf107/resource/image/vf114/advance.png
vf107/resource/image/vf114/app.png
vf107/resource/image/vf114/app_btn.png
vf107/resource/image/vf114/app_qrcode.png
vf107/resource/image/vf114/arrow_right.png
vf107/resource/image/vf114/back.png
vf107/resource/image/vf114/back_2.png
vf107/resource/image/vf114/background.jpg
vf107/resource/image/vf114/backspace.png
vf107/resource/image/vf114/basic.png
vf107/resource/image/vf114/black_btn.png
vf107/resource/image/vf114/card.png
vf107/resource/image/vf114/close.png
vf107/resource/image/vf114/close_small.png
vf107/resource/image/vf114/cloudCert.png
vf107/resource/image/vf114/commMgmt.png
vf107/resource/image/vf114/config.png
vf107/resource/image/vf114/config_btn.png
vf107/resource/image/vf114/delete.png
vf107/resource/image/vf114/delete_fill.png
vf107/resource/image/vf114/devInfo.png
vf107/resource/image/vf114/developer.png
vf107/resource/image/vf114/deviceInfo.png
vf107/resource/image/vf114/doorControl.png
vf107/resource/image/vf114/down.png
vf107/resource/image/vf114/empty.png
vf107/resource/image/vf114/enter.png
vf107/resource/image/vf114/enter_b.png
vf107/resource/image/vf114/eth_disable.png
vf107/resource/image/vf114/eth_enable.png
vf107/resource/image/vf114/ethernet.png
vf107/resource/image/vf114/ethernet_dark.png
vf107/resource/image/vf114/eye-fill.png
vf107/resource/image/vf114/eye-off.png
vf107/resource/image/vf114/eye_fill.png
vf107/resource/image/vf114/eye_fill_show.png
vf107/resource/image/vf114/face.png
vf107/resource/image/vf114/faceAdd.png
vf107/resource/image/vf114/faceEmpty.png
vf107/resource/image/vf114/faceError.png
vf107/resource/image/vf114/faceRec.png
vf107/resource/image/vf114/faceRec2.png
vf107/resource/image/vf114/factoryTest.png
vf107/resource/image/vf114/failBg.png
vf107/resource/image/vf114/fingerBoxF.png
vf107/resource/image/vf114/fingerBoxS.png
vf107/resource/image/vf114/fingerRe0.png
vf107/resource/image/vf114/fingerRe1.png
vf107/resource/image/vf114/fingerRe2.png
vf107/resource/image/vf114/fingerRe3.png
vf107/resource/image/vf114/grey_btn.png
vf107/resource/image/vf114/help.png
vf107/resource/image/vf114/idleImage.jpg
vf107/resource/image/vf114/idleImage.png
vf107/resource/image/vf114/localUser.png
vf107/resource/image/vf114/lock.png
vf107/resource/image/vf114/menu_btn.png
vf107/resource/image/vf114/mini_app.png
vf107/resource/image/vf114/mini_background.png
vf107/resource/image/vf114/mini_config.png
vf107/resource/image/vf114/mini_password.png
vf107/resource/image/vf114/mqtt.png
vf107/resource/image/vf114/mqtt_dark.png
vf107/resource/image/vf114/network.png
vf107/resource/image/vf114/networkSetting.png
vf107/resource/image/vf114/network_dark.png
vf107/resource/image/vf114/pwd_btn.png
vf107/resource/image/vf114/qrcode_small.png
vf107/resource/image/vf114/recQuery.png
vf107/resource/image/vf114/recordQuery.png
vf107/resource/image/vf114/rectangle.png
vf107/resource/image/vf114/register.png
vf107/resource/image/vf114/right.png
vf107/resource/image/vf114/select_arrow.png
vf107/resource/image/vf114/setting.png
vf107/resource/image/vf114/setting32.png
vf107/resource/image/vf114/space.png
vf107/resource/image/vf114/successBg.png
vf107/resource/image/vf114/success_fill.png
vf107/resource/image/vf114/sysSettings.png
vf107/resource/image/vf114/sys_info.png
vf107/resource/image/vf114/systemSetting.png
vf107/resource/image/vf114/trackFace.png
vf107/resource/image/vf114/unlock.png
vf107/resource/image/vf114/user.png
vf107/resource/image/vf114/userGuide.png
vf107/resource/image/vf114/userMgmt.png
vf107/resource/image/vf114/vip.png
vf107/resource/image/vf114/voiceBroadcast.png
vf107/resource/image/vf114/wechat.png
vf107/resource/image/vf114/wifi.png
vf107/resource/image/vf114/wifi_dark.png
vf107/resource/image/vf202/4g.png
vf107/resource/image/vf202/4g_dark.png
vf107/resource/image/vf202/accessCtrl.png
vf107/resource/image/vf202/add.png
vf107/resource/image/vf202/advance.png
vf107/resource/image/vf202/app.png
vf107/resource/image/vf202/app_btn.png
vf107/resource/image/vf202/app_qrcode.png
vf107/resource/image/vf202/arrow_right.png
vf107/resource/image/vf202/back.png
vf107/resource/image/vf202/back_2.png
vf107/resource/image/vf202/background.jpg
vf107/resource/image/vf202/backspace.png
vf107/resource/image/vf202/basic.png
vf107/resource/image/vf202/black_btn.png
vf107/resource/image/vf202/card.png
vf107/resource/image/vf202/close.png
vf107/resource/image/vf202/close_small.png
vf107/resource/image/vf202/cloudCert.png
vf107/resource/image/vf202/commMgmt.png
vf107/resource/image/vf202/config.png
vf107/resource/image/vf202/config_btn.png
vf107/resource/image/vf202/delete.png
vf107/resource/image/vf202/delete_fill.png
vf107/resource/image/vf202/devInfo.png
vf107/resource/image/vf202/developer.png
vf107/resource/image/vf202/deviceInfo.png
vf107/resource/image/vf202/doorControl.png
vf107/resource/image/vf202/down.png
vf107/resource/image/vf202/empty.png
vf107/resource/image/vf202/enter.png
vf107/resource/image/vf202/enter_b.png
vf107/resource/image/vf202/eth_disable.png
vf107/resource/image/vf202/eth_enable.png
vf107/resource/image/vf202/ethernet.png
vf107/resource/image/vf202/ethernet_dark.png
vf107/resource/image/vf202/eye-fill.png
vf107/resource/image/vf202/eye-off.png
vf107/resource/image/vf202/eye_fill.png
vf107/resource/image/vf202/eye_fill_show.png
vf107/resource/image/vf202/face.png
vf107/resource/image/vf202/faceAdd.png
vf107/resource/image/vf202/faceEmpty.png
vf107/resource/image/vf202/faceError.png
vf107/resource/image/vf202/faceRec.png
vf107/resource/image/vf202/faceRec2.png
vf107/resource/image/vf202/factoryTest.png
vf107/resource/image/vf202/failBg.png
vf107/resource/image/vf202/grey_btn.png
vf107/resource/image/vf202/help.png
vf107/resource/image/vf202/idleImage.jpg
vf107/resource/image/vf202/idleImage.png
vf107/resource/image/vf202/localUser.png
vf107/resource/image/vf202/lock.png
vf107/resource/image/vf202/menu_btn.png
vf107/resource/image/vf202/mini_app.png
vf107/resource/image/vf202/mini_background.png
vf107/resource/image/vf202/mini_config.png
vf107/resource/image/vf202/mini_password.png
vf107/resource/image/vf202/mqtt.png
vf107/resource/image/vf202/mqtt_dark.png
vf107/resource/image/vf202/network.png
vf107/resource/image/vf202/networkSetting.png
vf107/resource/image/vf202/network_dark.png
vf107/resource/image/vf202/pwd_btn.png
vf107/resource/image/vf202/qrcode_small.png
vf107/resource/image/vf202/recQuery.png
vf107/resource/image/vf202/recordQuery.png
vf107/resource/image/vf202/rectangle.png
vf107/resource/image/vf202/register.png
vf107/resource/image/vf202/right.png
vf107/resource/image/vf202/select_arrow.png
vf107/resource/image/vf202/setting.png
vf107/resource/image/vf202/setting32.png
vf107/resource/image/vf202/space.png
vf107/resource/image/vf202/successBg.png
vf107/resource/image/vf202/success_fill.png
vf107/resource/image/vf202/sysSettings.png
vf107/resource/image/vf202/sys_info.png
vf107/resource/image/vf202/systemSetting.png
vf107/resource/image/vf202/tip_card.png
vf107/resource/image/vf202/trackFace.png
vf107/resource/image/vf202/unlock.png
vf107/resource/image/vf202/user.png
vf107/resource/image/vf202/userGuide.png
vf107/resource/image/vf202/userMgmt.png
vf107/resource/image/vf202/vip.png
vf107/resource/image/vf202/voiceBroadcast.png
vf107/resource/image/vf202/wechat.png
vf107/resource/image/vf202/wifi.png
vf107/resource/image/vf202/wifi_dark.png
vf107/resource/image/vf203/4g.png
vf107/resource/image/vf203/4g_dark.png
vf107/resource/image/vf203/accessCtrl.png
vf107/resource/image/vf203/add.png
vf107/resource/image/vf203/advance.png
vf107/resource/image/vf203/app.png
vf107/resource/image/vf203/app_btn.png
vf107/resource/image/vf203/app_qrcode.png
vf107/resource/image/vf203/arrow_right.png
vf107/resource/image/vf203/back.png
vf107/resource/image/vf203/back_2.png
vf107/resource/image/vf203/background.jpg
vf107/resource/image/vf203/backspace.png
vf107/resource/image/vf203/basic.png
vf107/resource/image/vf203/black_btn.png
vf107/resource/image/vf203/card.png
vf107/resource/image/vf203/close.png
vf107/resource/image/vf203/close_small.png
vf107/resource/image/vf203/cloudCert.png
vf107/resource/image/vf203/commMgmt.png
vf107/resource/image/vf203/config.png
vf107/resource/image/vf203/config_btn.png
vf107/resource/image/vf203/delete.png
vf107/resource/image/vf203/delete_fill.png
vf107/resource/image/vf203/devInfo.png
vf107/resource/image/vf203/developer.png
vf107/resource/image/vf203/deviceInfo.png
vf107/resource/image/vf203/doorControl.png
vf107/resource/image/vf203/down.png
vf107/resource/image/vf203/empty.png
vf107/resource/image/vf203/enter.png
vf107/resource/image/vf203/enter_b.png
vf107/resource/image/vf203/eth_disable.png
vf107/resource/image/vf203/eth_enable.png
vf107/resource/image/vf203/ethernet.png
vf107/resource/image/vf203/ethernet_dark.png
vf107/resource/image/vf203/eye-fill.png
vf107/resource/image/vf203/eye-off.png
vf107/resource/image/vf203/eye_fill.png
vf107/resource/image/vf203/eye_fill_show.png
vf107/resource/image/vf203/face.png
vf107/resource/image/vf203/faceAdd.png
vf107/resource/image/vf203/faceEmpty.png
vf107/resource/image/vf203/faceError.png
vf107/resource/image/vf203/faceRec.png
vf107/resource/image/vf203/faceRec2.png
vf107/resource/image/vf203/factoryTest.png
vf107/resource/image/vf203/failBg.png
vf107/resource/image/vf203/grey_btn.png
vf107/resource/image/vf203/help.png
vf107/resource/image/vf203/idleImage.jpg
vf107/resource/image/vf203/idleImage.png
vf107/resource/image/vf203/localUser.png
vf107/resource/image/vf203/lock.png
vf107/resource/image/vf203/menu_btn.png
vf107/resource/image/vf203/mini_app.png
vf107/resource/image/vf203/mini_background.png
vf107/resource/image/vf203/mini_config.png
vf107/resource/image/vf203/mini_password.png
vf107/resource/image/vf203/mqtt.png
vf107/resource/image/vf203/mqtt_dark.png
vf107/resource/image/vf203/network.png
vf107/resource/image/vf203/networkSetting.png
vf107/resource/image/vf203/network_dark.png
vf107/resource/image/vf203/pwd_btn.png
vf107/resource/image/vf203/qrcode_small.png
vf107/resource/image/vf203/recQuery.png
vf107/resource/image/vf203/recordQuery.png
vf107/resource/image/vf203/rectangle.png
vf107/resource/image/vf203/register.png
vf107/resource/image/vf203/right.png
vf107/resource/image/vf203/select_arrow.png
vf107/resource/image/vf203/setting.png
vf107/resource/image/vf203/setting32.png
vf107/resource/image/vf203/space.png
vf107/resource/image/vf203/successBg.png
vf107/resource/image/vf203/success_fill.png
vf107/resource/image/vf203/sysSettings.png
vf107/resource/image/vf203/sys_info.png
vf107/resource/image/vf203/systemSetting.png
vf107/resource/image/vf203/trackFace.png
vf107/resource/image/vf203/unlock.png
vf107/resource/image/vf203/user.png
vf107/resource/image/vf203/userGuide.png
vf107/resource/image/vf203/userMgmt.png
vf107/resource/image/vf203/vip.png
vf107/resource/image/vf203/voiceBroadcast.png
vf107/resource/image/vf203/wechat.png
vf107/resource/image/vf203/wifi.png
vf107/resource/image/vf203/wifi_dark.png
vf107/resource/image/view_f.png
vf107/resource/image/view_s.png
vf107/resource/image/vip.png
vf107/resource/image/voiceBroadcast.png
vf107/resource/image/wifi.png
vf107/resource/image/wifi_dark.png
vf107/resource/langPack.js
vf107/resource/wav/AR/calibration_1s.wav
vf107/resource/wav/AR/calibration_2s.wav
vf107/resource/wav/AR/calibration_s.wav
vf107/resource/wav/AR/fingerF.wav
vf107/resource/wav/AR/fingerInput1.wav
vf107/resource/wav/AR/fingerInput2.wav
vf107/resource/wav/AR/fingerInput3.wav
vf107/resource/wav/AR/fingerR.wav
vf107/resource/wav/AR/fingerS.wav
vf107/resource/wav/AR/fingerT.wav
vf107/resource/wav/AR/read.wav
vf107/resource/wav/AR/recg_f.wav
vf107/resource/wav/AR/recg_s.wav
vf107/resource/wav/AR/recognition.wav
vf107/resource/wav/AR/recognition_s.wav
vf107/resource/wav/AR/register.wav
vf107/resource/wav/AR/stranger.wav
vf107/resource/wav/AR/verify.wav
vf107/resource/wav/AR/verify_f.wav
vf107/resource/wav/AR/verify_s.wav
vf107/resource/wav/CN/calibration_1s.wav
vf107/resource/wav/CN/calibration_2s.wav
vf107/resource/wav/CN/calibration_s.wav
vf107/resource/wav/CN/fingerF.wav
vf107/resource/wav/CN/fingerInput1.wav
vf107/resource/wav/CN/fingerInput2.wav
vf107/resource/wav/CN/fingerInput3.wav
vf107/resource/wav/CN/fingerR.wav
vf107/resource/wav/CN/fingerS.wav
vf107/resource/wav/CN/fingerT.wav
vf107/resource/wav/CN/read.wav
vf107/resource/wav/CN/recg_f.wav
vf107/resource/wav/CN/recg_s.wav
vf107/resource/wav/CN/recognition.wav
vf107/resource/wav/CN/recognition_s.wav
vf107/resource/wav/CN/register.wav
vf107/resource/wav/CN/stranger.wav
vf107/resource/wav/CN/verify.wav
vf107/resource/wav/CN/verify_f.wav
vf107/resource/wav/CN/verify_s.wav
vf107/resource/wav/DE/calibration_1s.wav
vf107/resource/wav/DE/calibration_2s.wav
vf107/resource/wav/DE/calibration_s.wav
vf107/resource/wav/DE/fingerF.wav
vf107/resource/wav/DE/fingerInput1.wav
vf107/resource/wav/DE/fingerInput2.wav
vf107/resource/wav/DE/fingerInput3.wav
vf107/resource/wav/DE/fingerR.wav
vf107/resource/wav/DE/fingerS.wav
vf107/resource/wav/DE/fingerT.wav
vf107/resource/wav/DE/read.wav
vf107/resource/wav/DE/recg_f.wav
vf107/resource/wav/DE/recg_s.wav
vf107/resource/wav/DE/recognition.wav
vf107/resource/wav/DE/recognition_s.wav
vf107/resource/wav/DE/register.wav
vf107/resource/wav/DE/stranger.wav
vf107/resource/wav/DE/verify.wav
vf107/resource/wav/DE/verify_f.wav
vf107/resource/wav/DE/verify_s.wav
vf107/resource/wav/EN/calibration_1s.wav
vf107/resource/wav/EN/calibration_2s.wav
vf107/resource/wav/EN/calibration_s.wav
vf107/resource/wav/EN/fingerF.wav
vf107/resource/wav/EN/fingerInput1.wav
vf107/resource/wav/EN/fingerInput2.wav
vf107/resource/wav/EN/fingerInput3.wav
vf107/resource/wav/EN/fingerR.wav
vf107/resource/wav/EN/fingerS.wav
vf107/resource/wav/EN/fingerT.wav
vf107/resource/wav/EN/read.wav
vf107/resource/wav/EN/recg_f.wav
vf107/resource/wav/EN/recg_s.wav
vf107/resource/wav/EN/recognition.wav
vf107/resource/wav/EN/recognition_s.wav
vf107/resource/wav/EN/register.wav
vf107/resource/wav/EN/stranger.wav
vf107/resource/wav/EN/verify.wav
vf107/resource/wav/EN/verify_f.wav
vf107/resource/wav/EN/verify_s.wav
vf107/resource/wav/ES/calibration_1s.wav
vf107/resource/wav/ES/calibration_2s.wav
vf107/resource/wav/ES/calibration_s.wav
vf107/resource/wav/ES/fingerF.wav
vf107/resource/wav/ES/fingerInput1.wav
vf107/resource/wav/ES/fingerInput2.wav
vf107/resource/wav/ES/fingerInput3.wav
vf107/resource/wav/ES/fingerR.wav
vf107/resource/wav/ES/fingerS.wav
vf107/resource/wav/ES/fingerT.wav
vf107/resource/wav/ES/read.wav
vf107/resource/wav/ES/recg_f.wav
vf107/resource/wav/ES/recg_s.wav
vf107/resource/wav/ES/recognition.wav
vf107/resource/wav/ES/recognition_s.wav
vf107/resource/wav/ES/register.wav
vf107/resource/wav/ES/stranger.wav
vf107/resource/wav/ES/verify.wav
vf107/resource/wav/ES/verify_f.wav
vf107/resource/wav/ES/verify_s.wav
vf107/resource/wav/FR/calibration_1s.wav
vf107/resource/wav/FR/calibration_2s.wav
vf107/resource/wav/FR/calibration_s.wav
vf107/resource/wav/FR/fingerF.wav
vf107/resource/wav/FR/fingerInput1.wav
vf107/resource/wav/FR/fingerInput2.wav
vf107/resource/wav/FR/fingerInput3.wav
vf107/resource/wav/FR/fingerR.wav
vf107/resource/wav/FR/fingerS.wav
vf107/resource/wav/FR/fingerT.wav
vf107/resource/wav/FR/read.wav
vf107/resource/wav/FR/recg_f.wav
vf107/resource/wav/FR/recg_s.wav
vf107/resource/wav/FR/recognition.wav
vf107/resource/wav/FR/recognition_s.wav
vf107/resource/wav/FR/register.wav
vf107/resource/wav/FR/stranger.wav
vf107/resource/wav/FR/verify.wav
vf107/resource/wav/FR/verify_f.wav
vf107/resource/wav/FR/verify_s.wav
vf107/resource/wav/KO/.DS_Store
vf107/resource/wav/KO/calibration_1s.wav
vf107/resource/wav/KO/calibration_2s.wav
vf107/resource/wav/KO/calibration_s.wav
vf107/resource/wav/KO/fingerF.wav
vf107/resource/wav/KO/fingerInput1.wav
vf107/resource/wav/KO/fingerInput2.wav
vf107/resource/wav/KO/fingerInput3.wav
vf107/resource/wav/KO/fingerR.wav
vf107/resource/wav/KO/fingerS.wav
vf107/resource/wav/KO/fingerT.wav
vf107/resource/wav/KO/read.wav
vf107/resource/wav/KO/recg_f.wav
vf107/resource/wav/KO/recg_s.wav
vf107/resource/wav/KO/recognition.wav
vf107/resource/wav/KO/recognition_s.wav
vf107/resource/wav/KO/register.wav
vf107/resource/wav/KO/stranger.wav
vf107/resource/wav/KO/verify.wav
vf107/resource/wav/KO/verify_f.wav
vf107/resource/wav/KO/verify_s.wav
vf107/resource/wav/PT/calibration_1s.wav
vf107/resource/wav/PT/calibration_2s.wav
vf107/resource/wav/PT/calibration_s.wav
vf107/resource/wav/PT/fingerF.wav
vf107/resource/wav/PT/fingerInput1.wav
vf107/resource/wav/PT/fingerInput2.wav
vf107/resource/wav/PT/fingerInput3.wav
vf107/resource/wav/PT/fingerR.wav
vf107/resource/wav/PT/fingerS.wav
vf107/resource/wav/PT/fingerT.wav
vf107/resource/wav/PT/read.wav
vf107/resource/wav/PT/recg_f.wav
vf107/resource/wav/PT/recg_s.wav
vf107/resource/wav/PT/recognition.wav
vf107/resource/wav/PT/recognition_s.wav
vf107/resource/wav/PT/register.wav
vf107/resource/wav/PT/stranger.wav
vf107/resource/wav/PT/verify.wav
vf107/resource/wav/PT/verify_f.wav
vf107/resource/wav/PT/verify_s.wav
vf107/resource/wav/RU/calibration_1s.wav
vf107/resource/wav/RU/calibration_2s.wav
vf107/resource/wav/RU/calibration_s.wav
vf107/resource/wav/RU/fingerF.wav
vf107/resource/wav/RU/fingerInput1.wav
vf107/resource/wav/RU/fingerInput2.wav
vf107/resource/wav/RU/fingerInput3.wav
vf107/resource/wav/RU/fingerR.wav
vf107/resource/wav/RU/fingerS.wav
vf107/resource/wav/RU/fingerT.wav
vf107/resource/wav/RU/read.wav
vf107/resource/wav/RU/recg_f.wav
vf107/resource/wav/RU/recg_s.wav
vf107/resource/wav/RU/recognition.wav
vf107/resource/wav/RU/recognition_s.wav
vf107/resource/wav/RU/register.wav
vf107/resource/wav/RU/stranger.wav
vf107/resource/wav/RU/verify.wav
vf107/resource/wav/RU/verify_f.wav
vf107/resource/wav/RU/verify_s.wav
vf107/resource/wav/alarm.wav
vf107/resource/wav/success.wav
vf107/resource/wav/tamper.wav
vf107/resource/web/config.js
vf107/resource/web/css/app.7043d6da.css
vf107/resource/web/css/chunk-vendors.6b92dc4c.css
vf107/resource/web/favicon.ico
vf107/resource/web/fonts/element-icons.535877f5.woff
vf107/resource/web/fonts/element-icons.732389de.ttf
vf107/resource/web/img/bg.a32161db.png
vf107/resource/web/img/iconfont.675b1cb4.svg
vf107/resource/web/index.css
vf107/resource/web/index.html
vf107/resource/web/js/app.da6752e9.js
vf107/resource/web/js/app.da6752e9.js.map
vf107/resource/web/js/chunk-vendors.303b1624.js
vf107/resource/web/js/chunk-vendors.303b1624.js.map
vf107/src/common/consts/configConst.js
vf107/src/common/utils/codeUtils.js
vf107/src/common/utils/netUtils.js
vf107/src/common/utils/stringUtils.js
vf107/src/common/utils/tokenUtil.js
vf107/src/common/utils/utils.js
vf107/src/config.json
vf107/src/controller.js
vf107/src/driver.js
vf107/src/main.js
vf107/src/screen.js
vf107/src/service/accessService.js
vf107/src/service/api.js
vf107/src/service/codeService.js
vf107/src/service/configService.js
vf107/src/service/faceService.js
vf107/src/service/fingerService.js
vf107/src/service/gpiokeyService.js
vf107/src/service/grainService.js
vf107/src/service/httpService.js
vf107/src/service/mqttService.js
vf107/src/service/nfcService.js
vf107/src/service/sqliteService.js
vf107/src/service/uartBleService.js
vf107/src/service/uartCodeService.js
vf107/src/service/weComService.js
vf107/src/services.js
vf107/src/view/appView.js
vf107/src/view/config/configView.js
vf107/src/view/config/identityVerificationView.js
vf107/src/view/config/menu/cloudCertView.js
vf107/src/view/config/menu/developer/capcalView.js
vf107/src/view/config/menu/developerView.js
vf107/src/view/config/menu/deviceInfo/dataCapacityInfoView.js
vf107/src/view/config/menu/deviceInfo/systemInfoView.js
vf107/src/view/config/menu/deviceInfoView.js
vf107/src/view/config/menu/doorControlView.js
vf107/src/view/config/menu/helpView.js
vf107/src/view/config/menu/localUser/faceEnterView.js
vf107/src/view/config/menu/localUser/fingerApplyView.js
vf107/src/view/config/menu/localUser/fingerEnterView.js
vf107/src/view/config/menu/localUser/localUserAddView.js
vf107/src/view/config/menu/localUserView.js
vf107/src/view/config/menu/networkSettingView.js
vf107/src/view/config/menu/recordQuery/recordQueryDetailView.js
vf107/src/view/config/menu/recordQueryView.js
vf107/src/view/config/menu/systemSetting/displaySettingView.js
vf107/src/view/config/menu/systemSetting/faceRecognitionSettingView.js
vf107/src/view/config/menu/systemSetting/passLogSettingView.js
vf107/src/view/config/menu/systemSetting/passwordManagementView.js
vf107/src/view/config/menu/systemSetting/passwordOpenDoorSettingView.js
vf107/src/view/config/menu/systemSetting/swipeCardRecognitionSettingView.js
vf107/src/view/config/menu/systemSetting/timeSettingView.js
vf107/src/view/config/menu/systemSettingView.js
vf107/src/view/config/menu/voiceBroadcastView.js
vf107/src/view/config/newPwdView.js
vf107/src/view/emergencyPwdView.js
vf107/src/view/gasDetailView.js
vf107/src/view/i18n.js
vf107/src/view/idleView.js
vf107/src/view/mainView.js
vf107/src/view/pinyin/dict.js
vf107/src/view/pinyin/pinyin.js
vf107/src/view/pwdView.js
vf107/src/view/topView.js
vf107/src/view/viewUtils.js
vf107/src/view/wechatBindView.js
vf107/src/view/wechatFaceView.js
vf107/src/view/wechatNetView.js
vf107/src/worker/mqttWorker.js
vf107/src/worker/netWorker.js
vf107/src/worker/passRecordWorker.js
vf107/src/worker/screenWorker.js |