| 1 | 1 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,82 @@ |
| 1 |
+======= CHANGELOG ======= |
|
| 2 |
+ |
|
| 3 |
+Versions: |
|
| 4 |
+ |
|
| 5 |
+== 1.0.0 - 2022-01-27 == |
|
| 6 |
+* Initial release. |
|
| 7 |
+ |
|
| 8 |
+== 1.0.1 - 2022-03-03 == |
|
| 9 |
+* Added screenshot image and made minor text changes. |
|
| 10 |
+ |
|
| 11 |
+== 1.0.2 - 2022-03-04 == |
|
| 12 |
+* Changed screenshot image. |
|
| 13 |
+ |
|
| 14 |
+== 1.0.3 - 2022-03-30 == |
|
| 15 |
+* Changed presentation text. |
|
| 16 |
+ |
|
| 17 |
+== 1.0.4 - 2022-04-19 == |
|
| 18 |
+* Changed the URL of the pop-up window, to make it work when Nextcloud is served on a subdirectory. |
|
| 19 |
+* Changed image displayed on initial screen. |
|
| 20 |
+* Changed presentation text. |
|
| 21 |
+ |
|
| 22 |
+== 1.0.5 - 2022-05-09 == |
|
| 23 |
+* Changed syntax of SQL queries and encryption function. |
|
| 24 |
+* Modified pop-up window URL. |
|
| 25 |
+ |
|
| 26 |
+== 1.0.6 - 2022-08-20 == |
|
| 27 |
+* Changed presentation text. |
|
| 28 |
+ |
|
| 29 |
+== 1.0.7 - 2022-09-22 == |
|
| 30 |
+* Fixed error when not entering a STUN server on the Settings page. |
|
| 31 |
+* Changed presentation text. |
|
| 32 |
+ |
|
| 33 |
+== 1.0.8 - 2022-10-27 == |
|
| 34 |
+* Changed CSS settings to match the modifications introduced in Nextcloud 25. |
|
| 35 |
+* Modified presentation text. |
|
| 36 |
+ |
|
| 37 |
+== 1.0.9 - 2022-12-03 == |
|
| 38 |
+* Minor changes to certain SQL queries and minor css change. |
|
| 39 |
+ |
|
| 40 |
+== 1.1.0 - 2023-05-31 == |
|
| 41 |
+* Made app available for Nextcloud 26. |
|
| 42 |
+ |
|
| 43 |
+== 1.1.1 - 2023-10-30 == |
|
| 44 |
+* Marked the app as compatible with Nextcloud 27. |
|
| 45 |
+ |
|
| 46 |
+== 1.1.2 - 2024-01-08 == |
|
| 47 |
+* Added the debug logging checkbox, the 'Available phone number(s)' |
|
| 48 |
+ field and the 'Default phone number for outgoing calls' field, on the settings page. |
|
| 49 |
+* Added the 'From' drop-down list on the phone window, to allow the user to choose |
|
| 50 |
+ the phone number to call from. |
|
| 51 |
+* Added the 'fonts' directory and stored the 'Open Sans' and 'Inter' fonts inside it. |
|
| 52 |
+* Made small CSS changes and edited app presentation text. |
|
| 53 |
+* Marked the app as compatible with Nextcloud 28. |
|
| 54 |
+ |
|
| 55 |
+== 1.1.3 - 2024-01-10 == |
|
| 56 |
+* Fixed 'Double click to call' bug. |
|
| 57 |
+* Made minor CSS changes. |
|
| 58 |
+ |
|
| 59 |
+== 1.1.4 - 2024-05-20 == |
|
| 60 |
+* Added the 'Record' button to allow users to record phone conversations. |
|
| 61 |
+* Added the list of contacts and Nextcloud users with available phone numbers, |
|
| 62 |
+ so that the users can call them with one click. |
|
| 63 |
+* Upgraded the SIP.js library to version 0.15.6. |
|
| 64 |
+* Changed the look of the main window. |
|
| 65 |
+* Made changes so that it can be installed into a custom apps directory, |
|
| 66 |
+ like 'my_apps' or 'custom_apps', instead of 'apps'. |
|
| 67 |
+* Marked the app as compatible with Nextcloud 29. |
|
| 68 |
+ |
|
| 69 |
+== 1.1.5 - 2024-05-21 == |
|
| 70 |
+* Fixed issue related to non-null database columns. |
|
| 71 |
+ |
|
| 72 |
+== 1.1.6 - 2024-10-08 == |
|
| 73 |
+* Made minor CSS changes and marked the app as compatible with Nextcloud 30. |
|
| 74 |
+ |
|
| 75 |
+== 1.1.7 - 2024-12-07 == |
|
| 76 |
+* Fixed bug related to reading contacts data. |
|
| 77 |
+* Fixed start up issue in Chrome. |
|
| 78 |
+ |
|
| 79 |
+== 1.1.8 - 2025-03-10 == |
|
| 80 |
+* Modified how current user is obtained. |
|
| 81 |
+* Set timezone on app registration. |
|
| 82 |
+* Verfied compatibility with Nextcloud 31 and marked the app as compatible. |
| 0 | 83 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,98 @@ |
| 1 |
+<?xml version="1.0"?> |
|
| 2 |
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" |
|
| 3 |
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd"> |
|
| 4 |
+ <id>sip_trip_phone</id> |
|
| 5 |
+ <name>SIP Trip Phone</name> |
|
| 6 |
+ <summary>Browser softphone</summary> |
|
| 7 |
+ <description>< |
|
| 53 |
+ |
|
| 54 |
+### Donations |
|
| 55 |
+ |
|
| 56 |
+* 🎁 [Donate](https://www.doublebastion.com/donations/) |
|
| 57 |
+ |
|
| 58 |
+ ]]></description> |
|
| 59 |
+ <version>1.1.8</version> |
|
| 60 |
+ <licence>AGPL</licence> |
|
| 61 |
+ <author homepage="https://www.doublebastion.com">Double Bastion LLC</author> |
|
| 62 |
+ <namespace>SIPTripPhone</namespace> |
|
| 63 |
+ <documentation> |
|
| 64 |
+ <admin>https://www.doublebastion.com/install-nextcloud/#install-sip-trip-phone</admin> |
|
| 65 |
+ </documentation> |
|
| 66 |
+ <category>office</category> |
|
| 67 |
+ <category>organization</category> |
|
| 68 |
+ |
|
| 69 |
+ <website>https://www.doublebastion.com/sip-trip-phone/</website> |
|
| 70 |
+ <bugs>https://git.doublebastion.com/sip-trip-phone/issues/develop</bugs> |
|
| 71 |
+ <repository>https://git.doublebastion.com/sip-trip-phone/develop/</repository> |
|
| 72 |
+ |
|
| 73 |
+ <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_keypad.png</screenshot> |
|
| 74 |
+ <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_making_calls.png</screenshot> |
|
| 75 |
+ <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_holding.png</screenshot> |
|
| 76 |
+ <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_contacts_list.png</screenshot> |
|
| 77 |
+ <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_mobile_receive_calls.png</screenshot> |
|
| 78 |
+ <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_mobile_answered_call.png</screenshot> |
|
| 79 |
+ <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_mobile_contacts_list.png</screenshot> |
|
| 80 |
+ |
|
| 81 |
+ <dependencies> |
|
| 82 |
+ <nextcloud min-version="26" max-version="31" /> |
|
| 83 |
+ </dependencies> |
|
| 84 |
+ |
|
| 85 |
+ <navigations> |
|
| 86 |
+ <navigation> |
|
| 87 |
+ <name>SIP Trip Phone</name> |
|
| 88 |
+ <route>sip_trip_phone.page.index</route> |
|
| 89 |
+ <order>101</order> |
|
| 90 |
+ <icon>sip_trip_phone.svg</icon> |
|
| 91 |
+ </navigation> |
|
| 92 |
+ </navigations> |
|
| 93 |
+ |
|
| 94 |
+ <settings> |
|
| 95 |
+ <personal>OCA\SIPTripPhone\Settings\Personal</personal> |
|
| 96 |
+ <personal-section>OCA\SIPTripPhone\Settings\PersonalSection</personal-section> |
|
| 97 |
+ </settings> |
|
| 98 |
+</info> |
| 0 | 99 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,38 @@ |
| 1 |
+<?php |
|
| 2 |
+/** |
|
| 3 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
| 4 |
+ * |
|
| 5 |
+ * @author Double Bastion LLC |
|
| 6 |
+ * |
|
| 7 |
+ * @license GNU AGPL version 3 or any later version |
|
| 8 |
+ * |
|
| 9 |
+ * This program is free software; you can redistribute it and/or |
|
| 10 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
| 11 |
+ * License as published by the Free Software Foundation; either |
|
| 12 |
+ * version 3 of the License, or any later version. |
|
| 13 |
+ * |
|
| 14 |
+ * This program is distributed in the hope that it will be useful, |
|
| 15 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 16 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 17 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
| 18 |
+ * |
|
| 19 |
+ * You should have received a copy of the GNU Affero General Public |
|
| 20 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
| 21 |
+ * |
|
| 22 |
+ */ |
|
| 23 |
+ |
|
| 24 |
+declare(strict_types=1); |
|
| 25 |
+ |
|
| 26 |
+return [ |
|
| 27 |
+ 'routes' => [ |
|
| 28 |
+ // User views |
|
| 29 |
+ ['name' => 'page#index', 'url' => '/', 'verb' => 'GET'], |
|
| 30 |
+ ['name' => 'sphone#getappdirectory', 'url' => '/user/getappdirectory', 'verb' => 'GET'], |
|
| 31 |
+ // Settings |
|
| 32 |
+ ['name' => 'sphone#getsettings', 'url' => '/user/getsettings', 'verb' => 'GET'], |
|
| 33 |
+ ['name' => 'sphone#getsippass', 'url' => '/user/getsippass', 'verb' => 'GET'], |
|
| 34 |
+ ['name' => 'sphone#updatesettings', 'url' => '/user/updatesettings', 'verb' => 'PUT'], |
|
| 35 |
+ ['name' => 'sphone#getcontactsnmbrs', 'url' => '/user/getcontactsnmbrs', 'verb' => 'GET'] |
|
| 36 |
+ ] |
|
| 37 |
+]; |
|
| 38 |
+ |
| 0 | 39 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,441 @@ |
| 1 |
+{
|
|
| 2 |
+ "hashes": {
|
|
| 3 |
+ "CHANGELOG.txt": "eaad4087ac57384608e982dd77a6e5c135f8e3aa2ba9a5d68530090d67e750f4fb0f3ec4db3c7843f553e28faa7d67e0ffeff11adbd0f3fea047c2786504a98a", |
|
| 4 |
+ "COPYING.txt": "a0a86214ea153fb07ff35ceec0848dd1703eae22de036a825efc8394e50f65e3044832f3b49cf7e45a39edc470bdf738abc36a3a78ca7df3a6e73c14eaef94a8", |
|
| 5 |
+ "Contributors.txt": "8ab4ea9b8c38e4d115af6ca08e8e27592198b763982bd166b67f38ee0b9f2b7e093cd58ce0927ae38ee3bc015b129add2ffeb3967288c804da493241bc67ba9b", |
|
| 6 |
+ "README.md": "1dd270a0335705e9e3682a9c6a1a6b989120a71e3738db875d9a16af1f399e0f9fa0078493c8e0bf4f2d614a268ee4e3e0b4d66fb36333fc91502f4c38d8aadd", |
|
| 7 |
+ "appinfo\/info.xml": "7933be289c5630e5c1fc3c8fde8820b10e11bf26a73bc0ec1216687982fb091c92f7655f4b2c0ecfa8f41f3bb592c9c695ffcf90bb327726af0d97f724aa94b4", |
|
| 8 |
+ "appinfo\/routes.php": "15314d8453b018ed4c0a3c4bd351172552affcf14544d943f5e5ab296bc860abc67f8ec8fd6d946c5b407471ea4b51689d2def070dca52671ac77e7da743e053", |
|
| 9 |
+ "css\/style.css": "790bf3c5eaf74d8663bfadd8996dc4b7d79b8e8e07e51150a86461e385563944dbab67771f176c20c612280fbed809ac3be4601b9c538760fecb6917234de48f", |
|
| 10 |
+ "fonts\/Apache_License_v2.0_Open_Sans.txt": "fdae7ed259455ca9fa45939e7f25cbb4de29831cda16d9151de25a5f6e9d9be43b053f4fd3b896026239fca77abce04f543d591c501ecf4ce18c854bc0a51660", |
|
| 11 |
+ "fonts\/Inter-Bold.woff": "f34ed611dc0ba6e7c0bf7242bad7c02e09f208bfbdd21d6649ebf9b41bc06696d8856707851944786c80c718df455e619caab170c70bfe97ba2043d651d4532e", |
|
| 12 |
+ "fonts\/Inter-Bold.woff2": "736b4aaf8a2de0c17fbd5396a338577227326f078ee0646072d851d328b58a8058989af8735ac073f935b05f291d9310797d95c963e5e3ff0ea61a87f21c9da5", |
|
| 13 |
+ "fonts\/Inter-BoldItalic.woff": "619e398d37249fae96ba0deb06fcf5dab215ba888740024287e2c8f1278b33273124cd5b9ea8f7525a17657566b72a1661b688ca670bc068ca6ddf466b7e7ffe", |
|
| 14 |
+ "fonts\/Inter-BoldItalic.woff2": "a24bdb558a9b26fbe7631d6cf90b8db8f5f0164c3c814a2971fb7d45e807b0856454893bbd0d5bd0d9f060689f2be5f5bb1b69e4bdea0293d1122e13ad28e96f", |
|
| 15 |
+ "fonts\/Inter-ExtraBold.woff": "d527e43747abed5a13d49a70c8db7ef39aab35ab0accfe1e3f6e037f685e08d2e5f7552b40c75d4faecc0e7e1227e97c563af093afefb57f2b6be9c783a85b0e", |
|
| 16 |
+ "fonts\/Inter-ExtraBold.woff2": "20a22b0255b2bdc8f30ca7d59f20b3e2dfcbeaa39f035ccbeff40b57ad77d616dee1c41eebe30e1fab53fbb7ab4cc9f842cd13539ef34a680f6dd43441a3f2f6", |
|
| 17 |
+ "fonts\/Inter-ExtraBoldItalic.woff": "6fc1da8183d8b131d670ff5a89593967e4666436b37fcf08c4d99d8532654558f281bb8c20c92be8c5e3d6b34e05c7aad182f4c9a413f8bb1c11ef600b3c524b", |
|
| 18 |
+ "fonts\/Inter-ExtraBoldItalic.woff2": "3a8c4a113a4308ac9a57e7ad75060e0f08a1dd8638c29c1190f86929363b755ed2de66e4c11d3164a0a1fb1e6e35865bf786a295d3e0ad561c4a94cc8cbec6db", |
|
| 19 |
+ "fonts\/Inter-Italic.woff": "72defeb5040f6375683dba41d4ce43654fdbae4f64aea88b01feb023b3e894c278c8a8c7e5583b6d83d980495ca0d5afa5ec7e1bfcc731be08d3dbe1b8b3f348", |
|
| 20 |
+ "fonts\/Inter-Italic.woff2": "b128da83c81fe4a28026dc0a2a75c7920f37d4e04d6d6bde4e60b3a9527dbff04ff0ebc8b300874db9bd90036a41a52f4c9d82eb2f78fb8e99a35bb04defa1c2", |
|
| 21 |
+ "fonts\/Inter-Medium.woff": "1f7c25aeb1ed534a106254fdba6bf59dfa03542f813489dca31fe067e2a22ab9549babb48af4cd465ab3ef0ef2f4b0f46532efcc8aae8942ad2cf98d0a5a4a3f", |
|
| 22 |
+ "fonts\/Inter-Medium.woff2": "ce94d1a0cea81d42546ebc0247403b02c6fae24d3afba618cf658436734557a8b2b8ebed54319a9f66b233bd224da3685f848470866de63a144c8c28070491d4", |
|
| 23 |
+ "fonts\/Inter-MediumItalic.woff": "7b7bef9c7a7717c6d52d619059e5ec258b537f538ada38325c2c7bfa4968ff53109bc9ee17a57819ef37d0a145a973f4a7c8e4d8d09e71d3faa4d0fe14cbf487", |
|
| 24 |
+ "fonts\/Inter-MediumItalic.woff2": "4a2c5dc8c2ece82489e63b16cd8b1536b8f5502cf8f93307b0c71c6d54594a28ec2a80b8e58dfbbcc1d38a51aa8dd6d6fa025aed2cdc1429a462745a2bf2d414", |
|
| 25 |
+ "fonts\/Inter-Regular.woff": "e37409956d19653617af32af2f99f4038c815a3664f2dcb2fef5e6a1a7345c78aaac3badc2ae499b1423514076ad676ab4bd5d936ef9d159899a6f668d991e4c", |
|
| 26 |
+ "fonts\/Inter-Regular.woff2": "731924aedf31d6ef8fcd57a3b74182331ec7ba743d64033d8912d350ba98fd5b1942decaa4268f4dc925be2ed711c71a77200b2497bec10cae499b452fb27138", |
|
| 27 |
+ "fonts\/Inter-SemiBold.woff": "684602b1f45bf7a9ca5ea6b1aca2cc2046e07ac79eb63b920099463f25866f50cca77ca253f16078d3a6e781ca23b964a69c87389621fa101d5cfffdb292d132", |
|
| 28 |
+ "fonts\/Inter-SemiBold.woff2": "12b7680eccc54f56f800ac3ea4eff0490f515911d0fc83f99f62fa0f72d848155c8a7186918301a372d0fd0238d8093109c7b9b3c05168058e3cb47b1f7216ae", |
|
| 29 |
+ "fonts\/Inter-SemiBoldItalic.woff": "9623d9c91148b651b7d4a642751e4f9eaeda68b6f4c33355d0173e303252039b3bcd301556a1d8451ffbd36d7996c1e8fc5ca1276884636cf57468e38c9e442a", |
|
| 30 |
+ "fonts\/Inter-SemiBoldItalic.woff2": "97b7d8ab268ebcbc00876bd69ca9cc7cf2ae9ba5a6a30c13e3412e41a88f1f5ed758a6d9abbab3a14359943a003b14307cbc379bb11505c014b002322fd53c6e", |
|
| 31 |
+ "fonts\/SIL_Open_Font_License_v1.1_Inter.txt": "073e141d4e45a3adfd2cb569db6a4fd217b1721dd6aeab8159e36940b984df5ebdc345deb0eb6be65367f943e516a12dff41eb1238a322d248ca3478c50ef9b6", |
|
| 32 |
+ "fonts\/opensans-bold.woff": "d094832745611e047ffa87fdb21bac41befabdb07aecade483d4dc5a5b97bad00f1d4a5dca2a615789cd494791f0ab4209be537eb4b1bc7cbee7c42eb5e201dc", |
|
| 33 |
+ "fonts\/opensans-bold.woff2": "096abb618c9ce1a534f0198aeea53c6d1138000f98b883131ab49ee48b80b483af635f0196ac40a1c1bde679f63b3c3b907b8f9b0102a752862d623dd22393a5", |
|
| 34 |
+ "fonts\/opensans-bolditalic.woff": "c80f105a10d37c812f5d1b29445cd21cbc95594f71d9c5fc1b3aeeb9985c5465ba017654f1453baefdc56cc27aa325b586d77323012073eb713ab8f88f08dab4", |
|
| 35 |
+ "fonts\/opensans-bolditalic.woff2": "38b99ebf320264d74a456fe590fc610580b003bc77a39d97ff42dec41353a8f908d6f680b4777cdb34ed544d9b4ed20dce8c418317de1d721e25ab670f49fc1d", |
|
| 36 |
+ "fonts\/opensans-extrabold.woff": "6636a395ba345853ada2237b8e1f81c52e54bfb65559cbcb8de143cac00232f20cf34c764c9c4d4b80e82dae79cba3064ebdf22999cce8839df2d5709ee64092", |
|
| 37 |
+ "fonts\/opensans-extrabold.woff2": "758c90eb07c6db7e78cb703ea285f82b443ca2cfab792328a3f8c14acc1f932ae79ec2987b8b94bf19b3cc16fae31c76f3164c9437a2591283fb1592e40ec33d", |
|
| 38 |
+ "fonts\/opensans-extrabolditalic.woff": "ab1966f1ab3bb436e489c2d6ee562cf22d05b6b8c9bbca17e903518311aa45659efc329255e08ab597e2b8effe3bda602a7fb56b7d0c1d872b69337537d49dff", |
|
| 39 |
+ "fonts\/opensans-extrabolditalic.woff2": "2132d6309969f868521f2d788b991bc9bcf3239f1768db9a2b90faf8838c35efea85225b24db256f54c86d0a7915ecd50a7f5348e6ab040e0f172ba7510598cd", |
|
| 40 |
+ "fonts\/opensans-italic.woff": "a9751e7ac7a3c3d9f739d1fe00730a545b68e4a6473beafee8edf583f175b34fd5e0b60a14ec3707c8691fdbebea17e191c51707f50a21281e76be46f55a1140", |
|
| 41 |
+ "fonts\/opensans-italic.woff2": "7a80c01d34562e2fe248a71078ffa9413c04c9c320d27acb0bce96cc295101eb9e80a25e97dab3e67c184c40937862be820581441aa4100bd512a26ef2d523cf", |
|
| 42 |
+ "fonts\/opensans-light.woff": "cca2c5d207e0935c1848e22965972cb6feea39aa93b1b546051cfabe5ab16e909934d007a7ccd174eda1e7671d838f477890dedcb93d68ba722eda39a16d0bb8", |
|
| 43 |
+ "fonts\/opensans-light.woff2": "cdc332de1b13eb0f05cc9dd1ebc905fa5ce948eab71e2fdb1bc538ad54a0de980bf83352090becd650af9c101ec9a6898d2e4798e4fb777e41c20fae85fd568b", |
|
| 44 |
+ "fonts\/opensans-lightitalic.woff": "26e7759869088d8abba380f0bb22bbb9fdf0a985c0999519390cbd85099e3f48864d866f4639a8ff1992e7c81c755b0bbf66f525d4d38a929067886e9b54eb88", |
|
| 45 |
+ "fonts\/opensans-lightitalic.woff2": "b7f80b69abeca9d0369f5d46da192e98a6329cf1f948c897fb7130e0d815f73e293c37f0e6d0047273fe3f13a19e648d1bd06cfa2fac2142ec38ac244e7f0940", |
|
| 46 |
+ "fonts\/opensans-regular.woff": "3a526ba177f8f16ad95941c185411f350fab7e5202b9f56ea9c5f972c62912781d66da10e278e065cc6748a4bc9ab9182d68b27eaf380131c602195148e4b8b4", |
|
| 47 |
+ "fonts\/opensans-regular.woff2": "66b3e915b891f7b37b441ee18e40f01274fe19f2515470760e503f428fc1c524ccfbe832191978c2c5f6bc4b7ef46937e4f77f5457b6efbf878c97c054cb45f2", |
|
| 48 |
+ "fonts\/opensans-semibold.woff": "173f703ab767d0fcff014dac2fa3dcac787ffd0eb39f0c532b6679935c0105daacfa6a32bca97de13e420e10194b701ad2487bfd35d28807563ebf0b16d0ca35", |
|
| 49 |
+ "fonts\/opensans-semibold.woff2": "75068ba76befc2356fe83b198bf6da70e177e53cc3128af09d0d9f69dfe538013f2828b2363c6f533fcaca4d4b2a5ec5159b5eb6f288504ac73d33ac5d1d2c4d", |
|
| 50 |
+ "fonts\/opensans-semibolditalic.woff": "9e1e965095991d4a12a0658fa22a116b043ce20fd5f73bb9655d870ae49c46170cec52827510be323332b535002eb96445f79c3d1e4dd0550ff622fda0465f1d", |
|
| 51 |
+ "fonts\/opensans-semibolditalic.woff2": "d7e43f05802e26f4cb80ab6a492b01c398c5b41168c7f61356ca3ffc5f4fccabae5ba332956f0aecad69ccabb6b7526efbc0395552cc5d68e47bec00bc660ad7", |
|
| 52 |
+ "img\/app-dark.svg": "e56b38a7738e4a6f8700be79918e732dacbd00a027bb9c4d4dea132731d5a7011951423861486d55b01b4b153d7b72d83028dbd1aef5645091e270d3c6418781", |
|
| 53 |
+ "img\/app.svg": "b280f77152cd2cbfdb075d0550aeeebb9df34b8fe9e4fa371f7d42bf53fea7afb24da9e5112c7e3b3c9ef868ad361b5456b57979825c332f66434e46acfeebbd", |
|
| 54 |
+ "img\/sip_trip_phone-dark.svg": "e56b38a7738e4a6f8700be79918e732dacbd00a027bb9c4d4dea132731d5a7011951423861486d55b01b4b153d7b72d83028dbd1aef5645091e270d3c6418781", |
|
| 55 |
+ "img\/sip_trip_phone.svg": "b280f77152cd2cbfdb075d0550aeeebb9df34b8fe9e4fa371f7d42bf53fea7afb24da9e5112c7e3b3c9ef868ad361b5456b57979825c332f66434e46acfeebbd", |
|
| 56 |
+ "img\/sip_trip_phone_calling.png": "a9bcf8fa25fee4f4cbc3015fc72b04acbb5dc9d1a1b478e98ee08900b7c7d467aefc7133fc0322731e5df5f6c175a4377f9330e24c2688ca348d5123e6e17619", |
|
| 57 |
+ "img\/sip_trip_phone_contacts.png": "dbc03d0298ff3c6667182da0266c05cd78bfb974178bde9d91800f91d4092a8ea242146ac1d0cff6d1d3e939f70401c02e59f81ff7300c5105f1913ac6317d96", |
|
| 58 |
+ "img\/sip_trip_phone_contacts_list.png": "a19ecea51a3ea3aebfbb3a7b50847b4bd070483f194939756a35537eb0b13c7b9a2ccb7aa811f1349ee97539c01786b7051d0e1344aae1f7b5eee01ecb8fa5ce", |
|
| 59 |
+ "img\/sip_trip_phone_dialpad.png": "464242d474862849705fa56efb85f6ea245202d37ce03c9160610fcff4b252f379ab11cf1fac9710e07de88c9207e0d3b0e0929e39832242d77b659aced38aa8", |
|
| 60 |
+ "img\/sip_trip_phone_grey.svg": "5524c9e00c015d023d7a9d8f3427eddb5d94b88551d140528487eea84c6c62b905ce12b53824397f878d214e6911c7fea8ebbc4bff64ef275d443239e70b2767", |
|
| 61 |
+ "img\/sip_trip_phone_hold.png": "1b8570c5c7328a637a0406c7241b93e4e0b2630a2aab06ace039af16b9a73520501cf4c82f4492328889026d2c2efffc79ef71f48a913433ed556a4045970697", |
|
| 62 |
+ "img\/sip_trip_phone_holding.png": "01572f2685384fc194ff18f911b84fec410f84946eb9939d95c1e07e87326751f635479373607bff508c4b03160f7e2d5aa77053fdf6b7ea8379a8adfd759e50", |
|
| 63 |
+ "img\/sip_trip_phone_initial_screen.png": "8bbecd364fdc5f3d7297433a3aaea6f872efa40f58626d5dddc9b3620f712ab8e8a8d3310efd109815575acb49ef3e143f937472ceeba4137dbe442775aace01", |
|
| 64 |
+ "img\/sip_trip_phone_keypad.png": "17f8533b3f8c8f9a138b69ee6da96e3e5277f8184d4c210fdda92ea6c411c6d2d21ed111a2a22a1348d532ad3d58c3625c8f6ed14923180499952b30c8368a60", |
|
| 65 |
+ "img\/sip_trip_phone_logo.png": "3309a656543c4fcec77de1356c88f834cc244d423767c5ebe2f8b90b27b738bc426f3cc0e9141220e37c51e4a15791743539b694ce6826b97ee929b8d8e9a098", |
|
| 66 |
+ "img\/sip_trip_phone_making_calls.png": "cdb811527acb8655b15480fe21975ebd35082b4bef5c0d21c3544bb2488b2a7343cc252edda55fd1c8b9f320be4fa812b5c4a6719e246fb87efa424bdde1070c", |
|
| 67 |
+ "img\/sip_trip_phone_mobile_answered_call.png": "027582716c06a0140ea6d2dd520dd97c39043fce03042609846e2b563c182d736ab1dbad7e41c77c8afda14f555d290ff53357c93bce988adda106ee2e326856", |
|
| 68 |
+ "img\/sip_trip_phone_mobile_call_answered.png": "2e515106dc15b43c1a3ea979e99777123900f33c1ca2f188f31233ff57cdfd710ee98acf0165ec35dab4bf86cb9001af1ac11ed13d564e5d322b98ae62193405", |
|
| 69 |
+ "img\/sip_trip_phone_mobile_contacts.png": "726665449b0c4dbf50cec35736759ccb30414cd4bb59f60f786eaa4ba403e6f1cf9eface3f9feba0ba3e8cc64415b4d77fb0b3e9c915162ae0f8b4b4a0d8ddde", |
|
| 70 |
+ "img\/sip_trip_phone_mobile_contacts_list.png": "3f9882ba70c85dfb9e4549d421a8899dffd4f62ebb64e3d3ceef0cd7ed495f74e8631a0034fb4757af4a6c0f2ac5c7f9c9ad04643be3cc4a137ccf73fddc008d", |
|
| 71 |
+ "img\/sip_trip_phone_mobile_receive_calls.png": "04254763e2cf75eef3001d68a2f439f79cad2e4a31a5cfb3deee844ac770797e0c2b0e6e56f2e13c21c4ca1eaabaa99f76941a096dffc78e2f8e3fdb8b8336a6", |
|
| 72 |
+ "img\/sip_trip_phone_mobile_receiving_calls.png": "6daba96c534872e45fef6cecce49ec799eff19c5951a403ce8a73b3a87f584874ccea1dc44609c2b349ef2ffb9a84a76af3c5bcd9ed6406de4e7b2f6e0e8dad0", |
|
| 73 |
+ "js\/crypto-js-4.1.1.js": "60f2a01ad255c25e44bb07ed0221feb99c1d61debb7bc4f8a85c96e5aeb2b9705b89ae17218125b30e5a700cc5b9a0da9f94b5b9ec1732efe26ee46c6c953d4f", |
|
| 74 |
+ "js\/crypto-js-4.1.1.min.js": "13c412bd66747822c6938926de1c52b0d98659b2ed48249471ec0340f416645ea9114f06953f1ae5f177db03a5d62f1fb5d321b2c4eb17f3a1c865b0a274dc5c", |
|
| 75 |
+ "js\/launchphone.js": "79b35ce1bbcdeae916f7e830545630d7ef33cabfe9d4a3cbff039e7404218242918f418e3b3ad088a5715f5e642d0d748b4ef1b426310916eb8c62ab0819edcf", |
|
| 76 |
+ "js\/settings.js": "7d3bc54cd74b5185ebd80743cb0219d58732f8889a95488015dfc4e2677e84a522185bdf0e02288051378b00404434234085eeb2ad65ff24888abd23e2ff1b28", |
|
| 77 |
+ "l10n\/en_GB.js": "3e93734bdf5873913caa37a855692d78d0e51aebfe00abacc2ebd22baee1a53645fa4f6d71fbd5dcc1c90a685556613ac61668a97fd1bd5b8395420110330c24", |
|
| 78 |
+ "l10n\/en_GB.json": "64b04f6fd98838588173aa8e53e1161ff9c7f6c05a342056a86838a369977ddec7bee8edcccbe457a8526560233483059e70c5c0917d1c6fa8dd07a49949003b", |
|
| 79 |
+ "l10n\/en_US.js": "3e93734bdf5873913caa37a855692d78d0e51aebfe00abacc2ebd22baee1a53645fa4f6d71fbd5dcc1c90a685556613ac61668a97fd1bd5b8395420110330c24", |
|
| 80 |
+ "l10n\/en_US.json": "64b04f6fd98838588173aa8e53e1161ff9c7f6c05a342056a86838a369977ddec7bee8edcccbe457a8526560233483059e70c5c0917d1c6fa8dd07a49949003b", |
|
| 81 |
+ "lib\/AppConfig.php": "e0279b17c389a2ba883c07800f43326efc427d96dd6d4e123e14b0bcd4dd4dcc521af3c2fa1673c7fe68ee915a34222dead68f266ca34db1c864216c24134c39", |
|
| 82 |
+ "lib\/AppInfo\/Application.php": "57854278fe8476269467279f05883873b8e7173da2357ee001850d697c0848d7ec8e8306f9f8c301af82f623f216a8049fa1c45ad2a5868b92ca090f0278e5ae", |
|
| 83 |
+ "lib\/Controller\/PageController.php": "d4cbab17fe2620e15bd06d2beabe849e9518f198a48e6dbe7ea213e9b07b2aca15b37f15ec7e6a94d26e173461c7ec31ca5630cf2391df6d7d3c097c1f47d478", |
|
| 84 |
+ "lib\/Controller\/SphoneController.php": "f776f6a2eb2906764126fd8008928b93ce321b27cd8fbcb48f37f250b99ada16fb7181fe705ed62978068ac3376d1b246a0b6eea776a89bbb8c9e1f048224d1b", |
|
| 85 |
+ "lib\/Migration\/Version100Date20211106173528.php": "2d81e8fd03611db1017c08d90325a680928cfd367701e479d8c765b8967645cf9ae27725f657d655615f5a878307edb87b3d2a0bb460161e14de85d498798ce8", |
|
| 86 |
+ "lib\/Migration\/Version112Date20240108213517.php": "6a535855e4eeeaa63b62ec1b97d9484f727c0aa08f16a4eb65888f0d133d93498e20adc4d1942572924d553af425a8632a94bbde8d3101a28b07c9301d6b43ba", |
|
| 87 |
+ "lib\/Migration\/Version114Date20240520042641.php": "f6693866d02f6b1d23195e27a79ed3622928b468b48c6c43f4050370200d2cefcff53d6cf11a1ee110d40f59741ab5b780576db47e2df70ab11a4e872700bcd3", |
|
| 88 |
+ "lib\/Migration\/Version115Date20240521091835.php": "59dcd466195938b7503cd1c9ae319d88c8e344ee3da88271d680905ec719744bde3cd733aebe034415a81329cedd79a851f0b97cb77b6f4193232c643e727303", |
|
| 89 |
+ "lib\/Service\/SphoneService.php": "e7820ac27242bad31448503a2ab6a38324ac35cb56dc533972cd58e0b3aefd4f76c7f7111738d92d11bbbee75b642359a4f3fe159630e04675b6bbcb63f923d0", |
|
| 90 |
+ "lib\/Settings\/Personal.php": "d031350a9e5c1b0e78fff57b672304660485b9b307c28eb8a2dc7a3782c6329cb3fc659041d331b97711485a92d10bd99d739a17eaec088f7837d2be786500a6", |
|
| 91 |
+ "lib\/Settings\/PersonalSection.php": "b2104766a5df419eed6811630c2d2de6b817f4b0ca77b5ca018344901cb8db0cefc8c78d4f45b14f4b5129aa986ae583b69c78d50cd91f8502508dd8724d3edb", |
|
| 92 |
+ "phone\/css\/bootstrap.min.css": "b82d1fb15e8eec863133d7491103e86bb1cb67442509bd141f2c2730dc237c351d3a10bd4e9633ea208c39a98b6a508769c7c448aed809bee43a83e10361c402", |
|
| 93 |
+ "phone\/css\/ctxSip.css": "5b57b803ed4c39659d64031008ec111dfd484e58e1d4df975cf3ca896d978d67646ab19396f2d3b6062e20b365254d664c47bc4e9894c8dbfd7400c2e699560a", |
|
| 94 |
+ "phone\/css\/ctxSip.less": "9b53e079978d5a672827cadd1b1f9ca63c69af22a77e52fb12318cf445a96ac2f537c797f64f4d2bfd673bd4c1b15d22de9e9ee226add5ca443db36a6fc24905", |
|
| 95 |
+ "phone\/css\/font-awesome-4.7.0\/.gitignore": "c3621f6be50311134e6d7a1d34a9638f747f4074c48527dc7975957d6c87b9cb36b64bf8385fb1a59b52a281f1e72ac3f1c268dba6d09ac951e0f4618bded3d8", |
|
| 96 |
+ "phone\/css\/font-awesome-4.7.0\/.npmignore": "6de3301556255638c616eab313a3d8ee5c704b1aa5b57a5d85e5723cb3b810a1ebcc148c33dde5c4989a691f18f8a2ace97c40df2e9c4306b840a4823587ee2e", |
|
| 97 |
+ "phone\/css\/font-awesome-4.7.0\/CONTRIBUTING.md": "4576f4a2b8070a422891412d123025245fc3ae5511de09e153a1924aafa5d8d8de65fc530db79426055e21996ee9ef1bef22a192f46cca3bb94894d0d54d6ecf", |
|
| 98 |
+ "phone\/css\/font-awesome-4.7.0\/Gemfile": "2add4715a7f520d0bbce11062202f6d1072efe569207c801f9ded213e8d3b2d0f879071c39aa117839e5e3a73780b1081e18dbec2ac79b6b4756deb4a8a4186a", |
|
| 99 |
+ "phone\/css\/font-awesome-4.7.0\/Gemfile.lock": "1daf45ff9728c007cec63dbafeafc394322273e3620f911769b230de8408b71838429c86f45324885db7029cb4661a5dd6057e3e6961a98ee08d87e7601b85ab", |
|
| 100 |
+ "phone\/css\/font-awesome-4.7.0\/HELP-US-OUT.txt": "f0ebc1e7ec38a8cd333b34e2deebb416ffab31f3cd707f27e310beff328e5e05962a023da606c62559c8b606f7138b90896ee304fd45e86afdd2910ac8cdda57", |
|
| 101 |
+ "phone\/css\/font-awesome-4.7.0\/LICENSE": "1a7a0986aaed249087bd3a01cbda0361cddecd4ac0e4da9d7095f6193b4dccc559d570789b0a4ca2606f2ef137f2c4174cef735a8535371ce7e3a55625dfa801", |
|
| 102 |
+ "phone\/css\/font-awesome-4.7.0\/README.md": "34655fd4be9d98ed1d419c98372cbfa58684382fda11936fbda3f6b39894cbe9fe429b6ec3346315cca309c2d07648064d0554d1e241c6ef9df57e6fcf758ca1", |
|
| 103 |
+ "phone\/css\/font-awesome-4.7.0\/_config.yml": "883821543b8f3d2ea37e88186afe841c085fedb3b7ccaea49757af224b0dac02ac9eb5b8d7ce1648cb57fff434936313315c308ba624941f5f5c0b1fce083d64", |
|
| 104 |
+ "phone\/css\/font-awesome-4.7.0\/bower.json": "5407ebc1f339b0ccc665e1fe5edc8c92bce01fcd0f5c3be302f407bec80a315a0612ffb2b71a93bd0e19a1fc1eb34095a02bf0aec659b08411fcffa3d289b7e2", |
|
| 105 |
+ "phone\/css\/font-awesome-4.7.0\/component.json": "12fcbaa3f72f707f433aaa532774497453d447e3402f4afb1c27e8ea9b3cf98108229292af312aa434722e9b50b2da115b2392b82f41b19144d6dd2ea183d659", |
|
| 106 |
+ "phone\/css\/font-awesome-4.7.0\/composer.json": "566b0aa11e55c98698c1f23b92bd05cd583c5448a3c4a33582f05a19325e26b91f82138822d0ea2b1397491add3e4b79d2682acc7dad6beab24fd1621c3d27fb", |
|
| 107 |
+ "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.css": "e40f27c1d30e5ab4b3db47c3b2373381489d50147c9623d853e5b299364fd65998f46e8e73b1e566fd79e97aa7b20354cd3c8c79f15372c147fed9c913ffb106", |
|
| 108 |
+ "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.css.map": "fc6df90f77e3ab265e3f19c2d6ccc27c49d5ab94cb956a2de3e16edfb3f59a3e1f9df3182474925704412ea056bc0acfd70f8f599c9fabefb48b43355a1e29cc", |
|
| 109 |
+ "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.min.css": "49f4e24e55fa924faa8ad7debe5ffb2e26d439e25696df6b6f20e7f766b50ea58ec3dbd61b6305a1acacd2c80e6e659accee4140f885b9c9e71008e9001fbf4b", |
|
| 110 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/FontAwesome.otf": "a3acaaac3a9861ac7a4ba23e52b9115d39b674cb685b45454fb4b80329a4f7370b5ea7dd8b41d630798f8a54082b62411fd63332752296dbf5f2b3b96abb8874", |
|
| 111 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.eot": "c160d3d77e67eff986043461693b2a831e1175f579490d7f0b411005ea81bd4f5850ff534f6721b727c002973f3f9027ea960fac4317d37db1d4cb53ec9d343a", |
|
| 112 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.svg": "4f575d52331de91a2e32cc3408dd0eaf0cf25b7244d34b226314e3647e85ce284f86e3b7238c6c8b9022dc4e2787bf51620849290cdcd5d4c4bc905f289d2156", |
|
| 113 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.ttf": "9ffb91e68c975172848b4bba25284678cc2c6eb4fb2d42000aa871c36656c4cebc28bf83c94df9afdfbf2407c01fe6b554c660b9b5c11af27c35acadfe6136ac", |
|
| 114 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.woff": "9c776dea55a01fd854ea23b3463d9ac716077d406ecbe8ed0c9b6120ff7e60357f0521ab3e3bf9d4e17ca2c44a5d63ee58a4e7a37a3d3f26415a98d11c99e04f", |
|
| 115 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.woff2": "838fefdbc14901f41edf995a78fdac55764cd4912ccb734b8bea4909194582904d8f2afdf2b6c428667912ce4d65681a1044d045d1bc6de2b14113f0315fc892", |
|
| 116 |
+ "phone\/css\/font-awesome-4.7.0\/less\/animated.less": "285de8b339ae691c8c95230462b8760949850ecbd1a4f8b98b0f85347f1187ca7727507a50ba7ee362b57b1ccc94efe57fa99bb501bbea93561ca3104f73084c", |
|
| 117 |
+ "phone\/css\/font-awesome-4.7.0\/less\/bordered-pulled.less": "666a33697b525aa25d773c94360b96dd6ff833dedf99178af931b040aa93239c5814bfdd433a841d77c2a3addcc444d7ec95c83073b9d30e48ed5fff4e82a111", |
|
| 118 |
+ "phone\/css\/font-awesome-4.7.0\/less\/core.less": "88b310200bdd13129f343e8f9b581e3a376fd5aec4c7a604815101774d31ca3fb469d345321aee80303842309b10273885195545f69fb81ea13215e751ef5187", |
|
| 119 |
+ "phone\/css\/font-awesome-4.7.0\/less\/fixed-width.less": "b7bf0de65815043012e95e8b1bac895e85c9a07c047c99ba4f5c132a00ace5aeb3e838f2aac26d8451b38d193fde8199c45d58a2a79931e5bdbda47f15c8822d", |
|
| 120 |
+ "phone\/css\/font-awesome-4.7.0\/less\/font-awesome.less": "f5cf809023468a015234142efd754543054f9fabcf06ecb58db792537b8526c5d73098cb059e6e37ddf295895e92ace9005e9c4e5eaab19d33f06ac478c69acf", |
|
| 121 |
+ "phone\/css\/font-awesome-4.7.0\/less\/icons.less": "8735bbdc8c7c9d082c2a1f261c74bed575fa096ba8775ad48ada6894f03a8319414db099395e80f16f6e89d802c988c1a2bbf73252c65acb040c35d40b9ed0f5", |
|
| 122 |
+ "phone\/css\/font-awesome-4.7.0\/less\/larger.less": "5ba01d3b3c917dfcc0bf20a283397e677d420addb83c74d29f81d77658105c8d9e48784d2e8f5214919877141056a74f06d3081fa291269f92c4506ac089a745", |
|
| 123 |
+ "phone\/css\/font-awesome-4.7.0\/less\/list.less": "a13c48c3ab87469b5e720287f5f1720f0588bb45a0700968879cbba7ba008d070cdcd69b41d374cb504311c0a20bc4e727872855ae5e90fc76b1589104acc07f", |
|
| 124 |
+ "phone\/css\/font-awesome-4.7.0\/less\/mixins.less": "9fba58dc30953169340a57fcda1b3dcccbe69cb9ee5ad3e29e53719fb185f4b49f9571be248675d5cf5d82f86482086df022283b31b1766090f9954755f7a47f", |
|
| 125 |
+ "phone\/css\/font-awesome-4.7.0\/less\/path.less": "2214dadd8025d0da912ee4e0366a25b6d521f61ad04cd61c0b13140a9465d7711db8a80e3c83bc5410624eeef8bb2dbd1aba48cc3fa39b75d5eb5e91afbb7ba7", |
|
| 126 |
+ "phone\/css\/font-awesome-4.7.0\/less\/rotated-flipped.less": "a906cde529bac0abc118201866c6e81ceed53ea5859795ebe87e52e1d04f1c32b0ae1dc2a9297e2d6a2cc44a7bbfcdccd01ead571198027430b98190ce5efa67", |
|
| 127 |
+ "phone\/css\/font-awesome-4.7.0\/less\/screen-reader.less": "7d5c0d28b78b9c24b6af0181f8bf72d1b7bf20c45edbf1594da8b4c8391dd24920b9d0ad186ada7217755cbbabb9bf6ea52acd8ed39f7c9abf4659339eb70504", |
|
| 128 |
+ "phone\/css\/font-awesome-4.7.0\/less\/stacked.less": "0f07e1507d430c8ade9cbf2460c8148d69fdce6b5b7c659247953e0e0235c5128cec1cd1a329790b9bfa42967cbafd36776d81f6e4ff80520149f8ff4a6ba629", |
|
| 129 |
+ "phone\/css\/font-awesome-4.7.0\/less\/variables.less": "1691b468571a87081a892621941b3f0f954a3c5a4c588811b329e092bae28a8946f4e0ed5c440c7bd4248d3aa31c3be26867d28771703cbca41cedf5f3f3fc72", |
|
| 130 |
+ "phone\/css\/font-awesome-4.7.0\/package.json": "e66e530ac7b2d050bf954b40ea6af7c20296e7613dae6028c76a12dc6e0ddc92cc89dc565ccfac27d529c7c4f2aa938b52cf3c7a5ca04c86ab6c52fcb9d9c2e3", |
|
| 131 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_animated.scss": "5d8be64ce5136d02dcc2dc38341491c2cafca5633a8bbcf6bc6931da2ec95e2e29ffddd8a058842da4764620824914f7c7c7048a6c9e54d3e97bd7ab995834f5", |
|
| 132 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_bordered-pulled.scss": "01095953afd37d399f8715168a67a2e60c23623f3ead4eb4360f8800e30cb9572ee5d90b48ab4d0e07271f75b11da2d4a4cc39115a872e2f001000cfb46a8bea", |
|
| 133 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_core.scss": "78b807ddc8ac17eebfd4f59eb923a7f8bac8e7b76bc83985d593382b1964f1d98539af83c95c4aaf99e3e492304e08d452980879213fc13d9b9f69539f1f74c6", |
|
| 134 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_fixed-width.scss": "27392694f9bd1a671cd21517721a86c24725c51fcad4acaf09cb75a9e36bea34176af900c82e061eb0ee6b60a1bd0d9e99213119c5175c2f48b6800258ba840d", |
|
| 135 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_icons.scss": "b7f5aa12eb8cab73fd506d499f9c871b54d5939058b9ac27b858499f051d9af74a6374b2bc32eb2aecc169f9c2332cb2abd6b56b150d864df1d19ae153f16301", |
|
| 136 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_larger.scss": "ed6e63e7cdc9bae34810146c3dfd52b912f7b20219555994249f6f3dbd528673af58b69deecd9819f28f71713076c6694f6db0e31148e8e726f714312f404a73", |
|
| 137 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_list.scss": "d8b110a513c41ba8a00620143aa01b2bca59f21306b64e96cb82e4739ea88beddc0d3ba2679f277a34c89fa5cfa3d4b0f8ac5b16d9beccccae36b2f8450ef75b", |
|
| 138 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_mixins.scss": "da84a310d9322e8a4b5e0c739e93a5c66418930930eed7e4a14351b61aa6073465302552642c75553819fe2ea7903ece21b20494761a94daada05bd6fb2e48fe", |
|
| 139 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_path.scss": "9eaa7d29bb402c790bf1ad40ee849e26743d198bff3cfce0182c2320afd9d47f4377b2bfb147999a057604dcfed33e408065577a516be0f3623fc0df75120912", |
|
| 140 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_rotated-flipped.scss": "89a2a4009628540c88c9375c7f04bade6bb9b901575c12fe22d0031c10011f4c5c3b7834d4caf6b1cfb84501a5a77d5c4e6cebc9a8ff92c8bc6c82ec6bfed40f", |
|
| 141 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_screen-reader.scss": "5e3c8df5f64a9ddd9c7dad6f939156090e832a43c4352f7f470169ba22133267931f53100da2a4f4ec5e5528734c5d60c42ebc64fae6a5ee1dbc2e920dc343c9", |
|
| 142 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_stacked.scss": "25492b5ff68a6d2c8f9ddcebbea75b1f14a7f47d599bea5d75e1f5fabdb5e3d43147e6df2c435c7ea639c094811872e53941ccb79f204026b6fe2cae172df7ac", |
|
| 143 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_variables.scss": "77079c62eb1459ecc6e763e863f02f5faf9289b333cb43b2402bbf822837dba4d6af22d97fcdac68e252cba9758a91386483733ccf690c3d4eb5f1d109794f29", |
|
| 144 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/font-awesome.scss": "e5cd637954db11cc3e86af92ec127847c7476c22dd1e165c56a2816733368f02edff7fb54679ca77574f8fd86778528b6ff51ae0a39701e09b310a84b877580a", |
|
| 145 |
+ "phone\/css\/font-awesome-4.7.0\/src\/CNAME": "060fe8853f4156b0fc81b945c6a3c98f0259e9a32adf02967a1c03e76bfd3bbb918364d208a411ab86299fc0719034750956f8fcc98286bcc3cdcb65314474a8", |
|
| 146 |
+ "phone\/css\/font-awesome-4.7.0\/src\/Makefile": "88682614a1f8b34219819161e3fe03f8ee575afc05d0a883ab78cd8a772a7e6fbdc13ba4e4bb4a9d2f98e32772ddd2958e072b817e9ba195ee66c68087225eba", |
|
| 147 |
+ "phone\/css\/font-awesome-4.7.0\/src\/README.md-nobuild": "05eade6bc17a7ab940d65e656c1f4d88656e15137ce90a64b3220c1b74cac41d27cd1764c63a6bcd5d8c43a17aced01d782ff4b714f559d18378c78a518182aa", |
|
| 148 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/accessibility-facdn.html": "feff45586c2e4dec12c1d766b7a8cc815174a56b37567da96d62c04e15c072c902c70713b6f06fce9cc1eb2b4bf0fe44f2dd7b3b630e6cb3006e98e819cd54e2", |
|
| 149 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/accessibility-manual.html": "c521d6c66a661530f5368c9cd7d191caa9cb791060f678cd44b79201196ce86827babc366e28a5cb311d9ec8929354354da0f3a04d3ac9e370441933bf57615b", |
|
| 150 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/background.html": "12ef24dab463fd60c8dba5799f069785be108dd5666bccc3ad551af680d7ed3f1ba5c87feb0a10e52efc415ac5cd9fc89bd314f26552e844b2441a61b6ab2de6", |
|
| 151 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/cta-cdn-ally.html": "d2cb6cec928638e10ad2aa93b7ea55b2184b9504edcca4e87ab20ebdca610a6edc45ee2360abdfb25956df207949cfd94d78206fb5eeba39c2d8fd9d1410952b", |
|
| 152 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/other.html": "b6ea9fd4eb72fe8b20f18449ca22c65eb72399c8b5c956b598401d95086a37e885883064a06e58a35f2fbb69a296c069f8ab2d3b033e2148e4663cf08542184f", |
|
| 153 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/ads\/carbon.html": "d6336f7613a75db891904471980c15e3b6d81ad014e13d6317eca29c7b5103166385e8959d3702e747ff83560e97920801d6a246772c617abc7811086a283aa2", |
|
| 154 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/brand-adblock-warning.html": "5477ecda666bdd618d7e68af4539187ee932dd29418699c0c0e69548b47d20ea98d289a9e3b691696891caa1a9095ab8252ed11425964d8db9df34641d44d62c", |
|
| 155 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/brand-license.html": "739eb68b48f8d4f555e02f7ef9ab1801aebf6cfad50325d20c63c9068dfca73d0dd27eb6ec4f4e96cb5224da8d8b8fceda4df088411d1022cdbde272e3ae03ff", |
|
| 156 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/core.less": "4452c88a8b284dd090873896e0b46b86846f2a23dfc90fe69ae561404bc1417e085c6546ae99827196feaec49bfda147f2810359a1b692071ed2db64eb1561c6", |
|
| 157 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/core.scss": "125638298cf58ddec200c8c58466fb568fcf76e3255f64737b59f9aab1ffc1c64a5f52082d3de4f80e88d25f3e34472107aa66c4bbd55e823df465db7e768ac4", |
|
| 158 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/license.css": "4a92760c82226b27a683a3860fcddda105d657ed7282221e5008bd8e80b299cbee5387e45e86e18988291870f1ea980ff5733cf36676bf46fd633f92ddf6e638", |
|
| 159 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/getting-support.html": "fd3d2680d3ad916cedf632dcd2da0addd756fe939dd400c67168090dd6aa97ed067fd3ba4d4ab8919507a45040ff0a93899617542184691b812a899c84123b6a", |
|
| 160 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/project-milestones.html": "5ba81ec08a037967dbb218e04057f1cc9b03fd79d02b3baae67a07dda595727b8409749340949b4001409543a8fa184603eb788417353b22d8cfb24eb014b01a", |
|
| 161 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/reporting-bugs.html": "f6582dee7f90225b0047b480dfaa35362477740b29215366227f27d53ed2c43005c4d2b60dabec41b33a482d516f5a23c2b229408fc21b97063db704d96ad098", |
|
| 162 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/requesting-new-icons.html": "479e29dd3f3dd17083e8ac7320c1a3de111d69cc1db7f618c0003a494b89d0e744c718f70cdd41300a165bc5e0fb6b9758e8fd82564ae47406e6cd104d9b9b04", |
|
| 163 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/submitting-pull-requests.html": "d62ea8e1f09ef35627c9d4d0498ff514fb1c88ca4215ab72194fcc3a90aa7a4ada5d202399de9aca41f01a20e9dd674c254797f94a6a3b8380b2df1af463d9f5", |
|
| 164 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/accessible.html": "26fcba6f7236ecb034ed5575f02e7e7872878abee5d51444d06e8d976a80faaf017e9bd4aa43f2bc314759e5564c3030ee655ff8062d8aa551ec57060aae6cff", |
|
| 165 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/animated.html": "8d8c90d6dea5ac1e869fc1f6234db28f6aefc7b489f774ef8abe64bedd7e82c5ed6efec2d4a85b9ac0152f50273695a2f8688aab3d904a130f001d2ba1704a21", |
|
| 166 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/basic.html": "f5ab39675edf6375e893509f3cdc6721c50cc721229d2cd0bcb2437eddc644e02b9d1e714dc1c2d34e6675501e3c7b0469e454455d40c5a8e7aa1e83ae54d873", |
|
| 167 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/bootstrap.html": "611cb46b313ed9d3412cfe9279981937a6695268392a88cca6e4252fb84b7f9c63e244d70b650abc8e73fd4648254e04995a79c9f68a695e7b8373bdd2ea6786", |
|
| 168 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/bordered-pulled.html": "d97b2d4ca375122587565da7ad6a89cc761c1a01648140f6b003903280af01dd29ef23ea565849a62d892b9dd547a517a8028e2cd63a25fde89417b4476a049f", |
|
| 169 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/custom.html": "09e01e23c1941ffe88d5c047285621f41452ce960686f00b3415ffff482d41748f6729f734a44639acfb0e1a6f47bf6931e707cde1cbb059de6b9c4c8e0cecda", |
|
| 170 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/fixed-width.html": "fdc321a99a9570b65f3330f1e743e2a5a24f07d8759f45b811b00d2765aa7626e8c48fc316b5c040a4d847469c13873981d1098a378123632d288c787c9d74f1", |
|
| 171 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/larger.html": "d9d38540bed78cc038323acd638d96c764cb18765ce328f4fcea4282cf432013e7a15482a56db3be50a9a1150743d078d891fd01cc5945d48952547974338af5", |
|
| 172 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/list.html": "43ac890e702de4ee53d71a3f4ed18b66b5633e15ed8ece1f4039d1c3377a1d391051fb00b037f2e4a1f1c757d6cf615f069efe615b88aac1be4ee923b8b1d425", |
|
| 173 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/rotated-flipped.html": "9c4eb8ca3cdb2309f87ee0366a75631a6a311700091f4c8189d74bbc4a33e3003635ebccc8c9aaf0d0960284c088f490e61c2a51e79cfbac4a72cc2609f90880", |
|
| 174 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/stacked.html": "9bce1d2abd759645aac7c2f0fd54e55a34a2668882e337d89c8ee0bdea14bf790c0c03adc7f6ecc6d8e1cf13deabb8f9c90f0cbe4d44a867fae42f72d5a83711", |
|
| 175 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/footer.html": "00b38469e9dfbc25d4905c9e71965064f1dd11d868bf0983de1614f870309e2313fea222e4ed4206a71c07924cc45bf28f8c0fd6428d331a58df566cd6988b54", |
|
| 176 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/accessibility.html": "9b99cab0babf09aa30dd81d6bd675e43b7e8cba79e785d0dca3b7529dae910c2a96eb2c37a97e98610e2d9c5c2bcd84f85cdcf6ec22b72a81fa377edd529ca41", |
|
| 177 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/brand.html": "fdcf75c126f165963c273c164f14cb933760ed977d1b734e4843d4299ced9dff545bce672409818ab2dc8391fffee391e17d1a56c80d52b39bb92df8679139db", |
|
| 178 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/chart.html": "5d11f2d8367ee116fd85495a80a918d0bff70f641dfc4d7e6fed17e7e15496c04079bc8753b092fc3b50a19b5eff67c2790f7be8f49228a729bf4eddcfc892a1", |
|
| 179 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/currency.html": "66b4d159ad39c6c0a96ccddccfec84e1b12f654e5880464042378f3439ce8df3257a33ee1df55252fc214428b52685a425ba91792c52f28984436912bea6ad21", |
|
| 180 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/directional.html": "281f9c2e899998fee66e3d5aa1481451d23a2c2964e962506b04190cb84acdcf5e12e55d7a02e0a59793fbfdb78a5bd95203ac560441867ea49ae26c971d4060", |
|
| 181 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/file-type.html": "9db9fd23e94d311b5d6b9258b5efea167037f6fd9ae54c57e8cc6505cd92bb14edded5dfe614dd27327200832268d56084f3060e18f29066bf99c141ef20c109", |
|
| 182 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/form-control.html": "4a14aa9f08004d97cd7ef070c0e0423734bf71d1607bcd9d27f66f148876a3eeb355966e78207dad0e3da8ac1589df4bc6e1c6da661c2d1ae9c85d34fc77b254", |
|
| 183 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/gender.html": "76950be4360b1eb448c6a41cf6adf739f74b3c60254b3264356e3b71bcaf791dc048915adf8e1730b819316fdb5cf934446a121d5d5461a743e03b7e54103586", |
|
| 184 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/hand.html": "2ffce735b462f5b5c117c639f22be1a83de099589ffaf378355c448cb748d9a051280524c30224f7796bd317b74f201451765c5b37125440dc4db6aed420d8c6", |
|
| 185 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/medical.html": "171a709bfe146dd5ca49647b9acf81ebcf62ef0a27d6e1aa8859c3a00b25f05b867712df7bba53e2e87e33b46dbc0eae107b2e1f3de4eb5b82d7e8fc8443d818", |
|
| 186 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/new.html": "7d292287112e46c450034b08d51f4c1435782331e6049ec2fb5579ed9c56ccd6ed4c06b9f33b503a1d5e09160bc4c766df53eef6c1c0f90f95f2e7deefc9a628", |
|
| 187 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/payment.html": "d8169b40692ac8fa117ce16eb7f1f6bb1b6f39eeac5a4f6c1aefad2b5278f1cdaf773907ada1bc87953fac97b9874511eb1d163462491c95eb9dbbb7a27e113d", |
|
| 188 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/spinner.html": "2049127b24cc76076489d861ebad12207abf87c7b015ddadca72e66ae11a28068bd0d1cc9d28b245f236cbd72e0def6e90486cc1fd14c61442c57052a97cc956", |
|
| 189 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/text-editor.html": "d4a659a0d14329a5a21c2369c3d3bb3bed12c88b19b18aaaabc61c095245885ecd39db439d454de3b4f15e3ad4764b909e240e38df28ee3eb25fa92240bd8038", |
|
| 190 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/transportation.html": "4eb63448d28f9f6e13c3bfdadbec3b30f6985b17e3831d48e0ad15b3b1a6c41bb547bdb009b741d149f857cc191dae8f382b550aa6c8b8bad0a3c5088ba2581e", |
|
| 191 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/video-player.html": "4f3aa37ee53df679d1baaf01d803bbe1346313ff5c6d2932a34993afa0294f23b9b29cb8a3876bd94e7be14469b6f3f04d52393260b32e790ffce2ae38de3a41", |
|
| 192 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/web-application.html": "c430a80b58d49eefecf12236366f629d3091ba3d558a510d68a7ff7d5e4eb2d55d55c7fd781ec0e14422c7ae16775c6c90ef18f7059991b2285aa94e6630dddd", |
|
| 193 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/jumbotron-carousel.html": "a9af25e69e6e61a582917c86e34728a8205fce95f94e4ff9fca4a27af05b68750609b2a4e13fa8f728b71bdead30c182055f2a1d329e6cd679d6110fe674e7b3", |
|
| 194 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/jumbotron.html": "a9663212f87ba8e79d819fb4f896d0a8f53ab8ce57958a7c20e9587d03fdf499878f0121b7125a0bea012d21966bffd8cba3b0dd80ea4872bc590ee8aff9f5a9", |
|
| 195 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/modals\/download.html": "df2bc4bffe3ee6f3286b7925594b23bee5775cd933b5b102328676b0d9a0e052387aca2d9495f7748bc2a7b626d5e5c08ffa338c2d5766620e0631fd202572a7", |
|
| 196 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/modals\/fa5.html": "cd55e54afc79886bcc57f7cbaf0f100fcc41c26bb6a8a9c8a072ebec5d0c4c8feec90ea6e0e615e2fc6fc046c3b0dbdbfe66b31d3f9e1e08783e72e81b8c637d", |
|
| 197 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/navbar.html": "9e8779299c2d4d95380ad8fa355ba826043009d1a4cdb735e376cdf38afb89c553a9c436680b717c312a4cc0e25a6f9cceb9034c6a97495943788ffcba92633a", |
|
| 198 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-features.html": "b4c23f579f8fc506c8f6848a609c1a0c1c06c82deddb2f38b5b9a770e4d8df793d0cbe803b52287f01d3d46c6a143e106ee31cb32b8e985841ca5e4e16b20d5d", |
|
| 199 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-naming.html": "4b0e5128293de9fde103c9a8648b67ef1d261c9eee359fc019083675ee38f66d45756dcd26b41efb034ca819f5c9be532c8b0d2fa1efaa174958c961818030e3", |
|
| 200 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-upgrading.html": "a09270d8ed206b1a3a9b2415190148fbc1bbdda637fa032e7d17e0108c7e4ce4bbde2fc06595866029eac5c4904d6ae7b999b57870d6699a4b7ee2924bda80df", |
|
| 201 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/newsletter-subscribe.html": "9fb09338a1d452dae32c9cdebb4e8800b26b163b46a88942d526e6965a47e33aa2959ff7855940f47d3f46297d5f2b7d4d7b6d3197928c55e5b17e728af5737a", |
|
| 202 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/camera-retro-tee.html": "2196b9364ee03668eafd98a2274ec10413c1e80772012636d5ecebfd48888ec5df05dfef642d46d971bf46757473a5fbb876ba457797b6196e33d60b784ebe8a", |
|
| 203 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/classics-tee.html": "a16ac1e4a87939505a43302b9dd94a1766fb6ed91a67c93efba42e38e264aab1f79c5f9150ad66f7029a6ab1811d60bdaaff6977a9c53148b7e393ab053e6224", |
|
| 204 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/cta-suggestions.html": "af48d657766f7f6163ce4851571750154337c8471059b200896e79f4ac3ccf2af4955ec4b950f1d8974cc6cde7ae11a29017303ccbd1895f30854adaf94d3730", |
|
| 205 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/fa-ther-tee.html": "095990235b55e0032b7dedb26ea37a20c3c99d431998d81781e80f409a589205028a0f786cc19dd6b479b2e2738bc0744f41ca7471ea5889f294a137e7100e45", |
|
| 206 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/green-logo-tee.html": "801e093b284cc4f6ce225877fb0ac5611d35a47360248255b13314e9722c96bbc2abb240b55ef5c7b07f931d392b0dca6f7aca7b68c9d722aedea916b12d0a91", |
|
| 207 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/old-skool-tee.html": "8a754b53ccf0db827e9d1250744b83e937a820876a2c49c969ef8e403b680d2692777d843c11576435cc6a4b2c2ef08a085497709b87b029a3e0827b68d0e269", |
|
| 208 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/rock-paper-scissors-lizard-spock-tee.html": "5aab5d331fa8f5a3540d42c901a52cc15345b585ea7b271583f9588949bc282defef5da5349ed795b0628825ce239f11481174bcea5a43aee41169959c0985da", |
|
| 209 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/space-shuttle-tee.html": "b155fc2184abac985df711df2bf1e3907ff088a9ffb648ff3a0dd8c329598722fb3f100f3230184b73f5a4606936e282fa1281f35f7be2a9e3665fbafedfd0a9", |
|
| 210 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/white-logo-tee.html": "4394a413fb87a5cd25148f5be1fd7e1ef641f6500f68e607f51e13d5f2718c676b4af28b0669cede49dcfd0784ea0004a23c2f803346c5acc00c1fae38e7015f", |
|
| 211 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/stripe-ad.html": "046fb057775c05ba14c426912de5d1499ab7ac0069ee6b3920279cdb551e2e4bd7c343008606bdd6cd9231e90d3d821085a7cb43fed8871ce687ef42f26d5a33", |
|
| 212 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/stripe-social.html": "0e73d4df0440bca1dcd3d32a3ffd1cd566a0a04e021b0c9b777e4503de7a4b90b4132d248e6a317093c276011b171669aad65399503b1e475afe593eed4c65d3", |
|
| 213 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tell-me-thanks.html": "7b4aac2c3b5b1fb29e48575ddaf771e9769bb4bc7e9de53b1e6f1001c26ac8380609e3697af6a687c144edce9e0c56e6f7ae24c961434d6c6f7f7e5f0a8791c1", |
|
| 214 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped-inside-anchor.html": "2f385fbca67c27a5700b81c77c8c568536b2f35ed39e5b4baf9b80b4f50c40fae8b44923a2d48ec7cbc78bb4fb3a570533bb3a8a1635ddd6af3d93a5ba58135e", |
|
| 215 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped-inside-btn.html": "94101d52e8831e9655f0100a23ae49d9ba861c55726eb5f5f4e21534224fd3b0faf507adc0f4cfdee449a6713a20f5cfbca2c06e9c580702cf64f8bba2f1f9fa", |
|
| 216 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped.html": "e773c3bbe0f72df812bf3edfcdb2fbd7469b9c852c06d235f2012cec2d7dedb804d615de3b004e1ece3cddec1136db0580a8f256197c1b07629468ffda1b1940", |
|
| 217 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked-inside-anchor.html": "59f6a4cd94a0790767d72b0a4f83d1d749667d43bccd60628e271cfb934ad7adba2d8f913c4f55708080aaea6c781b271b09107b56f276c996b49f60a18e911c", |
|
| 218 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked-with-text.html": "37054624c8aaabc00921b74100c417d1dc43fe9cc46a92ab6e4c17b496d5c952416936093135637f9f01c41b78b73c727a5d921f036bb0491329a42e3fc8e8bb", |
|
| 219 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked.html": "644604c9302130434ec413ac9f30532013d3dd3d0ca6f36ab14bdead72ab56386bf3faf46a0993ac2d4ebc46e37b853a3415bfe82dd602b9379e6260574e2323", |
|
| 220 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/thanks-to.html": "e95ea8282f36803c852620a01d0d8dcd0c8bc217a863db947aedb700f40f2f3e63f3aa64bb32e10cb2c2a4e4e25aa85f65786106555cdd688035be0bf8dfeffd", |
|
| 221 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/why.html": "c8bdd398cd372d29a4221d90003e41ea64851afad508ddc07a285e59abeef7fa708db378de329ee5d43d160593c650e6c79a0771448c435b864256437f665da8", |
|
| 222 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/base.html": "55c3ac21d5fcfc6af1af7b534ad3dd540d6fd574d2b6f16b4a1412977f7e4aa52f3fec17e01cbd8707bbdbaae250c5d14fe3bf776ba34c58b31105905001a92c", |
|
| 223 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/icon.html": "d58a89c5f5e459f76b6193976ad8d6fb2790c761344afc1e9714cadcaac4295fa33600060fb719de9ad2d6b4bef445921cbc94e9a7df3163d198cd229b6a673d", |
|
| 224 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/survey.html": "3cad49f4be12b65f99e525424b4a9da671b1c9e103b0d086f60bd9c0321c58048c83b2e2473bf7fe39ce2a8954293c6769ee23a11511e7ad9498b95c2b4d18d7", |
|
| 225 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/flatten_icon_filters.rb": "359a2c2e490019fbd73818b7bba512408baa61cb9e3519eb97ac0d6998148e753ef1b9e6efa71bae9f6450399a325385cc7377db998256726845e50d94814d99", |
|
| 226 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/icon_page_generator.rb": "05e73c7a8787eed87f8d85f6e4c4508d35a853623624fe1addd208172ff8ec5ae7f5e5ee7b546c044f2766843e07d9b9d492f708697f319a3cee839fe6792fcc", |
|
| 227 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/site.rb": "c7e207a821c852b18991122f2397613a8f9ccfaf511b80235a8a17807498f8090df1203c80311b53558fbad4bb3b251267854701521f8b639f7436403e1f21fb", |
|
| 228 |
+ "phone\/css\/font-awesome-4.7.0\/src\/accessibility.html": "e3189df725f9a93f691530e07404bd5f0572121bc8b4f22f94caa724e783be7e1bf7fef39bca4dfa99c640689d6ccd7f379c7750e12e3f6d0422524554ed80ee", |
|
| 229 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/css\/prettify.css": "6947c12db54c8c2b0900923b14b3a0aa8c15477d9b767bf6c7d401a3ed1b0393ad6f03b7a44a11bd81289fc350608f0fb1cfaf7df80a67ebf7ab37815df7a453", |
|
| 230 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/css\/pygments.css": "35cb14cd45b94b0190d26a84549156caa20469918569cf3a382bc3b0ec200206e553218af8508c31ade050241c304faca75509741b9fdac87a78876f06a8dad1", |
|
| 231 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/HELP-US-OUT.txt": "f0ebc1e7ec38a8cd333b34e2deebb416ffab31f3cd707f27e310beff328e5e05962a023da606c62559c8b606f7138b90896ee304fd45e86afdd2910ac8cdda57", |
|
| 232 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/FontAwesome.otf": "a3acaaac3a9861ac7a4ba23e52b9115d39b674cb685b45454fb4b80329a4f7370b5ea7dd8b41d630798f8a54082b62411fd63332752296dbf5f2b3b96abb8874", |
|
| 233 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.eot": "c160d3d77e67eff986043461693b2a831e1175f579490d7f0b411005ea81bd4f5850ff534f6721b727c002973f3f9027ea960fac4317d37db1d4cb53ec9d343a", |
|
| 234 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.svg": "4f575d52331de91a2e32cc3408dd0eaf0cf25b7244d34b226314e3647e85ce284f86e3b7238c6c8b9022dc4e2787bf51620849290cdcd5d4c4bc905f289d2156", |
|
| 235 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.ttf": "9ffb91e68c975172848b4bba25284678cc2c6eb4fb2d42000aa871c36656c4cebc28bf83c94df9afdfbf2407c01fe6b554c660b9b5c11af27c35acadfe6136ac", |
|
| 236 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.woff": "9c776dea55a01fd854ea23b3463d9ac716077d406ecbe8ed0c9b6120ff7e60357f0521ab3e3bf9d4e17ca2c44a5d63ee58a4e7a37a3d3f26415a98d11c99e04f", |
|
| 237 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.woff2": "838fefdbc14901f41edf995a78fdac55764cd4912ccb734b8bea4909194582904d8f2afdf2b6c428667912ce4d65681a1044d045d1bc6de2b14113f0315fc892", |
|
| 238 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/animated.less": "871260979d82ccbfaba0da449a8db5fda5149ab93f6cd4c3b7c7258f4b02519010e4b9488402b3bc1483ffe9b1c28e48371827bcb3815d8bf2c2c9fa2c3457db", |
|
| 239 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/bordered-pulled.less": "fbc272ec15a506c75aa742979053bd53c137e096b9577dc2c2921ae05da4beef051b5c73d523e788009e7473cacfcf2a3f3be3d756f70533fcdd083c28f06283", |
|
| 240 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/core.less": "7dc7ebd8db2a4a82608ff2bdac7dcfcc25ceaf328ca3dddc24b4d9288dc1cb0fd9666f049a24e84f49de93a9808bf4558a2c9100b60a18eb6ae8ced3ca1e08ac", |
|
| 241 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/fixed-width.less": "840595e81ca021f4171407c5671024890d8baabe223d4aea8fdbec4af80506e058a02c007b9a8eab3b22b8a1233da5331645f54d458d0cd85e126fe7ecaf0f72", |
|
| 242 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/font-awesome.less": "16a2f4f83d9c99c04db5f3a2f8b8f912f2615815d46b4248e93085a0d85b26da4602202e7edafea260cb4effb3966a29f35c5718376787df53b463b671a44358", |
|
| 243 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/icons.less": "fb4ceabdd56efea26de2ca8b1d36eb5bf9449945597d8a885154bb4826beadd742d7ed7bea85d0045b2212bef5271218202ea13a9752162c58f828874c281c12", |
|
| 244 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/larger.less": "fc61ace85bfb818341e45d7ae4863fdbf772ca3880f056951a8029fd0c0bd2aa64831cd446ab5f8dad19e4b332732eb5cc0d1f82e07ff28284a270545e7c4fc9", |
|
| 245 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/list.less": "93822d88bcf9a647867411a47721786bb3404a45dd78b1155b1601dea5327f4cb913248014494101d9aaf5ebc53ca8f7b0d279971199c84d0fcba23af42cb3ac", |
|
| 246 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/mixins.less": "49774e645ddbdb849361cd519f93ac859896040ab6e282c2ca4b7ee5bc3f0ff9ae33febfb03af13f5c3c70c64da49020d6b38aee87c3cb49bdbfd2997e008a39", |
|
| 247 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/path.less": "2214dadd8025d0da912ee4e0366a25b6d521f61ad04cd61c0b13140a9465d7711db8a80e3c83bc5410624eeef8bb2dbd1aba48cc3fa39b75d5eb5e91afbb7ba7", |
|
| 248 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/rotated-flipped.less": "0c410031dd5a13e53659de9933ff7cdd1c474d7aa7a92bf3f0acc635099abe6e09eec47385178ad757e604241d8a0a631c4c44c025f588889ce003844263ba03", |
|
| 249 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/screen-reader.less": "7d5c0d28b78b9c24b6af0181f8bf72d1b7bf20c45edbf1594da8b4c8391dd24920b9d0ad186ada7217755cbbabb9bf6ea52acd8ed39f7c9abf4659339eb70504", |
|
| 250 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/stacked.less": "02c86ec39dd5c62d633350a7ea40f08179f45d45ee120f980fba55dd9b3268901bd29d83029889982e180c890d8407f9d8902c0a83d65f9eef8cda449dce9b7f", |
|
| 251 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/variables.less": "20beb08c4fd41e8ea8c5f83402e381f4cdbf5ada68fe4f55a3b7131e15376da55615d9abca6bc4ebe1c5d592f43bcb68099c4fe8291000dbea7aefad87bd0cf8", |
|
| 252 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_animated.scss": "0e27405ded612c01c0d1fdb3327dd0e311ad92146ba05099bc7ab26486fa2e1b6705f642078027696eb66b07e05a0c4fe743c24f5ed28c99b62a095c96e1f0ce", |
|
| 253 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_bordered-pulled.scss": "7e4c565381a5bd3de2c6a7d2d706b592ff23b9634e8aee400aa900abe45b34a6c0a0457661d24c39d2688c0d2464f69cb1c6b38460ad09c0ff22cfad1aa572c7", |
|
| 254 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_core.scss": "a08d491eb1c351847ff35af3220bb18d3f7bf301c56e34f682fbb81f27612aa26ce32cd9cc491f82b23da16cc2d17e4ebf9afebb2d5c040f8639476e247ef912", |
|
| 255 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_fixed-width.scss": "63ff8f10bd612ecb27b17775471d3fd2156e23f20ad5949b444a9ce5c7f5c4c4e963579e90f868d4bee6cabc30ac24c8b428a5aa448c6329e85a3082e688d228", |
|
| 256 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_icons.scss": "bb0c2c272dbd75b0da7e1dab2155a7dddf4e4a15db41f6bba899af8fb0ccb6dbfc715806962c52596e8ff54655a62d12892c05e39cf8d94a32c1b0138798c3f7", |
|
| 257 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_larger.scss": "56e124c9477776ebbf03a9c1abda1216998d58a901bf6ee377c50f7239fc048a2fa72add0f77c8fd01fe38132250a6ecfb17cb37a415b2b2efe38fd0432822ea", |
|
| 258 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_list.scss": "cb337c087a7753cffd1298f24f3a6fda676afb4116f2a9bc52182cf0be3b2baf916152a146f808da073de76f8015157f6384c8c8cbbf743fa778729c2155e058", |
|
| 259 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_mixins.scss": "1a5738e10348256551ce5e24ac2c2999cfb471f59e41c6bad9811fe00cff0d5d91fe3941961ddae0ab799022d1efd55bf771e91ef9198389dbca737c4bf5808a", |
|
| 260 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_path.scss": "9eaa7d29bb402c790bf1ad40ee849e26743d198bff3cfce0182c2320afd9d47f4377b2bfb147999a057604dcfed33e408065577a516be0f3623fc0df75120912", |
|
| 261 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_rotated-flipped.scss": "214f7a0b8237f34b8c95efa9dc56ec15b61700987b8e240fa1d97c29aa2f615b87913bb28a6db1dc92ffaf3e80984e4b5f0b602b94f39604fd4613fa5a146411", |
|
| 262 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_screen-reader.scss": "5e3c8df5f64a9ddd9c7dad6f939156090e832a43c4352f7f470169ba22133267931f53100da2a4f4ec5e5528734c5d60c42ebc64fae6a5ee1dbc2e920dc343c9", |
|
| 263 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_stacked.scss": "10ea316ec6c669b0d07a17eb585f73da0038a9ed622d3e0bb0751ca5ef61159ce6593c3c53e1e0c589f3dd3ddceb2e9c08215475635611fbda9f8e6f7ba5c7a6", |
|
| 264 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_variables.scss": "f036c1d9b7c98d14708c711ee7752db086211c571af722c0e726541fc1429b1cdd1beb747e5e06547aff18f12f2a931e0e78f42e2ecab8f9b70e3fc2a57b9b04", |
|
| 265 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/font-awesome.scss": "0f0dfede40b047e2fbaf5090d3f08a06637444c3f9bdcd8cd2242a8d5df7fcec938e073b1f7c91c334646e2a324d6de12f2673424ce7439d45b99eba020361fd", |
|
| 266 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/ico\/favicon.ico": "8fb75ec6e7d4290d0f342ab1cbbc4d507326fdcae091b08c25a27be56629ab35d96b999cd06c10aea1db67895dd3b3f74c4359c0e4b1f429503bac3764a76992", |
|
| 267 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/algolia.png": "d2af6d614e206d73dcce611d448befaa4899b09ecbbbf0a0aa6dde1e268958415ea5fd9a2a87b9b1fc7354fbfb1c1161ebfd7170ec3b95fe4be790408f6c89d9", |
|
| 268 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/logo-themeisle.png": "ed8dc9ff39b794aed38e9f2cf46993d72e027d1f15f662b3f98eb6e08cdb700f0bfb83fccd4e16cec4be2d0f41b4ff0afcc3776f4a2eddf05fa6fa2b639b9445", |
|
| 269 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/logo-wpbeginner.png": "9c6ed3015a57e44c0538e52080de6033288689387e12cb648500475c42e2fa736cb027e2ce547d63750fc5ceb3831c3473c656ac3e04fa313aecd399f23e6ebe", |
|
| 270 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/ZeroClipboard-1.1.7.min.js": "99deba8b85b7aa2c092af1b7a2e09757b1b82b6c9509ddf5af0edd48a10a1a7e790158cb473cb86aa133d79d47142f14e8fc15ff4cf3ce9e39268af6593ebcd9", |
|
| 271 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/ZeroClipboard-1.1.7.swf": "bb635b563a8b0a637d455127a40bf817ed57c4bfdac1cc07858faef1fcc488c3bd9ad057cba83ec38c7a2cbce0522ab402c4d215303103f6f3227db36716ad34", |
|
| 272 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/html5shiv.js": "d3915b572fce20ce95c1d5a0bb75f424bf3d6f71e726a77afb50e85c457603d60241cb4698227dd3cf071b7133fe444cf2f0e6728913058731173fbbc9ccaac8", |
|
| 273 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/monetization.js": "7a8e7b8e79aba68f409fc32188905637e798d79de92305c5907c339ff1c9bee5f22f2d58e499e73316f6bb39db580224299d10560e9e29476f819598b19b5076", |
|
| 274 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/prettify.min.js": "7162bb9b467682742f6d87ea94300000064fc54e15193c3d7e5a4f898f0ad7dd55bad8f01933eb625ab1a0f4a8191d7062e1acbec6512ee610d2c0c413c0b34a", |
|
| 275 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/respond.min.js": "a133ec6ca8b11553f9e940bd30faddeeb2465bd5cc9b48f3431670140c1f4d1d74b2362729e1e907e50d6a2411ea58b2027996ff0ee3e5f7a420526f8efda5d4", |
|
| 276 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/search.js": "1a925281a9fc0721c8b290fd8f6048db5bf31057ba7050228e7245d05fb1fbf6742884355254f00ef1bd68a4542bdaea73375f0eac1f40ae21f280d0d08f37cf", |
|
| 277 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/site.js": "71e19b41cf03a3b0bf05e1bc0c07a0ed3cff51968470b22502d26357a337cff80179d9e2546082851c07ffafe2427919104253f53c97540f90dc2591662ef9d5", |
|
| 278 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/.csscomb.json": "7d746f81e37b2a55e4eda116b76f688e057fe1e7a7311dedfacfbc2943dac84b2bda9612140cf7f0089015533d9a00efd90fee5e260a2bd94b7fc73737617368", |
|
| 279 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/.csslintrc": "238adfbeee24fd202885d332d1316c44bf23a37e1899b9c618215715326a3a0a84112ea18f345203e450d096795ddd7b859a055296f8d2f834b2b0eb7f7d5f3c", |
|
| 280 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/alerts.less": "6ef653823ef237fa019122796e00afeffe3e6f69773b3282e70595946b936a8055865fc1ef115f371be0c81a4b2abf6243de068d8b75b071fd856aec8ba87d91", |
|
| 281 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/badges.less": "ca5abfb72cce5fcd7958c53fad833af4e8321595538ee76a4c2eeacd79f217f8465c1b86bca32357daf1d7a82edef5560bb9c69c11d137a1aa1fdb8da16d82b1", |
|
| 282 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/bootstrap.less": "abcad45a2e54b3b501bb5219bc5883702fb9a15e8a23fb9b3a9c78ad705b99ee39c042972ac756409bd85b45db460572949374c0f0b8eb4885ab4d7529b45e93", |
|
| 283 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/breadcrumbs.less": "66bc7d8baa9d552aa7bb832fead9ffcde5e9ff1ee9aab436c6599566bd3b87849a74e1a888d7d33bb925016a2dc26d0f046ceaff40bdb06464a550a64f27207b", |
|
| 284 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/button-groups.less": "b99d1ac30a521fb6163effb388a25114b8f849718bc1a2c32bd4c36423e1b51b1d45b6be181ec0ad39d44debb1475e483456c8fb21d86bb2356addfffd488c96", |
|
| 285 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/buttons.less": "d2795ba4cd91e07fffe5ba49935b36583c324479ef3d3741330e9267430b0f560f24c059dc1e62c5bcab21084790a87d38dbae051dad3a6e50a403abc7b7ccab", |
|
| 286 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/carousel.less": "e9f601bb603e0a39d1fd7efd07346cac7d094ae1cbf8d8b95dd2836baf7c25757660a532f1a7d8881c9582234f07b64d57e81ee5e863c901b141b6119696e21d", |
|
| 287 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/close.less": "e2a6a0877df37b1796039939c179b98f2768291a1c8ccd26fe6848590fc865df9f6f0016c6b5b0d0e7367746ea27c8c9103df4bf5efbac063059e4fdc0db3540", |
|
| 288 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/code.less": "3932fc44533043a4000c26e4fed51f231c2dc054e561c9d4167a5429799b813d4b28654d9ac411e3a425b66217b090ca72ddc3d5963459fef01fc92386ecf525", |
|
| 289 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/component-animations.less": "bd7517bccb89a397d29bfb1db20bfbacd1b28d4927330168d8984908c1e7d0f647c0cdcd646f8b009344bc967dc751ccedf0efa872691d23f26e2e3debd6b467", |
|
| 290 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/dropdowns.less": "bd193d3168a7ec1eb89a484c5e79c37a4ba7d6cfbf5b922bb2e7037b88c3b935fc31a9d9c3c52a92c41b03640a6bb12d61917c2f0128c33c64409e0531ae7ec7", |
|
| 291 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/forms.less": "c8893acca4ceee40dfb2fbbde9720efdfd8fd5f1e74b0202be26aa3746c27c5e836f7268d9b44466086f5eae106571d4be2d4e04011f85ad45d7ededecf4d73d", |
|
| 292 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/glyphicons.less": "6f909009f4e9f2b6aad0337c650a3e396b63341ee6c4099baf4537a07256f423dcb969f3f452559b0b3790992cdbbe272d52f4898950b50cf386297d5ac693e8", |
|
| 293 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/grid.less": "9638e08c198425b7e46b2178f022af3c4566adf6e9cc1ce1386b595fdfcf7a07ee51fa60fa9f3c55f02fd9ae1d2e1198e9534171582b0fea5db0d4288854e215", |
|
| 294 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/input-groups.less": "c8e470633c05493fc778a64600ffad97737f34a94423217849ce01b77054a8c1d0fdd85350595c7c30bfadf159a8d1ca2d04af9f49c08795e9387020a07a4447", |
|
| 295 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/jumbotron.less": "e3c97f308f50a5a3914eeceeb9a90dd1a7e802492c2c3da657740c997852ee0271a1dc06fd497ab44625544314c4cdef3bb16cb0bdd5067ca9d89b5cd64a3f17", |
|
| 296 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/labels.less": "640e8861faf662e06fd4ff06a92382a27319fa39761c78b8a19c4b0ab2b2e440b4ee7cdec8a0f7ce67a12f0596ffdbbd19308e2e9a63d164709ee083edceec64", |
|
| 297 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/list-group.less": "a11b70ab5618e5ea686893fce866074b51254c93d5bcb02fe30306d143b791e76b3672b7f8fe51545ef30d73ab89732bfc45cf2179dcf9ae07ce38d27389f422", |
|
| 298 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/media.less": "e8d21a5bc99a08d3d04ee371ded649b3cacd1265988efedbba1e8aaead14d346326c14b64dc6aefa744e232ef6ab46d4ba8a1d23e7aa26b276633db92ab94420", |
|
| 299 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins.less": "f8a8d51bd105a260e9db963e2e7d636bc91c93c51f117574e199f90cb439daaaa32616356b884527ea48b9feece9724952af7ec1452355703df624c8b498e5a4", |
|
| 300 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/alerts.less": "582d9fbaf2f8b6b737697824af7ba9e47f98dd4a001b60f1668c2f88aed8bdc3e80311618bad7b07605f81876cbfcbc6830b620bef0ee9fa57fb90898988db79", |
|
| 301 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/background-variant.less": "68709b0c5b5ba52b0f583b7421f79bfcd32c2784620f0ee8077a0d788ddc38a43b11863cec3b1a183451115f257aa7aeb58d077f066e846639fdd881ad069649", |
|
| 302 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/border-radius.less": "e495c886182327408e6b82511baa49dcbf1e2b05104f844f3a57fcff40a49eaad548e19ce13853c45e74ac52689d9479792cc3de55a020c2229128f595d5288a", |
|
| 303 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/buttons.less": "fa6f88171ef22558b095a136769533231a9b0ad8954211f85db3a42ab19492e0d456d5feb419f237bef68d1f75ddc42442154a4007a45b76f17608ec907dcfda", |
|
| 304 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/center-block.less": "3b81464925a61dbb2be2b11d9be3292e9a3d42c65bc05e52f84b91684e0b178021dbd73e6f613c89f39c34ad311d039bb80332cde9bb64ccc51e0af49e63143a", |
|
| 305 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/clearfix.less": "5989cda9e86899298c7e7c9cf73004d94d6e53f214dbbad93ca7e7e790d1e2043f768481ba9d20e1b7ff5667fbb4902b213560d09e3a7aa7cf977f55a9247614", |
|
| 306 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/forms.less": "07dabe53df01d5324803837089f67f74b8e890330859fad42fda090f2f9a35280ddf531cbbc6b549e26002d5afba0e1773cd871c63c7f2f580b67a042f18e403", |
|
| 307 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/gradients.less": "31b17118826eac8be3aad693382b82d99c01983b68ac37c5290d07920f76f61134c69ee12f9f5ed335aa392e69dd3bcb9a512636142e6acc1827f6db673a5a12", |
|
| 308 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/grid-framework.less": "ab354cc185f82538cf2532bbe7a7df82dd197a6355bfa3c333164294e329742a800f26641fff2857f7269f80a30cb1fc8635fcf6c7575b7b98603db973d4a314", |
|
| 309 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/grid.less": "4ef011c62ffaf26988e7f30749a58e251f316ccc3093b1c50d5c65cd66065e2af58bcedbf3447a97f5506df294bb2a31ec0d2ed01c70a977135e153991bb6fc6", |
|
| 310 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/hide-text.less": "770055fd6a76bf5881015e17101bf9079d8e05188ea70e42ad8a2b8d4d141be3e7756039dd7b904786fc79c8f14ecc58d7c9da4122395d6bb5b9f8766c86e3a8", |
|
| 311 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/image.less": "a0aa831f323ab27f3fe324453e54382b7e4ed8da5fa72e9819df2b3d07705c800ade9f8e5f732eeb36043096479798a812ef712c589164a629dce7fc9b49f75e", |
|
| 312 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/labels.less": "3923340ff6b2eee8eda3819d42f4c4b7e6291f9edd2b9807c4548e5bfe47eca3076b62de3c5bf257dd7af4711eb1059f0e342984d2e7a606d2229df2b5678865", |
|
| 313 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/list-group.less": "be85a41f96cf369a90b27fb5b1fe477306fd9687971fe85bfe8aac3a4ee21c775a9b55d2d0062b66a50e71a11368bf6617ab7962c39b978252c20631b4d55db8", |
|
| 314 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/nav-divider.less": "89478e72ea248cdf80330b4fc356d0901ce5637e98e07419be49ca8dbd563d894af7fa7fb0e8acc8af4255a9c8a929615a19067e83ff554cb7db5a14ce3aad61", |
|
| 315 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/nav-vertical-align.less": "2b5ad0e0e292a091f90fd02947db3dab499d47c7e44562005a02b4beee1221baf602687aefe63edd30b6ba2959fe2e94ca9088fdb0e7a548d5c722dd3684710c", |
|
| 316 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/opacity.less": "39f3e7f370cbfe52d61b08688ed4e0070ad396ed7e2e9bc068d3f10d31cd15e1317664cad0cba13b15e4c60076f1fcc353e28e2b2fcb1fe5f3143ed87ae2cdf2", |
|
| 317 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/pagination.less": "1344d77a2a54bdad0f7c731114e8ead128335bfab274b36f6ba8c02f6362acbfeb3718452d993f945f78af7f439f1240e4205af3b39e2d12883f9ab127a7866e", |
|
| 318 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/panels.less": "7518af77aea6fa3fc4d2950ed0d7df5d9fb374f7ffc52333b8e4cd6a785b2dc8b1ffb12cda7e5fc3571bbfbcf7e480af1ea8ceefcea09a6af534949d8622e73c", |
|
| 319 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/progress-bar.less": "b390e21c7a4fc508ea0c8403dfe7e89d0d7c2e6402cd1a7972f1ac3cdfeb354d6890e3d2c8d214575110162326b0a016055a548ca6d6f0fd146a035eb8896a55", |
|
| 320 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/reset-filter.less": "1cfef8254d9fcd9d3142c9636270bc505cb7ff3d4e74faf7b3f5c90fd5d7eb4465fdf4affeacda7e7ce40800b8756d3ea2a1031f6729eb975acbba71b3a64b37", |
|
| 321 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/reset-text.less": "e7a4f4abf9fbf88ac5c756798751d7e0b0ce1390607479a522d3044682a19054a1cdebce3a66a4a2bbbdbaeda9db8d14621f12ae7ae67c4ddaaa1c3f43c9ba75", |
|
| 322 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/resize.less": "653227d4ef865d5ac4e8f844b72019847c1e06e6d9063bb18dfe91b4316957fec4f01063585275b8cec695b602edce11116320972306bd643cecacc6d80fadd4", |
|
| 323 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/responsive-visibility.less": "4d75a3404f4f5e8e3364a46ddbe9b9a6c0e780825a71ff4e5ce7c712eef99caeeb47c198df6df4d22479a72ff769247548638bf222f492762fbba383028f3318", |
|
| 324 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/size.less": "5961852fff078e8f3efb4d2584e60d59d5a74ecc325b53c03d80a63339a86757019d34b28435597ba576a7129bd697f7e974e4a374c772cf3d740f4ec27ec720", |
|
| 325 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/tab-focus.less": "e277a74a513db05ce8c8bef7a2aa56a2e45b0a6f7e49432eb2c07d9e876a950292be339f6d8937eb0339794f632b6eda5fa29b9ba6e1c037b6dca1f720549f8b", |
|
| 326 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/table-row.less": "60977b7f339f344350b9c904cfabb9209a1121cb26ea41cf516f01ce3e3f9b5f7e262c298d97f33a8a5f201595f3ad0166d800dd625287deb7d3d416a91093a1", |
|
| 327 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/text-emphasis.less": "644b7f8385aaad90396707bab15dcd319a71f0a72eea7c0721caf98dfe53825b76973dfcb6ad51ae6cc28d181f4f244074a7ac95c29387231697db7de5af42fc", |
|
| 328 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/text-overflow.less": "a32baf8bc0d47de27e34ffe09a37702a0faa5e541d06803abecd9b82bf59de1bf0a7ea85ea23a68b84726c984ab0caf62e520b1165b80251c031fdf3060f6c20", |
|
| 329 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/vendor-prefixes.less": "6857da23deb03264fcefc6ca3fefd631571aac71203f23292024f20e0d5bebf4669b5dbcccd36df095460bc9027614396a9f42bcba832e968498d4ac753c76eb", |
|
| 330 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/modals.less": "4c99c136dbcf3ebe6a95e694ab1bc14a1469f9dca8311390661e5dde3201dcacd855aa9b4400c54d16116a60c98412a06579938fe1c534c7b8643a22d0e6deb4", |
|
| 331 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/navbar.less": "36d19bb1a44da00094675414d564a1ab382e3fdcfa1eed9e74f5f9ebc0ea5cfbef151996a44de9c9a975d088f409f73fbaaf01887ed0ebb1828810d82fdb3e7b", |
|
| 332 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/navs.less": "d19df77d08c0bcb9a534533943e2f722a54d26e94cf328849cdd77aed4e1bf067563c0cfd4997f8eaab3dde47fa567025d3283f979d8be5e61c121b784a3d98f", |
|
| 333 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/normalize.less": "d0a2aafb6b60e57d40747d6b1e36f25011ac250b853eafb50478d4abb1c166aa89edf393a62019081ed19e08b32c6f2fe013edb00090437dd8fa5737379ee718", |
|
| 334 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/pager.less": "7637659ca2998df19ae2d38304067029b9944db4e70a42c2d0e77ce52cbd0176d765490a890687cbbb24334bf098b4cf54931b35bddc26a85e205b81114dd6a4", |
|
| 335 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/pagination.less": "365110bafb570d10002748f6d2e743a16a27cadcbe600d64335a1ac09ff690683649872012e3a60bb92a611d87f409b450bc0d9de28d6aa1decae8f70a1a0491", |
|
| 336 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/panels.less": "d6f37fadce28cf9e90bd1dc47e0bf71b1bd8b67db3e19b0447d2a6a3e13def8cae5d2c52d43aecbfad80fcfcd0b0e24fb5eea205bc6733e10d90b22dde5f275e", |
|
| 337 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/popovers.less": "084501129f4c74a32eedbd78f6888cd48789e5175987dfcf45385c98a54fbad40654415e6c531a757b1108937ae9c6b9c81404700d754fc54eb925ea4516efac", |
|
| 338 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/print.less": "9c4f44378fb1cd28535572fd768baf652de2614f31e62753ba79c02a313ab509db28f52c3d0c78665d2384dd7be47edf97e243ef83c6b22e38edec56873aa1ce", |
|
| 339 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/progress-bars.less": "41c051579d9fb7949b128dda04dedb2ed8adc358b157cf5450d375962323725ee2faa7a4033613471f00544596c8fa400d22d9965c77544aebf6e56b3911cf49", |
|
| 340 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/responsive-embed.less": "a0288862649916929c2de7a5c982f877847f687422ed205fcb9b6a197ee98a6bf52fd012725f894d951bc6ee4bfdee0a4a8363e652f93b8bb98140aed1995533", |
|
| 341 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/responsive-utilities.less": "98690e8c90ab2c0c4d9662786b7560f2198a968a4f4ba253b8c87b9402b02c339516c89af569acef3f6f37978ead0a41b234a164f5f16d4828e5bd2b0459f370", |
|
| 342 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/scaffolding.less": "882fd7d208e76e926ccb9c88ba56741e8baff7b6a46bb17a4c9652778864e63ec04f5113628c6c39c4a94392974293681e560a0e3015226d4c1a66c19e085419", |
|
| 343 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/tables.less": "8588df750d6291bec4a2359fa6f07658d0a9267b319c47560d61ea909aeef592123fba6aa0ce3cdff19fb92849bc8253f67c98ec5ddeeb782ec73998034c67ec", |
|
| 344 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/theme.less": "9b0c31e6b9f57bb814edb418813052427ccc97fa23a1ad9c29e1b26f9eb26921948727ed5804cb72d302f53387f4e87aaf8c436e10cdc60c39d3d10a8e89f228", |
|
| 345 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/thumbnails.less": "000fb95bc0b7210a573f6ae1d336c1baaa78764a9ef5c5054c088b5bd993c4866ee8b5d525c35b0e99d796545389b0a00864c7187222ca23d1d5f395a804a6cf", |
|
| 346 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/tooltip.less": "76459540fb8f856671ffa6da159ccef956144ec4e38bf73ff2c0f0af40130592d87f7fed1b1b9eda2bfc6e827b4f69dcfbd82a07101b4ec60b8a1e0c3d1c3315", |
|
| 347 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/type.less": "e2f164468cdf7097e0b3b456bcbae8ba23774c9fa678f2eee698010924f8691a8477de1c259b7e592c5c75f8dc959e7f051a501788b4b7ed4bd73df89a028595", |
|
| 348 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/utilities.less": "ac3407691078aa6dd779ff6ae1e9cd26abf9913ac18e24188fa31fb3e69b1deb31f7ee8cf8ee7a5fe778d4b0a8a7666faf0d6b30c46257140180a6a6147c2269", |
|
| 349 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/variables.less": "ae9259421469571038a01a417a1faa001b312ee8a8c16b22022cb169b1ff957a55c0f0d9d31afebb74841f3a23b35c1c41b6c0d66da7a9d16a26e91f7381f0e5", |
|
| 350 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/wells.less": "58014e2654e7364b1665d22a62edfa71828822547362fd42ffa3580781b4ca5a5ae6d209ce7916063ebe1f619147c9fc64bddd3b94105635afbdfcf9dea71d9c", |
|
| 351 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/gandy-grid\/grid.less": "b8bd10ea52b0a8ebac7df606b883a3d9c3cd86d11db93494b822f848f6ff712b04f6155cfed3dbfccbd5676e5cb7ee9f1a965806476f771ba805e9433380b83a", |
|
| 352 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/gandy-grid\/mixins.less": "201801419a28897fc914d74545fb9653cf133957c675f69fcb12fc1d210017d850821eb2b76e8c3e768639d47089ab647469147646c2e49761f143c7c9800b09", |
|
| 353 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site.less": "2613c3caeb1d7f65290aca49a2dadaf2a82058e915f81fa1e95d19a8cd2a1065e80af28f870c74048848fea4097f3e4630b06b63c54ea2219ca1527e22053dea", |
|
| 354 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/algolia.less": "3aeb335ed5081bd89f699218f6a94aa1d1d67e9d0f12608b880fe6ded5948f1172f93c4a3604970eb2e0d57bb88f65b192891e2ad77c6b4ed6d9bc4580d64ddb", |
|
| 355 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/banner-ad.less": "f5617e2a0610c67953cef2f11f14d969f2acc4d6f19155a3b9386e6da7cf938d1d0cc6d2f437348aa03285683bccea3b1e0e61b644ed4a402a38e85c0cf5e9e9", |
|
| 356 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/alerts.less": "5bf122c528abe73261e3e5fa571cbef01e133e767c7d59bfcaf5ed88d4747c66b26c8c6f543de14349e5c6ce30a0985cd1ab5439d53bad1036ff29fc35d466c5", |
|
| 357 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/buttons.less": "e770985ec8cd35b9e3226af40ea32b31540baf07189fb8fb80b9dde4bb6485297afce6e4aae54fea3760ed643a576d8da45b4b76f282edef0487d34f4f1c473a", |
|
| 358 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/jumbotron.less": "8bd6c1a7619f6eb8e89fff5bad824869909c1650d69b7bfbd6a62388644fc906b74de7d4d826c6ef4fd62fe15db80d4a92ca00261ba1f704e30c494842ebb560", |
|
| 359 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/labels.less": "33cddb047fd6080281598dbb61960c0c882fd55d116103531413dfa228b2da0ba7a1d74e1a0a784027e2bf196839d44a7ccc0d5bc6d6f9723618c5aff1a90e80", |
|
| 360 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/modals.less": "e7bd46144060a749a799012ddd68eb40cc2c2591163a5a2daa5814bd3eb4ae9bfa6fea8729a1ef9bd26956a88a069c0e3673555d2cceacc2b486bade7578012e", |
|
| 361 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/navbar.less": "fa7cce0e8647032bf6f84be86cbb21b51fde5ab235d4c9497ae714c450d29a8bbd072a6e0764b1c9b646d5caa1b5386e4b365a08ac725e687a5a02c5db0af717", |
|
| 362 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/panels.less": "dbe49fa43779ed116880f620472a17cb0df73f5e1b4ac422727a7efa5f7820d24656ab6702a33ecbf418db70eaab3dbb34c6c52c8856d925532db6027819bb7a", |
|
| 363 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/tooltip.less": "48416fa9b750f9ab909e6ecc641a3227956361d458ccace89d5c784d3fbe9cd58d2d8e4a1876062fd4217538dd361286b73b72d65fb43b9e8480e74d8ed1c7e4", |
|
| 364 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/type.less": "387eb060b9fae5bb9d75be7fe4243ce95d8331c6bfcd3da567cdb79c750f8bd8a45d36959d0717323b267a081e7c18ace43df84810008256162ce9158bdca09e", |
|
| 365 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/variables.less": "2c0810ea534208a0bc6c97f87b61d7788b9fc7f16c63dd30a10759495cfab6b603fa5a1b7b80d3d70897f295065589d9d95d660e8edab05627f0a096996e235b", |
|
| 366 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/wells.less": "b1e85ac1c8f2b0a3b372d9e3666b00592e299004c7624f8fc27458dfe2cffee3093058b4c9867ac589a48727d5065ced497ae6ae6469636689aa2d2c9b8566a4", |
|
| 367 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bsap-ad.less": "17d85c0b18c3de440cd3ee34fd9f88b20bc00630ddef8e753bf6b0e93933efd8e5e8ff3694ff98df19b422596e374cf28e9193eef073b92e62f3407608c44652", |
|
| 368 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/carbon-ad.less": "c06e5dcc5d97495dcb4acf6eb0dd9eda68ccf311b808e167ec37cae91af8a8b2f963cdbddb8c489c565323447df2f6fd7d62e6d20b8d1fcfc9849316c4eb2758", |
|
| 369 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/example-rating.less": "3b62779f2d1e1da0e09614e27e43e369cb6860ea3e3f25bb416321d22355484faa7ef06dcaedb3b0ad62cfe76bbf89b8f5bea97c22d7b883e1d048a705f94486", |
|
| 370 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/fa5.less": "230d28cd06d28dc7a3698a27b400c643663dd239651c29978bc15d3b86797b43b7530b39730af185c33d6c80f96515ff91e56e3da01a066bb85003d88480082f", |
|
| 371 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/feature-list.less": "5fd9507d3bd6a2a2f3487163ef9168b5db241055b93013555d74fcb2b81ae7866c5011876831f5ade138242a726c39e327ed7c820c760aad4d4f561b52836d45", |
|
| 372 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/fontawesome-icon-list.less": "be0af7e5d5a793d5587c79e02ee245e659ea1de4b1bf2d187971f6f51b6976c6d07837c79659e77aa6dc52d0a423f6744cefb537a37245ace430bdda7953c846", |
|
| 373 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/footer.less": "3195eaff0ecc028109d7a79a1b6d6850d7e619253d4a69c69e7470421617d05cab7a7daa95eff1bb6fea458d6848795fa8f56f4089207442b4cc34fd7f926a96", |
|
| 374 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/jumbotron-carousel.less": "25fc6b59ec1147d0ceac291147773662201799313a4824ea103f7510ea9b328eb9f27ed9768d1128ba655c493355364ab3f95ab4b58b10d7286f17e3b903a5a3", |
|
| 375 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/layout.less": "caf18d839d6a84d1cd0e13cfb2a2d9e5884ac802429175b4da914d77f896155d3c5e4925f4392044827a8f87e79c0f97876432f95b7125f0f20692e2a08463a7", |
|
| 376 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/lazy.less": "e00c9dd4e99db9ec174e6b50dc856637cfb57fdb321b72f95a319b5772c6338f7e1f89d109a6bc18ec890c5d275449f87525dbcc272ae3e89de8f4bf4c6611e8", |
|
| 377 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/newsletter.less": "1e1baa0263cad5613607142776bee6932e57173cdd77cf5a06f79dc104fb479e30fa8f56f6fbec770fd90e5d456d016747960d0943bc01a4d7128a2b336fefb1", |
|
| 378 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/print.less": "47ce33620e649fe5f9e899daf9b990ed8ff131146fbb8a21b6816f81bb854025bcce74d146d0bc08e345502fae36ff9d16dd879d72aff48712c1f0d2dfd06964", |
|
| 379 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-lg.less": "25b983b0a15d3d09e2c2eae2750bef037ea4cf6bf67b275b40fdb615579143dd6245dd9ff53044c67254f9a84efd05813a8d975992b138149fa7e248c26adab8", |
|
| 380 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-md.less": "4d88734ce346390a74caf1579f78b41908c5b386b38cf4724c84b7c4bbdb1de987520f51ee2e23bbbe8fce2733e220002fcc18cedc790613f0e6c1ea519baaa7", |
|
| 381 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-sm-up.less": "5a059b3ae6b0d1fb6339b5a031f036f64ee7093271c19c45defe57083205152a57e82e75f6e7cf9d95fc5c7e3e20f9db144616034f90c4ea8803b4846d2da348", |
|
| 382 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-sm.less": "b988a2ed6bb237b5c25f7556a3e07b375c9ed33716015de07e4f7b7f787d35186539f05b2d4f752c5a59edfd43e3501d84d865530cdeec3a61320690d060af00", |
|
| 383 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-xs.less": "5266a0dffdf45a7e45efb3fdad70b058f713a4476f7e356096417b139f4d85d36a8cf9c99cbe4840cf5ba4ea438cc9ecc599e39049cc84d853caf7eafe0cc71b", |
|
| 384 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/search.less": "de316ec445ee08ae2afd58ec4192419daff43fd3be40a77d29eef3e913dd826d633d9eebbb1b82ff38e0b1c62587c04b0ce9725ed1fc89a8cefffbe4a297e44c", |
|
| 385 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/social-buttons.less": "acd3c69ed3cb1726e4c4707d9ff68bd0bbe928f5ab7a60eff22c7a239214d94ad0d7aeecd7bb1bf3a600ed8e11a44d7631e99c4eea14f3ca986ec38fbbd102ef", |
|
| 386 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/store.less": "f7b3701892b29f7e84f9e98089f9d902efe6081adeb426a6330ea8bcb646345142b980d2187880f5b88ffce816a92ae990cb72ddc381beee017c4cd386290970", |
|
| 387 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/stripe-ad.less": "b15f475b64c9f484603631269f41f319251ed78f8d12c0929b77a48c5d427742b56e2ca5d7ae49dfa1e179357535af024c561fe2aea48de23f79ebb6869f84d8", |
|
| 388 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/sumome.less": "ce6ee2eb2c308a88e56c952e611c726c2cf158109d42918c2e1ef320c45d51269069ba0d50db0d5c443d2d8fa5634f86050794cd2194ff07689b0777a2f63bc7", |
|
| 389 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/textured-bg.less": "e26572839aef1ebc89da8e1d443c5cda4f52d5e52473af89fdc2d0393b472f16e3e26a705ab8086c730c9215eb9109dcdcd42e6705ac9209989832b559b293fa", |
|
| 390 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/views.less": "36c20e316fa6b35959878f3b4a70f3924a0bfd316f34c697a1a3424039fdeb670f976199a01c0896e9158a042eca193674988a4e91d995be289e78ea2ab2fcbb", |
|
| 391 |
+ "phone\/css\/font-awesome-4.7.0\/src\/cdn\/error.html": "7e51a097a684678928af7cd5708c2a17222f9cbf81db4a9f85384d28d59031b48ac43315d167ffc0a45097014aea4341416b885d2cf8ccbed6e5bc331767b720", |
|
| 392 |
+ "phone\/css\/font-awesome-4.7.0\/src\/cdn\/success.html": "47c4fe2b58da41de009380c016e277dd8beaee35055a3328fb9710dc2e24056ff62f6f9698cf531270c7cea3c96eb84336f201e98aa34d2a37c420d8938ff116", |
|
| 393 |
+ "phone\/css\/font-awesome-4.7.0\/src\/cheatsheet.html": "a36cb07fa872f277fac0510ab5d5d640f8d837572c381041cf8623055328e827933b369922dd1c6dc82b7e4bc89d8bdbd19ebd21439a7b95d9b7b43f47d2fb44", |
|
| 394 |
+ "phone\/css\/font-awesome-4.7.0\/src\/community.html": "df0bf171b74d07c35d650ed1d786413adae55ec2d74cd779faa2ecfdabf0beaeec77b603a11b9334e31cd74a5458c9100d9336f905b2d50c479fe34c7cf2bcdd", |
|
| 395 |
+ "phone\/css\/font-awesome-4.7.0\/src\/design.html": "0df2e8909f5138f50322334a3b5bc65bef0b822cdeab29f8bdba4e077ba0f301a56e8724bfb730e8e6165afe3b761db5c6b6cf8ae2b83e74aac0b0e7563dd999", |
|
| 396 |
+ "phone\/css\/font-awesome-4.7.0\/src\/examples.html": "680fb422b52d80c5503cdae6774f4feb7290a542ae93b294961dd96694f6f72c125b39898e21c00470df65414cf4e3e1ae31cc500097e7c8578fa223aeee33bf", |
|
| 397 |
+ "phone\/css\/font-awesome-4.7.0\/src\/get-started.html": "f773d4781b5e4817544fdd144005157be79a773d3b1a8a72e30e98354cb6de28887585d4f64f7ea3a8a8ee8faaf242b77c8d4f1b1319c01bc1ed917da7a537b4", |
|
| 398 |
+ "phone\/css\/font-awesome-4.7.0\/src\/icons.html": "77017e98ef938c868ed33d4c7125cbd6e5bb6bf5426fe9dfbc9548d5224ca102f5b6277ec6d9e26db29fbffe973a8aa8e77d494832ff3ee6918c8e2d0384be83", |
|
| 399 |
+ "phone\/css\/font-awesome-4.7.0\/src\/icons.yml": "b67111f3a3a99ef19f5f7dcc27ff0ad37a5b7e74e288ead793b50ea319e65f4c24716b1ab412e2e12772408b5c1cebb56884cad02d425104325f39236ea4b3c8", |
|
| 400 |
+ "phone\/css\/font-awesome-4.7.0\/src\/index.html": "e3c7f7f120a5f0015a7b63d9f84f71aabd6b669cf19e72be01e15374d357171948935ec8b4824f6aafcae82bd9916ccd8768d1d195fccf0b8f281f17c88ac174", |
|
| 401 |
+ "phone\/css\/font-awesome-4.7.0\/src\/license.html": "a73280c350c239e7e0d8dc4f96dd9ec90e695accf6a86e7a6641ea68145e007b761324aad669fcfc9bd4f43781b71563b2900016b4c78797d392db6985cb7de9", |
|
| 402 |
+ "phone\/css\/font-awesome-4.7.0\/src\/store.html": "a6de552c4d0099c7a4586a2c27ad1bb016461a35bf3d7ec0647ba93c55146e53dcf51b52daae17330a734279513dbf3e6586983574ed5e28d0707bfdb9a13dc1", |
|
| 403 |
+ "phone\/css\/font-awesome-4.7.0\/src\/survey.html": "09b3fb7dd39ff303d463da73133ea78ec9a60aa5f7189929ac0a8aea9fe51c09fae1bb8c2c85772001d4e828a42b7e4c4d57419f488f49b5a9584dc010365a10", |
|
| 404 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/2.3.2.html": "70f712d192f8441b7e2a5504b84955e42360c56b3c2b00df15472a69a4c435c74baae6876c4e8f9d00572f7bc7f24dd17726604025f89b12ecbfd1710b8325e3", |
|
| 405 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/all.html": "8056255c377ce11e2a51b001330f29ae81462e4ace4e7e3ff960d4e661cc282eeef4ef168a307a01196a830f2fb8dcf572b39c3cbb5d77e8bde8643f2a64e869", |
|
| 406 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/glyphicons.html": "b21a79668cf8d1a330ea2148e2f1089d41420f7f0e23b2862ea01e1e3c459d325247339aeee5d6dee5149b4f0f143832b819d07138da87eccbfbe130cd9ff650", |
|
| 407 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/4.4.0.html": "435d1525deea3bbdddf21794156acfa355e9fae0ecb37a64b3e7486d4e3ea798c2d95ceadb12fc3b3f9b4017530e00eb0e44f1fc9c5865013520855b2b184685", |
|
| 408 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/4.5.0.html": "f8e27986cc8539878b4247d92ea56a4750d036adabdb0b208d5e2a6c0df1ced6f4a6a9fd4d0f9ed7c0cf695233a16f6bed7ab0981e7bd57423f55dc5b3ae0710", |
|
| 409 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/current.html": "dc9b48458c1841dd7bd085f7753ccbf27203591f68f0278f0b9df1cdaf9beb043a35d9c7b9bb500a2667543582d4c9b40b5c2f144cf88997d8dc84fedd00ee1b", |
|
| 410 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/index.html": "8060c06227dd2096d27afbc55f027214974a38c5f711d3f0c77ef1645441302324102037c7ad57b116d60c8aed2d847655bfddbfe0ba526fb0b5966435b509be", |
|
| 411 |
+ "phone\/css\/font-awesome-4.7.0\/src\/thanks.html": "cf0b677134a1893d3335991a2a9b9533812447a0817b88c03c6f27c967fe8956cdd17b355b6abe796617d83e0229c945a557345c11580b636b5fd633af273bdb", |
|
| 412 |
+ "phone\/css\/font-awesome-4.7.0\/src\/whats-new.html": "56607f43fc358a79bce938d9198bb7b091159d9aed52a354b57027810564973ddb9f0cd36b6ed8e573f6e9f09b25b043cdc88a1c22d212367e7794775a0e44f1", |
|
| 413 |
+ "phone\/images\/backspace.svg": "3478af3fd81fe1258c242aa8db2b11a44b361a133eafc26fb503d0176f73c3b420683d14eb3bfcf916a88cd7e71807ed961bf34f653051b29d814fcf91d25d3c", |
|
| 414 |
+ "phone\/images\/closewnd.svg": "38f6ba89d70905ab3d2c7d524fee42ce08f007622bb1256d04556cccdf40f549d39ab2fc455c878e6c318c03a8680d042c8e7d0dff9360a921e397e38567bf9a", |
|
| 415 |
+ "phone\/images\/contacts.svg": "53c55a25bb8c76984d3420c5931b001af3528217881ed7ca7975df44234a701015789bf9667de91305a37fc55e0fb23759833ab8d51cefcbc1694ffa729e0238", |
|
| 416 |
+ "phone\/images\/contacts_green.svg": "14dcdde8ea95adcbfbe07f7afad907cf57cef61f208326be5632f11661ed0ec811e1c89ad60ba97448476da87b4597dba7efbfa5e5b455d9153b2003e48e5c0f", |
|
| 417 |
+ "phone\/images\/contacts_red.svg": "75a0a546b7f1adfdbb502e846f56074d1a9bcf7e82c8cba3ba6670cfcfebadb70304bc22cd407d00b635dbd3e42741b947088f3dab5ff6d1ec06f2d849fb5670", |
|
| 418 |
+ "phone\/images\/incoming_blue.svg": "0908604830b1b263749c9f453539925e7e35e74de36b0206d80f3a8d22a23985c02c6b0189672e1a78a3fae4c8462066630ba96818b7a541920ac55219266b94", |
|
| 419 |
+ "phone\/images\/nextcloud_logo_small.svg": "73674d807e80a99f7c441028285f49699b6b6e76a557d1501df0d59c46baca23bbe1fa88c0483956bc3a6404eabc0c3b142ade2f5d7ea3985fb45d1592fceef0", |
|
| 420 |
+ "phone\/images\/outgoing_blue.svg": "8cd86a47310cf6a38df8023c9ff57df2968c8e61cb356ce13d4c3369f09ed5a880d4c63f5bea9fbabaf119eedc773248513401efdc013e2aa76c8126cb1b9408", |
|
| 421 |
+ "phone\/images\/sip_trip_phone_logo.svg": "271b9632efc181f514892220a648aa2636ec8a561e297c1a2abfb64a10ffcdbff37913bf8cc82ad362a33b4faf224e74b45bd32a9b1b760a2e0476d56bc02538", |
|
| 422 |
+ "phone\/images\/sip_trip_phone_logo_large.svg": "b622744c5eff160b77ef7226d8f70eef15311db18d7dea9e334e92b20601a33d812cb0bbc3eef74d6294d1ab43ba3969a7ffde23d8ec2f7f9d1dbf6b6ec18e25", |
|
| 423 |
+ "phone\/index.php": "76fbcca0671da8ad534b99373ea85135e5ead02fd5c9187827cca643515629e06332f7711738150d45178baa4f1499ea9fed686b7a1941fc27eb7a9e8d36adf0", |
|
| 424 |
+ "phone\/scripts\/SIP.js": "372509f1c0e53f3ecbfa2db99b5f6484f2401ddaf3824e70ecd763a405e77f3456c1157ea6af6c9d716da4dfa9227a30995361267baf97541f531dbd6260ffe2", |
|
| 425 |
+ "phone\/scripts\/app.js": "0608709357130f42e85a47dd80b464d1aaeee33611cb55a1629a63984147c808824e26ac132fcb033b93c72bf9dd23f0f3ef8cdad8c63861d4c09e4b17aa42f7", |
|
| 426 |
+ "phone\/scripts\/bootstrap.min.js": "de8d6bf69932b479dcfe470e893effa9f88d399314b2fa74c14a1465c7a6f1da78a3764fa35ee05ddd6a3f225588e601ed5978d5ef48e353e279c596f2471071", |
|
| 427 |
+ "phone\/scripts\/fix-webm-duration.js": "20b024a1264e2ee67a5a67d85cb57770bee8231bda1bdd1418690021b40984efa7b94aabe00fb750e3ee192c744b80730c2b6c34b55dea245a191e84cb7868d5", |
|
| 428 |
+ "phone\/scripts\/jquery-1.11.3.min.js": "25e4bc43cc350f38cab68b422101b528781bcd271a299cad39aaf64aa331ed0a35b9dfed3938ddccaa08c31161ee2c472acf297aabea334315758e128487b0fb", |
|
| 429 |
+ "phone\/scripts\/moment.min.js": "8f42e847a067c9f4e803bed887cb458ca2a6973025a6bd7f4a0853eeb24b4c64f8284e9d8fd40066fc71e17a90b36d1a6477939ff7c4160dec09e11e6f90d798", |
|
| 430 |
+ "phone\/scripts\/sip.min.js": "b2e041cab891b277735031a270b29b8849fa9ce5e07da94fd9bcf9edefd3402397930b612d48603bee0480b5b739a1adf145ec57b78e3e26a259d26e198c13a3", |
|
| 431 |
+ "phone\/sounds\/dtmf.ogg": "ff7217621c355aaf8eaf290f61a9fb228be899d055fc312de7ebd8a29e0688f82fbb629519db948737837df1e0aefe8b0ed0b304909f6149e97753dd6f50b791", |
|
| 432 |
+ "phone\/sounds\/incoming.ogg": "666a28d6d6dfa0afa0d1be3d838c9b207b91ac5ef46a787b05b30da622a611b4f734ef7512bff873d3e6025ed1bd1699ccc2970292b3ca21d29a58990ec96a73", |
|
| 433 |
+ "phone\/sounds\/outgoing.ogg": "b5d17d7a53e42215365176c8ce515bcc71fe682b92d6ee12a484d0b12d7f2a28b81db18b2d6e9073bd774728fe68becfa6c34b8648bca4a20a52622d7eef2fd5", |
|
| 434 |
+ "phone\/sounds\/warnrec.ogg": "6a8b029e01c021c2a9255ecdc179ba2e27b29d53516a331cdf9c2365809df083774e605c78dcf8318243856d7e0ae6f4894e49789ab9ece1f3a69dc0390bd309", |
|
| 435 |
+ "templates\/content\/index.php": "44ea4db27e9af9e1c61a2d6c8431b22d17dbec2e9c732201ac8b81d56ae9d85e37f68cd11f9de2f5936e8de3d240ac5ebd28296f5994411ffd35f01d9a4dcfc1", |
|
| 436 |
+ "templates\/index.php": "5db81d53604174b8e8907f693ae37eaed4eff3427ff8a02b50631b952ae468750cca8f010d64183fc6ef7869ea7447112d2678effb6571fae622e1fa0141c940", |
|
| 437 |
+ "templates\/settings.php": "58e6e4e638414842bfee0f087f5df2b6f3290e9eda3c0bb13ad8797c508d572291b434d1e1f171beb26a74233809bcd4cd9e483a77092498467149a2dff0a17c" |
|
| 438 |
+ }, |
|
| 439 |
+ "signature": "jIIXqRakbrRuh0ctm0EQIT8Cl3TDFZGQCVhyma1LM0kNEm0JrYEjJ3xjXl0Kp6rbdA02RIh\/6G5HAYpOpu0bKx696plB6uEFbMbaotPxYlv4qJxj2LfSaf6S2rLR2x59Wzu6qgBHtaQD9LkOZgAgYzwHDqELRF+XVFvelx7UTuLkV13K0nDTlMBUHYFnpRnV61quBgIPSTxbs1cbNT3JDu+Bap4cudECoYNiBSxRdsLrw\/XOJc4e\/Qq1aysZnM7EONV\/\/53cm2urDgizGUKZ7WoHK7ZerjP9e8KctruZmainSjJ7rRECIck6zrsTHZ9TZqU6pHstnS3BDWeHgYZ\/mOhq7evVPz72xYs5GSaHQNbsfQD8jKzAJ83S3rVJUTfzaTkoe1JiOUngP2gqTnMmj56JKAcOMTDLIyyx0dhwt++mEqKfswJSW46TRi+GqUYwR8l+lvNz6R4KkToserfwfnsl1mWwQOYixTuGV2ukpNRYiq\/ERuKsdH8IvDohGQAcdhlkpbc+7bnKADnHImm7Nzf9izR+H7vrZsgjafhop2xSllILpsCtACQ0BTIlWCvWavVKFdDjnYrtM2tb\/eXY\/X+Sb3v+Jm3zlsBhYBtysVohALUf75RjCqN4qVz2mkIooieFHz7QVrDeO7+224\/dAq8LsaFi1NEW5sGROiMfeQc=", |
|
| 440 |
+ "certificate": "-----BEGIN CERTIFICATE-----\r\nMIIECTCCAvECAhG7MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD\r\nVQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI\r\nMTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB\r\ndXRob3JpdHkwHhcNMjIwMjI1MTU1NzUxWhcNMzIwNjAyMTU1NzUxWjAZMRcwFQYD\r\nVQQDDA5zaXBfdHJpcF9waG9uZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\r\nggIBALGXGrkLJY9XsqMXKDMLD4+Ub5HVr9HebfC2593+Ed41HVqIca9z3CdeXg87\r\npTjyZQhqsCzVArIJsmnH5pT02NYZDsZeARWpRLYWOIQeOJwS0EdOtWP6\/VXjxfw+\r\nUaDthCcfcj8TC7y+15zqwx9ERSc8ujXadGPqZEZAfGuZSy6b9+oXo17tT9fCbVeJ\r\nYyXibMWutUhIt8FvUQ2PCUYUity1kvn9+G3sOlPYMWDqPG3tt70EJ2m1J9ZX6Pa8\r\npmI8LG8IvFWImbX1\/+8YrtQZ0RQcoP7yX\/H6S8NvsAux\/sgMYNSEVbXzapE2TeMD\r\n1w0aEH3101twV+2cuKf8U+bt0Vha9HFNC06Nmu2lQkXPV\/Cdvx+DIKXhb3AaApgB\r\nT4uzRE4Zfg\/BZkspJ7IFObi2NpTv2T4frH3tZudOR\/OWtsGTpZbH8p12RK7yE19d\r\nMCR3DdVMe\/OXh1GaIc30s4jd6apskC33xZJ3IamyzY6EYLL41E2vmd9Eg6VMTGXJ\r\nHuOdAtJYy4R6040aDXfeNAnTcCVZQYmPvfnalQfcfiQePaWMyMVsBFy\/utq\/R\/qU\r\nTgtp68+jhvRH2YOxUVvuyrWhxY8PqhNHWlp5OYGllBdes5GrKvGIqnO\/q1nC6V5A\r\nHd+1SZSQJE1kQxpXxiDJeYBUQZUyBOiqM+GNfnZi+kVJ75YtAgMBAAEwDQYJKoZI\r\nhvcNAQELBQADggEBAIOJ8yPdp3vsRaOzsQCg8NdQgIDn9PZRtF0GjOPqVCOo\/ytx\r\nwIgdAiTAl1qvQaUjRSZf+qpYFPs\/Ojqd3DHi+ySPcq6PkkTWxkEpRmoaoFNAt0XA\r\nyOjSQhsBxuqFDmK+U6YvB\/QupGOSZipaBjQnaP5xufoiitIdRqd1XFHyBiNEfRt1\r\nQhLzrz\/u4PLaC6653qrl\/Jpd\/tp7LUtglihr4ODkALNQFWgY0n58tawkvTBaOpf2\r\nE3BfgleQKRa73g\/H3pGtUWtdXeTSkNHlxqef7l\/icwEDWqZfV8MIPRgEymG1naYL\r\nFIBUptO7eT+NDScFHKe4rtPK7FHhUjS7x4OcIao=\r\n-----END CERTIFICATE-----" |
|
| 441 |
+} |
|
| 0 | 442 |
\ No newline at end of file |
| 1 | 443 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,119 @@ |
| 1 |
+/** |
|
| 2 |
+ * @copyright 2021, 2024 Double Bastion LLC <www.doublebastion.com> |
|
| 3 |
+ * |
|
| 4 |
+ * @author Double Bastion LLC |
|
| 5 |
+ * |
|
| 6 |
+ * @license GNU AGPL version 3 or any later version |
|
| 7 |
+ * |
|
| 8 |
+ * This program is free software; you can redistribute it and/or |
|
| 9 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
| 10 |
+ * License as published by the Free Software Foundation; either |
|
| 11 |
+ * version 3 of the License, or any later version. |
|
| 12 |
+ * |
|
| 13 |
+ * This program is distributed in the hope that it will be useful, |
|
| 14 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 15 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 16 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
| 17 |
+ * |
|
| 18 |
+ * You should have received a copy of the GNU Affero General Public |
|
| 19 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
| 20 |
+ * |
|
| 21 |
+ */ |
|
| 22 |
+ |
|
| 23 |
+$(document).ready(function() {
|
|
| 24 |
+ |
|
| 25 |
+ var stpappdir = 'apps'; |
|
| 26 |
+ |
|
| 27 |
+ // Get app directory |
|
| 28 |
+ var getstpurl = OC.generateUrl('/apps/sip_trip_phone/user/getappdirectory');
|
|
| 29 |
+ |
|
| 30 |
+ $.ajax({
|
|
| 31 |
+ method: 'GET', |
|
| 32 |
+ url: getstpurl, |
|
| 33 |
+ contentType: 'application/json', |
|
| 34 |
+ success: function(stpappdirfdb) {
|
|
| 35 |
+ stpappdir = stpappdirfdb; |
|
| 36 |
+ |
|
| 37 |
+ // Get the app's settings |
|
| 38 |
+ var getsetUrl = OC.generateUrl('/apps/sip_trip_phone/user/getsettings');
|
|
| 39 |
+ |
|
| 40 |
+ $.ajax({
|
|
| 41 |
+ method: 'GET', |
|
| 42 |
+ url: getsetUrl, |
|
| 43 |
+ contentType: 'application/json', |
|
| 44 |
+ success: function(settingsdb) {
|
|
| 45 |
+ |
|
| 46 |
+ var connectData = {
|
|
| 47 |
+ "User" : settingsdb.sipusername, |
|
| 48 |
+ "Realm" : settingsdb.siprealm, |
|
| 49 |
+ "Display" : settingsdb.pdisplayname, |
|
| 50 |
+ "WSServer" : settingsdb.stphwssurl, |
|
| 51 |
+ "Stun" : settingsdb.stunserver, |
|
| 52 |
+ "Tracesipmsg" : settingsdb.tracesipmsg, |
|
| 53 |
+ "Voicenumbers" : settingsdb.voicenumbers, |
|
| 54 |
+ "Defaultvoicenumber" : settingsdb.defaultvoicenumber |
|
| 55 |
+ }; |
|
| 56 |
+ |
|
| 57 |
+ localStorage.setItem('SIPCreds', JSON.stringify(connectData));
|
|
| 58 |
+ |
|
| 59 |
+ // Get the (voice call capable) phone numbers of the current user's contacts and of all the Nextcloud users who didn't hide their phone numbers |
|
| 60 |
+ var getctpnUrl = OC.generateUrl('/apps/sip_trip_phone/user/getcontactsnmbrs');
|
|
| 61 |
+ |
|
| 62 |
+ $.ajax({
|
|
| 63 |
+ method: 'GET', |
|
| 64 |
+ url: getctpnUrl, |
|
| 65 |
+ contentType: 'application/json', |
|
| 66 |
+ success: function(contactspndb) {
|
|
| 67 |
+ |
|
| 68 |
+ localStorage.setItem('NCContacts', JSON.stringify(contactspndb));
|
|
| 69 |
+ |
|
| 70 |
+ |
|
| 71 |
+ var getspswdUrl = OC.generateUrl('/apps/sip_trip_phone/user/getsippass');
|
|
| 72 |
+ |
|
| 73 |
+ $.ajax({
|
|
| 74 |
+ method: 'GET', |
|
| 75 |
+ url: getspswdUrl, |
|
| 76 |
+ contentType: 'text', |
|
| 77 |
+ success: function(sippassword) {
|
|
| 78 |
+ |
|
| 79 |
+ if (!localStorage.getItem('SipTripPhone')) {
|
|
| 80 |
+ |
|
| 81 |
+ function generateAESKey(passphrase) {
|
|
| 82 |
+ const salt = CryptoJS.lib.WordArray.random(128 / 8); |
|
| 83 |
+ const key256Bits = CryptoJS.PBKDF2(passphrase, salt, { keySize: 256 / 32, iterations: 100, });
|
|
| 84 |
+ return key256Bits; |
|
| 85 |
+ } |
|
| 86 |
+ function encryptAES(token, key) {
|
|
| 87 |
+ var token = CryptoJS.AES.encrypt(token, key); |
|
| 88 |
+ return token.toString(); |
|
| 89 |
+ } |
|
| 90 |
+ var genPassphr = Date.now() + Math.floor(Math.random()*10000).toString(6).toUpperCase(); |
|
| 91 |
+ var aesKey = String(generateAESKey(genPassphr)); |
|
| 92 |
+ var encryptedTkn = encryptAES(sippassword, aesKey); |
|
| 93 |
+ document.cookie = 'crsptknks='+ aesKey +'; max-age=30; path=/; samesite=strict; secure'; |
|
| 94 |
+ localStorage.setItem('sipUserToken', encryptedTkn);
|
|
| 95 |
+ |
|
| 96 |
+ // Open the phone window |
|
| 97 |
+ var url = OC.generateUrl('/'+ stpappdir +'/sip_trip_phone/phone/index.php');
|
|
| 98 |
+ window.open(url, "SipTripPhone", "width=354,height=572,menubar=no,scrollbars=no,status=no,addressbar=no,resizable=no"); |
|
| 99 |
+ |
|
| 100 |
+ } else {
|
|
| 101 |
+ window.alert('The phone is already open!');
|
|
| 102 |
+ } |
|
| 103 |
+ }, |
|
| 104 |
+ error: function() {}
|
|
| 105 |
+ }); |
|
| 106 |
+ |
|
| 107 |
+ }, |
|
| 108 |
+ error: function() { alert("An error occurred while getting the contacts. You can check the Nextcloud log to find more details about this issue."); }
|
|
| 109 |
+ }); |
|
| 110 |
+ |
|
| 111 |
+ }, |
|
| 112 |
+ error: function() { alert("An error occurred while getting the app's settings. You can check the Nextcloud log to find more details about this issue."); }
|
|
| 113 |
+ }); |
|
| 114 |
+ |
|
| 115 |
+ }, |
|
| 116 |
+ error: function() { alert("An error occurred while getting the app's directory. You can check the Nextcloud log to find more details about this issue."); }
|
|
| 117 |
+ }); |
|
| 118 |
+ |
|
| 119 |
+}); |
| 0 | 120 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,83 @@ |
| 1 |
+/** |
|
| 2 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
| 3 |
+ * |
|
| 4 |
+ * @author Double Bastion LLC |
|
| 5 |
+ * |
|
| 6 |
+ * @license GNU AGPL version 3 or any later version |
|
| 7 |
+ * |
|
| 8 |
+ * This program is free software; you can redistribute it and/or |
|
| 9 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
| 10 |
+ * License as published by the Free Software Foundation; either |
|
| 11 |
+ * version 3 of the License, or any later version. |
|
| 12 |
+ * |
|
| 13 |
+ * This program is distributed in the hope that it will be useful, |
|
| 14 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 15 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 16 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
| 17 |
+ * |
|
| 18 |
+ * You should have received a copy of the GNU Affero General Public |
|
| 19 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
| 20 |
+ * |
|
| 21 |
+ */ |
|
| 22 |
+ |
|
| 23 |
+$(document).ready(function() {
|
|
| 24 |
+ |
|
| 25 |
+ $('#save_sipph_settings').on('click', function(event){
|
|
| 26 |
+ |
|
| 27 |
+ event.preventDefault(); |
|
| 28 |
+ OC.msg.startAction('#sip_trip_phone_save_msg', t('sip_trip_phone', 'Saved'));
|
|
| 29 |
+ |
|
| 30 |
+ var baseUrl = OC.generateUrl('/apps/sip_trip_phone/user/updatesettings');
|
|
| 31 |
+ var checkedornot = 0; |
|
| 32 |
+ if ($("#tracesipmsg").is(":checked")) { checkedornot = 1; }
|
|
| 33 |
+ |
|
| 34 |
+ var datatobesaved = {
|
|
| 35 |
+ pdisplayname: $('#pdisplayname').val(),
|
|
| 36 |
+ sipusername: $('#sipusername').val(),
|
|
| 37 |
+ sipuserpassword: $('#sipuserpassword').val(),
|
|
| 38 |
+ stphwssurl: $('#stphwssurl').val(),
|
|
| 39 |
+ siprealm: $('#siprealm').val(),
|
|
| 40 |
+ stunserver: $('#stunserver').val(),
|
|
| 41 |
+ tracesipmsg: checkedornot, |
|
| 42 |
+ voicenumbers: $('#voicenumbers').val(),
|
|
| 43 |
+ defaultvoicenumber: $('#defaultvoicenumber').val()
|
|
| 44 |
+ }; |
|
| 45 |
+ |
|
| 46 |
+ $.ajax({
|
|
| 47 |
+ method: 'PUT', |
|
| 48 |
+ url: baseUrl, |
|
| 49 |
+ contentType: 'application/json', |
|
| 50 |
+ data: JSON.stringify(datatobesaved), |
|
| 51 |
+ error: function(resp) {
|
|
| 52 |
+ alert('Error ! Please check your settings !');
|
|
| 53 |
+ } |
|
| 54 |
+ |
|
| 55 |
+ }); |
|
| 56 |
+ |
|
| 57 |
+ }); |
|
| 58 |
+ |
|
| 59 |
+ var baseUrl = OC.generateUrl('/apps/sip_trip_phone/user/getsettings');
|
|
| 60 |
+ |
|
| 61 |
+ $.ajax({
|
|
| 62 |
+ method: 'GET', |
|
| 63 |
+ url: baseUrl, |
|
| 64 |
+ contentType: 'application/json', |
|
| 65 |
+ success: function(settingsdb) {
|
|
| 66 |
+ $("#pdisplayname").val(settingsdb.pdisplayname);
|
|
| 67 |
+ $("#sipusername").val(settingsdb.sipusername);
|
|
| 68 |
+ $("#sipuserpassword").val(settingsdb.sipuserpassword);
|
|
| 69 |
+ $("#stphwssurl").val(settingsdb.stphwssurl);
|
|
| 70 |
+ $("#siprealm").val(settingsdb.siprealm);
|
|
| 71 |
+ $("#stunserver").val(settingsdb.stunserver);
|
|
| 72 |
+ $('#voicenumbers').val(settingsdb.voicenumbers);
|
|
| 73 |
+ $('#defaultvoicenumber').val(settingsdb.defaultvoicenumber);
|
|
| 74 |
+ |
|
| 75 |
+ if (settingsdb.tracesipmsg == 1) {
|
|
| 76 |
+ $('#tracesipmsg').attr('checked', true);
|
|
| 77 |
+ } else {
|
|
| 78 |
+ $('#tracesipmsg').attr('checked', false);
|
|
| 79 |
+ } |
|
| 80 |
+ } |
|
| 81 |
+ }); |
|
| 82 |
+ |
|
| 83 |
+}); |
| 0 | 84 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,61 @@ |
| 1 |
+<?php |
|
| 2 |
+/** |
|
| 3 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
| 4 |
+ * |
|
| 5 |
+ * @author Double Bastion LLC |
|
| 6 |
+ * |
|
| 7 |
+ * @license GNU AGPL version 3 or any later version |
|
| 8 |
+ * |
|
| 9 |
+ * This program is free software; you can redistribute it and/or |
|
| 10 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
| 11 |
+ * License as published by the Free Software Foundation; either |
|
| 12 |
+ * version 3 of the License, or any later version. |
|
| 13 |
+ * |
|
| 14 |
+ * This program is distributed in the hope that it will be useful, |
|
| 15 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 16 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 17 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
| 18 |
+ * |
|
| 19 |
+ * You should have received a copy of the GNU Affero General Public |
|
| 20 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
| 21 |
+ * |
|
| 22 |
+ */ |
|
| 23 |
+ |
|
| 24 |
+declare(strict_types=1); |
|
| 25 |
+ |
|
| 26 |
+namespace OCA\SIPTripPhone\AppInfo; |
|
| 27 |
+ |
|
| 28 |
+use OCP\AppFramework\App; |
|
| 29 |
+use OCP\IServerContainer; |
|
| 30 |
+use OCA\SIPTripPhone\Controller\PageController; |
|
| 31 |
+ |
|
| 32 |
+ |
|
| 33 |
+class Application extends App {
|
|
| 34 |
+ |
|
| 35 |
+ public function __construct(array $urlParams=array()) {
|
|
| 36 |
+ parent::__construct('sip_trip_phone', $urlParams);
|
|
| 37 |
+ |
|
| 38 |
+ $container = $this->getContainer(); |
|
| 39 |
+ |
|
| 40 |
+ // Controllers |
|
| 41 |
+ $container->registerService('PageController', function($c) {
|
|
| 42 |
+ return new PageController( |
|
| 43 |
+ $c->query('AppName'),
|
|
| 44 |
+ $c->query('Request')
|
|
| 45 |
+ ); |
|
| 46 |
+ }); |
|
| 47 |
+ |
|
| 48 |
+ } |
|
| 49 |
+ |
|
| 50 |
+ public function register() {
|
|
| 51 |
+ |
|
| 52 |
+ $gettimezone = \OC::$server->getConfig()->getSystemValue('logtimezone', 'UTC');
|
|
| 53 |
+ date_default_timezone_set($gettimezone); |
|
| 54 |
+ |
|
| 55 |
+ $server = $this->getContainer()->getServer(); |
|
| 56 |
+ |
|
| 57 |
+ $app = new \OCA\SIPTripPhone\AppInfo\Application(); |
|
| 58 |
+ $app->register(); |
|
| 59 |
+ |
|
| 60 |
+ } |
|
| 61 |
+} |
| 0 | 62 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,92 @@ |
| 1 |
+<?php |
|
| 2 |
+/** |
|
| 3 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
| 4 |
+ * |
|
| 5 |
+ * @author Double Bastion LLC |
|
| 6 |
+ * |
|
| 7 |
+ * @license GNU AGPL version 3 or any later version |
|
| 8 |
+ * |
|
| 9 |
+ * This program is free software; you can redistribute it and/or |
|
| 10 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
| 11 |
+ * License as published by the Free Software Foundation; either |
|
| 12 |
+ * version 3 of the License, or any later version. |
|
| 13 |
+ * |
|
| 14 |
+ * This program is distributed in the hope that it will be useful, |
|
| 15 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 16 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 17 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
| 18 |
+ * |
|
| 19 |
+ * You should have received a copy of the GNU Affero General Public |
|
| 20 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
| 21 |
+ * |
|
| 22 |
+ */ |
|
| 23 |
+ |
|
| 24 |
+declare(strict_types=1); |
|
| 25 |
+ |
|
| 26 |
+namespace OCA\SIPTripPhone\Controller; |
|
| 27 |
+ |
|
| 28 |
+use OCP\IRequest; |
|
| 29 |
+use OCP\AppFramework\Controller; |
|
| 30 |
+use OCA\SIPTripPhone\Service\SphoneService; |
|
| 31 |
+use OCP\IUserSession; |
|
| 32 |
+use OC\URLGenerator; |
|
| 33 |
+ |
|
| 34 |
+ |
|
| 35 |
+class SphoneController extends Controller {
|
|
| 36 |
+ |
|
| 37 |
+ private $service; |
|
| 38 |
+ private $userId; |
|
| 39 |
+ private $userSession; |
|
| 40 |
+ private $urlGenerator; |
|
| 41 |
+ |
|
| 42 |
+ public function __construct($appName, IRequest $request, SphoneService $service, $userId, IUserSession $userSession, URLGenerator $urlGenerator) {
|
|
| 43 |
+ parent::__construct($appName, $request); |
|
| 44 |
+ $this->service = $service; |
|
| 45 |
+ $this->userId = $userId; |
|
| 46 |
+ $this->userSession = $userSession; |
|
| 47 |
+ $this->urlGenerator = $urlGenerator; |
|
| 48 |
+ } |
|
| 49 |
+ |
|
| 50 |
+ /** |
|
| 51 |
+ * @NoAdminRequired |
|
| 52 |
+ */ |
|
| 53 |
+ public function getappdirectory() {
|
|
| 54 |
+ $apprelpath = $this->urlGenerator->linkTo('sip_trip_phone', 'COPYING.txt');
|
|
| 55 |
+ $apprelpatharr = explode("/", $apprelpath);
|
|
| 56 |
+ $stpappdir = $apprelpatharr[1]; |
|
| 57 |
+ return $stpappdir; |
|
| 58 |
+ } |
|
| 59 |
+ |
|
| 60 |
+ /** |
|
| 61 |
+ * @NoAdminRequired |
|
| 62 |
+ */ |
|
| 63 |
+ public function getsettings() {
|
|
| 64 |
+ |
|
| 65 |
+ return $this->service->getsettings($this->userSession->getUser()->getUID()); |
|
| 66 |
+ } |
|
| 67 |
+ |
|
| 68 |
+ /** |
|
| 69 |
+ * @NoAdminRequired |
|
| 70 |
+ */ |
|
| 71 |
+ public function getsippass() {
|
|
| 72 |
+ |
|
| 73 |
+ return $this->service->getsippass($this->userSession->getUser()->getUID()); |
|
| 74 |
+ } |
|
| 75 |
+ |
|
| 76 |
+ /** |
|
| 77 |
+ * @NoAdminRequired |
|
| 78 |
+ */ |
|
| 79 |
+ public function updatesettings(string $pdisplayname, string $sipusername, string $sipuserpassword, string $stphwssurl, string $siprealm, string $stunserver, int $tracesipmsg, string $voicenumbers, string $defaultvoicenumber) {
|
|
| 80 |
+ |
|
| 81 |
+ return $this->service->updatesettings($this->userSession->getUser()->getUID(), $pdisplayname, $sipusername, $sipuserpassword, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber); |
|
| 82 |
+ |
|
| 83 |
+ } |
|
| 84 |
+ |
|
| 85 |
+ /** |
|
| 86 |
+ * @NoAdminRequired |
|
| 87 |
+ */ |
|
| 88 |
+ public function getcontactsnmbrs() {
|
|
| 89 |
+ |
|
| 90 |
+ return $this->service->getcontactsnmbrs($this->userSession->getUser()->getUID()); |
|
| 91 |
+ } |
|
| 92 |
+} |
| 0 | 93 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,240 @@ |
| 1 |
+<?php |
|
| 2 |
+/** |
|
| 3 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
| 4 |
+ * |
|
| 5 |
+ * @author Double Bastion LLC |
|
| 6 |
+ * |
|
| 7 |
+ * @license GNU AGPL version 3 or any later version |
|
| 8 |
+ * |
|
| 9 |
+ * This program is free software; you can redistribute it and/or |
|
| 10 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
| 11 |
+ * License as published by the Free Software Foundation; either |
|
| 12 |
+ * version 3 of the License, or any later version. |
|
| 13 |
+ * |
|
| 14 |
+ * This program is distributed in the hope that it will be useful, |
|
| 15 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 16 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 17 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
| 18 |
+ * |
|
| 19 |
+ * You should have received a copy of the GNU Affero General Public |
|
| 20 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
| 21 |
+ * |
|
| 22 |
+ */ |
|
| 23 |
+ |
|
| 24 |
+declare(strict_types=1); |
|
| 25 |
+ |
|
| 26 |
+namespace OCA\SIPTripPhone\Service; |
|
| 27 |
+ |
|
| 28 |
+use OCP\DB\QueryBuilder\IQueryBuilder; |
|
| 29 |
+use OCP\IDBConnection; |
|
| 30 |
+use OCP\Security\ICrypto; |
|
| 31 |
+use function OCP\Log\logger; |
|
| 32 |
+ |
|
| 33 |
+class SphoneService {
|
|
| 34 |
+ |
|
| 35 |
+ private $connection; |
|
| 36 |
+ private $crypto; |
|
| 37 |
+ |
|
| 38 |
+ public function __construct(IDBConnection $connection, ICrypto $crypto) {
|
|
| 39 |
+ $this->connection = $connection; |
|
| 40 |
+ $this->crypto = $crypto; |
|
| 41 |
+ } |
|
| 42 |
+ |
|
| 43 |
+ /** |
|
| 44 |
+ * @NoAdminRequired |
|
| 45 |
+ * |
|
| 46 |
+ */ |
|
| 47 |
+ public function getsettings($userId) {
|
|
| 48 |
+ |
|
| 49 |
+ $sql = $this->connection->prepare('
|
|
| 50 |
+ SELECT `id`, `user_id`, `pdisplayname`, `sipusername`, `sipuserpassword`, `stphwssurl`, `siprealm`, `stunserver`, `tracesipmsg`, `voicenumbers`, `defaultvoicenumber` |
|
| 51 |
+ FROM `*PREFIX*sip_trip_phone` |
|
| 52 |
+ WHERE `user_id` = ?'); |
|
| 53 |
+ $result = $sql->execute([$userId]); |
|
| 54 |
+ $settingsdb = $result->fetch(); |
|
| 55 |
+ $result->closeCursor(); |
|
| 56 |
+ |
|
| 57 |
+ if ($settingsdb) {
|
|
| 58 |
+ if ($settingsdb['sipuserpassword'] != '' && $settingsdb['sipuserpassword'] != null && $settingsdb['sipuserpassword'] != 'undefined') {
|
|
| 59 |
+ $settingsdb['sipuserpassword'] = "%20%20%20%20%20%20%20"; |
|
| 60 |
+ } else { $settingsdb['sipuserpassword'] = ''; }
|
|
| 61 |
+ |
|
| 62 |
+ return $settingsdb; |
|
| 63 |
+ } |
|
| 64 |
+ } |
|
| 65 |
+ |
|
| 66 |
+ /** |
|
| 67 |
+ * @NoAdminRequired |
|
| 68 |
+ * |
|
| 69 |
+ */ |
|
| 70 |
+ public function getsippass($userId) {
|
|
| 71 |
+ |
|
| 72 |
+ $sqlps = $this->connection->prepare('
|
|
| 73 |
+ SELECT `id`, `user_id`, `sipuserpassword` |
|
| 74 |
+ FROM `*PREFIX*sip_trip_phone` |
|
| 75 |
+ WHERE `user_id` = ?'); |
|
| 76 |
+ $resultps = $sqlps->execute([$userId]); |
|
| 77 |
+ $settingsdb = $resultps->fetch(); |
|
| 78 |
+ $resultps->closeCursor(); |
|
| 79 |
+ |
|
| 80 |
+ if ($settingsdb) {
|
|
| 81 |
+ if ($settingsdb['sipuserpassword'] != '' && $settingsdb['sipuserpassword'] != null && $settingsdb['sipuserpassword'] != 'undefined') {
|
|
| 82 |
+ $sipuserpassworddecr = $this->crypto->decrypt($settingsdb['sipuserpassword']); |
|
| 83 |
+ $sippassword = $sipuserpassworddecr; |
|
| 84 |
+ } |
|
| 85 |
+ |
|
| 86 |
+ return $sippassword; |
|
| 87 |
+ } |
|
| 88 |
+ } |
|
| 89 |
+ |
|
| 90 |
+ /** |
|
| 91 |
+ * @NoAdminRequired |
|
| 92 |
+ */ |
|
| 93 |
+ public function getcontactsnmbrs($userId) {
|
|
| 94 |
+ |
|
| 95 |
+ // Get the phone numbers of regular contacts |
|
| 96 |
+ |
|
| 97 |
+ $cardadd = "card_add_self"; |
|
| 98 |
+ $cntctsusr = $this->connection->prepare('
|
|
| 99 |
+ SELECT `user`, `subject`, `subjectparams` |
|
| 100 |
+ FROM `*PREFIX*activity` |
|
| 101 |
+ WHERE `user` = ? AND `subject` = ?'); |
|
| 102 |
+ $rescntcts = $cntctsusr->execute([$userId, $cardadd]); |
|
| 103 |
+ $cnctsforuserinit = []; |
|
| 104 |
+ while ($ctrow = $rescntcts->fetch()) {
|
|
| 105 |
+ $ctsperuserarr = json_decode($ctrow['subjectparams'], true); |
|
| 106 |
+ $cnctsforuserinit[] = $ctsperuserarr['card']['id']; |
|
| 107 |
+ } |
|
| 108 |
+ $rescntcts->closeCursor(); |
|
| 109 |
+ $cnctsforuser = array_unique($cnctsforuserinit); |
|
| 110 |
+ |
|
| 111 |
+ $contactData = []; |
|
| 112 |
+ if ($cnctsforuser) {
|
|
| 113 |
+ |
|
| 114 |
+ foreach ($cnctsforuser as $ctkey => $ctid) {
|
|
| 115 |
+ $ctdata = $this->connection->prepare('
|
|
| 116 |
+ SELECT `carddata`, `uid` |
|
| 117 |
+ FROM `*PREFIX*cards` |
|
| 118 |
+ WHERE `uid` = ?'); |
|
| 119 |
+ $ctdatares = $ctdata->execute([$ctid]); |
|
| 120 |
+ $ctdatarow = $ctdatares->fetch(); |
|
| 121 |
+ $ctdatares->closeCursor(); |
|
| 122 |
+ $ctdatarr = preg_split('/\r\n|\r|\n/', $ctdatarow['carddata']);
|
|
| 123 |
+ $contactNumbers = []; |
|
| 124 |
+ $contactRole = ''; |
|
| 125 |
+ foreach ($ctdatarr as $cdkey => $cdata) {
|
|
| 126 |
+ $telcheck = false; |
|
| 127 |
+ if (str_contains($cdata, "FN:")) {
|
|
| 128 |
+ $cdnamearr = explode("FN:", $cdata);
|
|
| 129 |
+ $contactName = $cdnamearr[1]; |
|
| 130 |
+ } elseif (str_contains($cdata, "FN;")) {
|
|
| 131 |
+ $cdnamearr = explode(":", $cdata);
|
|
| 132 |
+ $contactName = $cdnamearr[1]; |
|
| 133 |
+ } elseif (str_contains($cdata, "TITLE:")) {
|
|
| 134 |
+ $cdtitlearr = explode("TITLE:", $cdata);
|
|
| 135 |
+ $contactRole = $cdtitlearr[1]; |
|
| 136 |
+ } elseif (str_contains($cdata, "TEL;")) {
|
|
| 137 |
+ $cdtelarr = explode("TYPE=", $cdata);
|
|
| 138 |
+ $cdteldatarr = explode(":", $cdtelarr[1]);
|
|
| 139 |
+ if (str_contains($cdteldatarr[0], 'CELL') || str_contains($cdteldatarr[0], 'VOICE') || str_contains($cdteldatarr[0], 'CAR')) {
|
|
| 140 |
+ $ctNumberType = $cdteldatarr[0]; |
|
| 141 |
+ $ctNumber = $cdteldatarr[1]; |
|
| 142 |
+ if ($ctNumber) { $telcheck = true; }
|
|
| 143 |
+ } |
|
| 144 |
+ } |
|
| 145 |
+ if ($telcheck) { $contactNumbers[] = [$ctNumberType, $ctNumber]; }
|
|
| 146 |
+ } |
|
| 147 |
+ if ($contactNumbers) {
|
|
| 148 |
+ $contactData[] = ['contact_name' => $contactName, 'contact_role' => $contactRole, 'contact_type' => 'regular_contact', 'contact_numbers' => $contactNumbers]; |
|
| 149 |
+ } |
|
| 150 |
+ } |
|
| 151 |
+ } |
|
| 152 |
+ |
|
| 153 |
+ // Get the (non-private) phone numbers of Nextcloud users |
|
| 154 |
+ |
|
| 155 |
+ $ncusers = $this->connection->prepare('
|
|
| 156 |
+ SELECT `uid`, `data` |
|
| 157 |
+ FROM `*PREFIX*accounts`'); |
|
| 158 |
+ $ncusersres = $ncusers->execute(); |
|
| 159 |
+ $ncUserData = []; |
|
| 160 |
+ while ($ncrow = $ncusersres->fetch()) {
|
|
| 161 |
+ $ncperuserarr = json_decode($ncrow['data'], true); |
|
| 162 |
+ if ($ncperuserarr['phone']['value'] && ($ncperuserarr['phone']['scope'] == 'v2-local' || $ncperuserarr['phone']['scope'] == 'v2-federated' || $ncperuserarr['phone']['scope'] == 'v2-published')) {
|
|
| 163 |
+ |
|
| 164 |
+ $ncdisplayname = $ncperuserarr['displayname']['value']; |
|
| 165 |
+ |
|
| 166 |
+ $nctelnumber = [['VOICE/CELL', $ncperuserarr['phone']['value']]]; |
|
| 167 |
+ |
|
| 168 |
+ if ($ncperuserarr['role']['scope'] == 'v2-local' || $ncperuserarr['role']['scope'] == 'v2-federated' || $ncperuserarr['role']['scope'] == 'v2-published') {
|
|
| 169 |
+ $ncuserrole = $ncperuserarr['role']['value']; |
|
| 170 |
+ } else { $ncuserrole = ''; }
|
|
| 171 |
+ |
|
| 172 |
+ $ncUserData[] = ['contact_name' => $ncdisplayname, 'contact_role' => $ncuserrole, 'contact_type' => 'ncuser_contact', 'contact_numbers' => $nctelnumber]; |
|
| 173 |
+ } |
|
| 174 |
+ } |
|
| 175 |
+ $ncusersres->closeCursor(); |
|
| 176 |
+ |
|
| 177 |
+ $usersAndContacts = array_merge($contactData, $ncUserData); |
|
| 178 |
+ |
|
| 179 |
+ return $usersAndContacts; |
|
| 180 |
+ } |
|
| 181 |
+ |
|
| 182 |
+ /** |
|
| 183 |
+ * @NoAdminRequired |
|
| 184 |
+ * |
|
| 185 |
+ */ |
|
| 186 |
+ public function updatesettings($userId, $pdisplayname, $sipusername, $sipuserpassword, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber) {
|
|
| 187 |
+ |
|
| 188 |
+ // Validate the data entered in the fields on the settings page |
|
| 189 |
+ if (mb_strlen($pdisplayname) > 128) { logger('sip_trip_phone')->error("The 'Display Name' cannot exceed 128 characters!"); exit(); }
|
|
| 190 |
+ if (!preg_match('/^[a-zA-Z0-9\*\#]+$/', $sipusername)) { logger('sip_trip_phone')->error("The 'SIP User' that you entered is not valid. The 'SIP User' must contain only alphanumeric characters, asterisks (*) and number signs (#).)"); exit(); }
|
|
| 191 |
+ if (mb_strlen($sipuserpassword) > 300) { logger('sip_trip_phone')->error("The 'SIP User Password' cannot exceed 300 characters!"); exit(); }
|
|
| 192 |
+ if (filter_var($stphwssurl, FILTER_VALIDATE_URL) == false) { logger('sip_trip_phone')->error("The 'WSS URL' that you entered is not valid."); exit(); }
|
|
| 193 |
+ if (filter_var($siprealm, FILTER_VALIDATE_IP) == false && filter_var($siprealm, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME) == false) { logger('sip_trip_phone')->error("The 'SIP Realm' that you entered is not valid."); exit(); }
|
|
| 194 |
+ if ($stunserver != '') {
|
|
| 195 |
+ $stunIpDom = explode(":", $stunserver);
|
|
| 196 |
+ if ((filter_var($stunIpDom[0], FILTER_VALIDATE_IP) == false && filter_var($stunIpDom[0], FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME) == false) || !preg_match('/^[0-9]+$/', $stunIpDom[1])) { logger('sip_trip_phone')->error("The 'STUN Server' that you entered is not valid."); exit(); }
|
|
| 197 |
+ } |
|
| 198 |
+ if (!preg_match('/^[a-zA-Z0-9\040\+\,\:]*$/', $voicenumbers)) { logger('sip_trip_phone')->error("The 'Available phone numbers' that you entered are not valid. The 'Available phone numbers' must contain only alphanumeric characters, colons (:), spaces, plus signs (+), digits (0-9) and commas (,)."); exit(); }
|
|
| 199 |
+ if (!preg_match('/^[a-zA-Z0-9\040\+\:]*$/', $defaultvoicenumber)) { logger('sip_trip_phone')->error("The 'Default phone number for outgoing calls' that you entered is not valid. The 'Default phone number for outgoing calls' must contain only alphanumeric characters, a colon (:), a space, a plus sign (+) and digits (0-9)."); exit(); }
|
|
| 200 |
+ |
|
| 201 |
+ $sqlup = $this->connection->prepare('
|
|
| 202 |
+ SELECT `id`, `user_id`, `pdisplayname`, `sipusername`, `sipuserpassword`, `stphwssurl`, `siprealm`, `stunserver`, `tracesipmsg`, `voicenumbers`, `defaultvoicenumber` |
|
| 203 |
+ FROM `*PREFIX*sip_trip_phone` |
|
| 204 |
+ WHERE `user_id` = ?'); |
|
| 205 |
+ $resultup = $sqlup->execute([$userId]); |
|
| 206 |
+ $row = $resultup->fetch(); |
|
| 207 |
+ $resultup->closeCursor(); |
|
| 208 |
+ |
|
| 209 |
+ if ($resultup && !$row) {
|
|
| 210 |
+ |
|
| 211 |
+ if ($sipuserpassword != '') {
|
|
| 212 |
+ $sipuserpasswordenc = $this->crypto->encrypt($sipuserpassword); |
|
| 213 |
+ } else { $sipuserpasswordenc = ''; }
|
|
| 214 |
+ |
|
| 215 |
+ $sqlins = $this->connection->prepare('
|
|
| 216 |
+ INSERT INTO `*PREFIX*sip_trip_phone` |
|
| 217 |
+ (`user_id`, `pdisplayname`, `sipusername`, `sipuserpassword`, `stphwssurl`, `siprealm`, `stunserver`, `tracesipmsg`, `voicenumbers`, `defaultvoicenumber`) |
|
| 218 |
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'); |
|
| 219 |
+ $sqlins->execute([$userId, $pdisplayname, $sipusername, $sipuserpasswordenc, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber]); |
|
| 220 |
+ |
|
| 221 |
+ } elseif ($resultup && $row) {
|
|
| 222 |
+ |
|
| 223 |
+ if ($sipuserpassword != '' && $sipuserpassword != "%20%20%20%20%20%20%20") {
|
|
| 224 |
+ $sipuserpasswordenc = $this->crypto->encrypt($sipuserpassword); |
|
| 225 |
+ } elseif ($sipuserpassword == "%20%20%20%20%20%20%20") {
|
|
| 226 |
+ $sipuserpasswordenc = $row['sipuserpassword']; |
|
| 227 |
+ } elseif ($sipuserpassword == '') {
|
|
| 228 |
+ $sipuserpasswordenc = ''; |
|
| 229 |
+ } |
|
| 230 |
+ |
|
| 231 |
+ $sqlup = $this->connection->prepare('
|
|
| 232 |
+ UPDATE `*PREFIX*sip_trip_phone` |
|
| 233 |
+ SET `pdisplayname` = ?, `sipusername` = ?, `sipuserpassword` = ?, `stphwssurl` = ?, `siprealm` = ?, `stunserver` = ?, `tracesipmsg` = ?, `voicenumbers` = ?, `defaultvoicenumber` = ? |
|
| 234 |
+ WHERE `user_id` = ?'); |
|
| 235 |
+ $updateRes = $sqlup->execute([$pdisplayname, $sipusername, $sipuserpasswordenc, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber, $userId]); |
|
| 236 |
+ $updateRes->closeCursor(); |
|
| 237 |
+ |
|
| 238 |
+ } |
|
| 239 |
+ } |
|
| 240 |
+} |
| 0 | 241 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,1374 @@ |
| 1 |
+/** |
|
| 2 |
+ * @copyright 2021, 2024 Double Bastion LLC <www.doublebastion.com> |
|
| 3 |
+ * |
|
| 4 |
+ * @author Double Bastion LLC |
|
| 5 |
+ * |
|
| 6 |
+ * @license GNU AGPL version 3 or any later version |
|
| 7 |
+ * |
|
| 8 |
+ * This program is free software; you can redistribute it and/or |
|
| 9 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
| 10 |
+ * License as published by the Free Software Foundation; either |
|
| 11 |
+ * version 3 of the License, or any later version. |
|
| 12 |
+ * |
|
| 13 |
+ * This program is distributed in the hope that it will be useful, |
|
| 14 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 15 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 16 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
| 17 |
+ * |
|
| 18 |
+ * You should have received a copy of the GNU Affero General Public |
|
| 19 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
| 20 |
+ * |
|
| 21 |
+ * |
|
| 22 |
+ * |
|
| 23 |
+ * This is a modified version of the original file "app.js". |
|
| 24 |
+ * |
|
| 25 |
+ * Below is the copyright notice of ctxSip phone (https://github.com/collecttix/ctxSip) |
|
| 26 |
+ * which also applies to the original "app.js" file, as part of ctxSip phone: |
|
| 27 |
+ * |
|
| 28 |
+ * |
|
| 29 |
+ * The MIT License (MIT) |
|
| 30 |
+ * |
|
| 31 |
+ * Copyright (c) 2014 Collecttix |
|
| 32 |
+ * |
|
| 33 |
+ * Permission is hereby granted, free of charge, to any person obtaining a copy |
|
| 34 |
+ * of this software and associated documentation files (the "Software"), to deal |
|
| 35 |
+ * in the Software without restriction, including without limitation the rights |
|
| 36 |
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
| 37 |
+ * copies of the Software, and to permit persons to whom the Software is |
|
| 38 |
+ * furnished to do so, subject to the following conditions: |
|
| 39 |
+ * |
|
| 40 |
+ * The above copyright notice and this permission notice shall be included in |
|
| 41 |
+ * all copies or substantial portions of the Software. |
|
| 42 |
+ * |
|
| 43 |
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
| 44 |
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
| 45 |
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
| 46 |
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
| 47 |
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
| 48 |
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|
| 49 |
+ * THE SOFTWARE. |
|
| 50 |
+ * |
|
| 51 |
+ */ |
|
| 52 |
+ |
|
| 53 |
+ |
|
| 54 |
+/* globals SIP, user, moment, Stopwatch */ |
|
| 55 |
+ |
|
| 56 |
+$(document).ready(function() {
|
|
| 57 |
+ |
|
| 58 |
+ // Show system notifications on incoming calls |
|
| 59 |
+ function incomingCallNote() {
|
|
| 60 |
+ var noticeOptions = { body : "New incoming call !!!", icon : "images/sip_trip_phone_logo.svg" }
|
|
| 61 |
+ var callNotification = new Notification("SIP Trip Phone incoming call", noticeOptions);
|
|
| 62 |
+ callNotification.onclick = function (event) { callNotification.close(); return; }
|
|
| 63 |
+ |
|
| 64 |
+ if (document.visibilityState == "visible") {
|
|
| 65 |
+ return; |
|
| 66 |
+ } else { setTimeout(incomingCallNote, 8000); }
|
|
| 67 |
+ } |
|
| 68 |
+ |
|
| 69 |
+ // Change page title on incoming calls |
|
| 70 |
+ function changePageTitle() {
|
|
| 71 |
+ if ($(document).attr("title") == "SIP Trip Phone") { $(document).prop("title", "New call !!!"); } else { $(document).prop("title", "SIP Trip Phone"); }
|
|
| 72 |
+ if (document.hasFocus()) {
|
|
| 73 |
+ $(document).prop("title", "SIP Trip Phone");
|
|
| 74 |
+ return; |
|
| 75 |
+ } else { setTimeout(changePageTitle, 460); }
|
|
| 76 |
+ } |
|
| 77 |
+ |
|
| 78 |
+ |
|
| 79 |
+ function decryptAES(token, key) {
|
|
| 80 |
+ var code = CryptoJS.AES.decrypt(token, key); |
|
| 81 |
+ var dectoken = code.toString(CryptoJS.enc.Utf8); |
|
| 82 |
+ return dectoken; |
|
| 83 |
+ } |
|
| 84 |
+ |
|
| 85 |
+ var mediaRecorder = null; |
|
| 86 |
+ var fetchedTkn = localStorage.getItem('sipUserToken') || null;
|
|
| 87 |
+ var kfcook = document.cookie.match('(^|;)\\s*crsptknks\\s*=\\s*([^;]+)')?.pop() || '';
|
|
| 88 |
+ var userSIPToken = decryptAES(fetchedTkn, kfcook); |
|
| 89 |
+ |
|
| 90 |
+ localStorage.removeItem('sipUserToken');
|
|
| 91 |
+ document.cookie = 'crsptknks=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; samesite=strict; secure'; |
|
| 92 |
+ |
|
| 93 |
+ var user = JSON.parse(localStorage.getItem('SIPCreds'));
|
|
| 94 |
+ var traceornot = (user.Tracesipmsg == 1)? true : false; |
|
| 95 |
+ |
|
| 96 |
+ // Add the 'available phone numbers' drop-down list |
|
| 97 |
+ var stpVoiceNmbrs = user.Voicenumbers; |
|
| 98 |
+ var stpVoiceNbOpt = ''; |
|
| 99 |
+ var stpVoiceNmbrsArr = []; |
|
| 100 |
+ |
|
| 101 |
+ if (stpVoiceNmbrs != '') {
|
|
| 102 |
+ |
|
| 103 |
+ stpVoiceNmbrsArr = stpVoiceNmbrs.split(",");
|
|
| 104 |
+ var stpDefNmbrFdb = user.Defaultvoicenumber; |
|
| 105 |
+ |
|
| 106 |
+ for (var v = 0; v < stpVoiceNmbrsArr.length; v++) {
|
|
| 107 |
+ stpVoiceNbOpt += '<option value="'+ stpVoiceNmbrsArr[v] +'" class="stpSlctFrmNmbrs">'+ stpVoiceNmbrsArr[v] +'</option>'; |
|
| 108 |
+ } |
|
| 109 |
+ } |
|
| 110 |
+ stpVoiceNbOpt += '<option value="'+ user.User +'" class="stpSlctFrmNmbrs">'+ user.User +'</option>'; |
|
| 111 |
+ |
|
| 112 |
+ $("#fromNumber").append(stpVoiceNbOpt);
|
|
| 113 |
+ |
|
| 114 |
+ if (stpDefNmbrFdb != '' && stpDefNmbrFdb != null) {
|
|
| 115 |
+ $("#fromNumber").val(stpDefNmbrFdb);
|
|
| 116 |
+ } else {
|
|
| 117 |
+ if (stpVoiceNmbrsArr.length > 0) {
|
|
| 118 |
+ $("#fromNumber").val(stpVoiceNmbrsArr[0]);
|
|
| 119 |
+ } else { $("#fromNumber").val(user.User); }
|
|
| 120 |
+ } |
|
| 121 |
+ |
|
| 122 |
+ // Adjust height of initial screen, call history list and width of dial pad |
|
| 123 |
+ $("#sip-splash").css({ "height" : window.innerHeight - 111 });
|
|
| 124 |
+ $("#sip-logitems").css({ "height" : window.innerHeight - 141 });
|
|
| 125 |
+ |
|
| 126 |
+ $(window).resize(function() {
|
|
| 127 |
+ $("#sip-splash").css({ "height" : window.innerHeight - 111 });
|
|
| 128 |
+ $("#sip-logitems").css({ "height" : window.innerHeight - 141 });
|
|
| 129 |
+ }); |
|
| 130 |
+ |
|
| 131 |
+ var calcWidth = parseInt(window.innerWidth - 30) + "px"; |
|
| 132 |
+ var calcHeight = parseInt(window.innerHeight - 111) + "px"; |
|
| 133 |
+ $("#sip-dialpad").css({ "width" : calcWidth, "height" : calcHeight });
|
|
| 134 |
+ |
|
| 135 |
+ var calcMargin = parseInt(($("#sip-dialpad").height() - $("#dialpadWrap").height()) / 2) + "px auto";
|
|
| 136 |
+ $("#dialpadWrap").css("margin", calcMargin);
|
|
| 137 |
+ |
|
| 138 |
+ // Get the contacts with phone numbers and the Nextcloud users with phone numbers (that were not set up as private) |
|
| 139 |
+ var contactsData = JSON.parse(localStorage.getItem('NCContacts'));
|
|
| 140 |
+ |
|
| 141 |
+ // Sort contacts alphabetically by first name |
|
| 142 |
+ contactsData.sort(function(a, b) {
|
|
| 143 |
+ if (a.contact_name < b.contact_name) return -1; |
|
| 144 |
+ if (a.contact_name > b.contact_name) return 1; |
|
| 145 |
+ return 0; |
|
| 146 |
+ }); |
|
| 147 |
+ |
|
| 148 |
+ // First list regular contacts, then Nextcloud users |
|
| 149 |
+ contactsData.sort(function(c, d) {
|
|
| 150 |
+ if (c.contact_type == "regular_contact" && d.contact_type == "ncuser_contact") return -1; |
|
| 151 |
+ if (c.contact_type == "ncuser_contact" && d.contact_type == "regular_contact") return 1; |
|
| 152 |
+ return 0; |
|
| 153 |
+ }); |
|
| 154 |
+ |
|
| 155 |
+ // Create the drop-down list containing the contacts with phone numbers and the Nextcloud users with phone numbers (that were not set up as private) |
|
| 156 |
+ var contactsTbl = "<div id='contactsTable'><table id='cntctsTbl'>"; |
|
| 157 |
+ contactsTbl += "<tr id='searchCntct'><td colspan='3'><div id='searchSpace'><i class='fa fa-search'></i><input type='text' id='txtFindContact' autocomplete='none' placeholder='Search contact by name or role' title='Search contact by name or by role within the organization'></div></td></tr>"; |
|
| 158 |
+ |
|
| 159 |
+ if (contactsData.length > 0) {
|
|
| 160 |
+ |
|
| 161 |
+ var regContactNb = 0; |
|
| 162 |
+ var ncUserNb = 0; |
|
| 163 |
+ |
|
| 164 |
+ for (var c = 0; c < contactsData.length; c++) {
|
|
| 165 |
+ |
|
| 166 |
+ var ctctsNmbr = ''; |
|
| 167 |
+ for (var p = 0; p < contactsData[c]['contact_numbers'].length; p++) {
|
|
| 168 |
+ if (contactsData[c]['contact_numbers'][p][0].indexOf("VOICE/CELL") > -1) {
|
|
| 169 |
+ var ctPhType = "<i class='fa fa-phone phnmbrtype' title='"+ contactsData[c]['contact_numbers'][p][0] +"' style='font-size:16px'></i>"; |
|
| 170 |
+ } else if (contactsData[c]['contact_numbers'][p][0].indexOf("VOICE") > -1) {
|
|
| 171 |
+ var ctPhType = "<i class='fa fa-volume-control-phone phnmbrtype' title='"+ contactsData[c]['contact_numbers'][p][0] +"' style='font-size:17px'></i>"; |
|
| 172 |
+ } else if (contactsData[c]['contact_numbers'][p][0].indexOf("CELL") > -1) {
|
|
| 173 |
+ var ctPhType = "<i class='fa fa-mobile phnmbrtype' title='"+ contactsData[c]['contact_numbers'][p][0] +"' style='font-size:18px'></i>"; |
|
| 174 |
+ } else if (contactsData[c]['contact_numbers'][p][0].indexOf("CAR") > -1) {
|
|
| 175 |
+ var ctPhType = "<i class='fa fa-car phnmbrtype' title='"+ contactsData[c]['contact_numbers'][p][0] +"' style='font-size:15px'></i>"; |
|
| 176 |
+ } |
|
| 177 |
+ ctctsNmbr += "<div class='phnmbrRow'><div class='phnbType'>"+ ctPhType +"</div><div id='indPhnmbr-"+ c +"-"+ p +"' class='phnbNumber' title='Click to call'>"+ contactsData[c]['contact_numbers'][p][1] +"</div></div>"; |
|
| 178 |
+ } |
|
| 179 |
+ if (contactsData[c].contact_type == "regular_contact") {
|
|
| 180 |
+ var cntctTypeInd = "<div class='typeContact' data-tpcontact='regular_contact'><img src='images/contacts_green.svg' class='regularContact' title='Regular contact'></div>"; |
|
| 181 |
+ regContactNb++; |
|
| 182 |
+ } else if (contactsData[c].contact_type == "ncuser_contact") {
|
|
| 183 |
+ var cntctTypeInd = "<div class='typeContact' data-tpcontact='ncuser_contact'><img src='images/nextcloud_logo_small.svg' class='ncuserContact' title='Nextcloud user'></div>"; |
|
| 184 |
+ ncUserNb++; |
|
| 185 |
+ } |
|
| 186 |
+ if (c % 2 == 1) { var backgroundClr = "darkBackground" } else { var backgroundClr = ""; }
|
|
| 187 |
+ |
|
| 188 |
+ contactsTbl += "<tr id='ctRowNb-"+ c +"' class='contactRow "+ backgroundClr +"'><td id='contactName'><div class='cntctName'>"+ contactsData[c].contact_name +"</div><div class='cntctRole'>"+ contactsData[c].contact_role +"</div></td><td class='contactType'>"+ cntctTypeInd +"</td><td class='contactNumber'>"+ ctctsNmbr +"</td></tr>"; |
|
| 189 |
+ } |
|
| 190 |
+ |
|
| 191 |
+ var totalCntctNb = regContactNb + ncUserNb; |
|
| 192 |
+ contactsTbl += "<tr id='totCtDisp'><td colspan='3'><div id='totalDisplayed'><img src='images/contacts_green.svg' id='regCntctsTot' title='Regular contacts'><span id='totDspRegCts'>"+ regContactNb +"</span><img src='images/nextcloud_logo_small.svg' id='ncUsersTot' title='Nextcloud users'><span id='totDspNcUsr'>"+ ncUserNb +"</span><span style='display:inline-block;margin-left:12px;'>Total:<span id='totDspCntcts'>"+ totalCntctNb +"</span></span></div></td></tr>"; |
|
| 193 |
+ } else {
|
|
| 194 |
+ contactsTbl += "<tr><td colspan='3' class='noPhoneNmbrs'>Here you will see all the contacts with phone numbers from your Contacts app and all the Nextcloud users with phone numbers that were not set up as 'Private'.<br><br>For the moment there are no Nextcloud contacts and Nextcloud users with available phone numbers to display.</td></tr>"; |
|
| 195 |
+ } |
|
| 196 |
+ |
|
| 197 |
+ contactsTbl += "</table></div>"; |
|
| 198 |
+ |
|
| 199 |
+ $("#wndSpace").append(contactsTbl);
|
|
| 200 |
+ |
|
| 201 |
+ var nameWidth = parseInt(window.innerWidth * 0.40) + "px"; |
|
| 202 |
+ $("#contactName").width(nameWidth);
|
|
| 203 |
+ |
|
| 204 |
+ // Show/hide the contacts' phone numbers |
|
| 205 |
+ function showContactsNmbrs() {
|
|
| 206 |
+ |
|
| 207 |
+ $("#contactsUsersList").unbind("click");
|
|
| 208 |
+ $("#contactsUsersList").click(function() {
|
|
| 209 |
+ |
|
| 210 |
+ if ($("#contactsTable").is(":visible")) {
|
|
| 211 |
+ $("#contactsTable").css("display", "none");
|
|
| 212 |
+ |
|
| 213 |
+ $("#ctctsUsrsLst").removeClass("contUsrsLstRed");
|
|
| 214 |
+ $("#ctctsUsrsLst").addClass("contUsrsLst");
|
|
| 215 |
+ if (localStorage.getItem('sipCalls')) {
|
|
| 216 |
+ $('#sip-splash').css("display", "none");
|
|
| 217 |
+ $('#sip-log').css("display", "block");
|
|
| 218 |
+ } else {
|
|
| 219 |
+ $('#sip-splash').css("display", "block");
|
|
| 220 |
+ $('#sip-log').css("display", "none");
|
|
| 221 |
+ } |
|
| 222 |
+ $("#contactsUsersList").prop("title", "Show list of contacts and Nextcloud users with available phone numbers");
|
|
| 223 |
+ |
|
| 224 |
+ } else {
|
|
| 225 |
+ $("#contactsTable").css("display", "block");
|
|
| 226 |
+ |
|
| 227 |
+ $("#ctctsUsrsLst").removeClass("contUsrsLst");
|
|
| 228 |
+ $("#ctctsUsrsLst").addClass("contUsrsLstRed");
|
|
| 229 |
+ $('#sip-splash').css("display", "none");
|
|
| 230 |
+ $('#sip-log').css("display", "none");
|
|
| 231 |
+ $("#contactsUsersList").prop("title", "Hide list of contacts and Nextcloud users with available phone numbers");
|
|
| 232 |
+ } |
|
| 233 |
+ $("#dropDownButton").prop("title", "Show keypad");
|
|
| 234 |
+ }); |
|
| 235 |
+ } |
|
| 236 |
+ |
|
| 237 |
+ // Call a phone number on the contacts list when clicking on it |
|
| 238 |
+ $('[id^="indPhnmbr-"]').click(function() {
|
|
| 239 |
+ var targetNmbr = $(this).text(); |
|
| 240 |
+ $("#numDisplay").val(targetNmbr);
|
|
| 241 |
+ ctxSip.sipCall(targetNmbr); |
|
| 242 |
+ }); |
|
| 243 |
+ |
|
| 244 |
+ // Search contact by name and role |
|
| 245 |
+ $("#txtFindContact").on('keyup', function() {
|
|
| 246 |
+ |
|
| 247 |
+ var srchd = $("#txtFindContact").val();
|
|
| 248 |
+ for (var b = 0; b < contactsData.length; b++) {
|
|
| 249 |
+ if (srchd && srchd.length > 0) {
|
|
| 250 |
+ if (($("#ctRowNb-"+ b +" .cntctName").text().toLowerCase().indexOf(srchd.toLowerCase()) == -1) &&
|
|
| 251 |
+ ($("#ctRowNb-"+ b +" .cntctRole").text().toLowerCase().indexOf(srchd.toLowerCase()) == -1)) {
|
|
| 252 |
+ |
|
| 253 |
+ $("#ctRowNb-"+ b +"").hide();
|
|
| 254 |
+ |
|
| 255 |
+ } else { $("#ctRowNb-"+ b +"").show(); }
|
|
| 256 |
+ |
|
| 257 |
+ } else { $(".contactRow").each(function() { $(this).show(); }); }
|
|
| 258 |
+ } |
|
| 259 |
+ |
|
| 260 |
+ // Update the totals row |
|
| 261 |
+ var totDspReg = 0; |
|
| 262 |
+ var totDspNcusr = 0; |
|
| 263 |
+ for (var t = 0; t < contactsData.length; t++) {
|
|
| 264 |
+ if ($("#ctRowNb-"+ t +"").is(":visible") && ($("#ctRowNb-"+ t +" .typeContact").data("tpcontact") == "regular_contact")) { totDspReg++; } else if
|
|
| 265 |
+ ($("#ctRowNb-"+ t +"").is(":visible") && ($("#ctRowNb-"+ t +" .typeContact").data("tpcontact") == "ncuser_contact")){ totDspNcusr++; }
|
|
| 266 |
+ } |
|
| 267 |
+ $("#totDspRegCts").text(totDspReg);
|
|
| 268 |
+ $("#totDspNcUsr").text(totDspNcusr);
|
|
| 269 |
+ $("#totDspCntcts").text(parseInt(totDspReg + totDspNcusr));
|
|
| 270 |
+ }); |
|
| 271 |
+ |
|
| 272 |
+ // Format call duration |
|
| 273 |
+ function formatDuration(millsec) {
|
|
| 274 |
+ |
|
| 275 |
+ var secs = Math.round(millsec/1000); |
|
| 276 |
+ var hours = Math.floor(secs / 3600); |
|
| 277 |
+ |
|
| 278 |
+ var divisor_for_minutes = secs % 3600; |
|
| 279 |
+ var minutes = Math.floor(divisor_for_minutes / 60); |
|
| 280 |
+ |
|
| 281 |
+ var divisor_for_seconds = divisor_for_minutes % 60; |
|
| 282 |
+ var seconds = Math.ceil(divisor_for_seconds); |
|
| 283 |
+ |
|
| 284 |
+ var finduration = (hours > 0)? hours +" hr " : ""; |
|
| 285 |
+ finduration += (minutes > 0)? minutes +" min " : ""; |
|
| 286 |
+ finduration += seconds +" sec"; |
|
| 287 |
+ |
|
| 288 |
+ return finduration; |
|
| 289 |
+ } |
|
| 290 |
+ |
|
| 291 |
+ |
|
| 292 |
+ if (user.Stun) {
|
|
| 293 |
+ |
|
| 294 |
+ var configComp = {
|
|
| 295 |
+ media : {
|
|
| 296 |
+ remote : {
|
|
| 297 |
+ video : document.getElementById('outputVideo'),
|
|
| 298 |
+ audio : document.getElementById('outputAudio')
|
|
| 299 |
+ } |
|
| 300 |
+ }, |
|
| 301 |
+ peerConnectionOptions : {
|
|
| 302 |
+ rtcConfiguration : {
|
|
| 303 |
+ iceServers : [{ urls : "stun:"+ user.Stun }]
|
|
| 304 |
+ } |
|
| 305 |
+ }, |
|
| 306 |
+ password : userSIPToken, |
|
| 307 |
+ authorizationUser : user.User, |
|
| 308 |
+ displayName : user.Display, |
|
| 309 |
+ uri : user.User +'@'+ user.Realm, |
|
| 310 |
+ transportOptions : {
|
|
| 311 |
+ wsServers : user.WSServer, |
|
| 312 |
+ traceSip : traceornot, |
|
| 313 |
+ log : { level : 3 }
|
|
| 314 |
+ }, |
|
| 315 |
+ registerExpires : 9999999 |
|
| 316 |
+ }; |
|
| 317 |
+ |
|
| 318 |
+ } else {
|
|
| 319 |
+ |
|
| 320 |
+ var configComp = {
|
|
| 321 |
+ media : {
|
|
| 322 |
+ remote : {
|
|
| 323 |
+ video : document.getElementById('outputVideo'),
|
|
| 324 |
+ audio : document.getElementById('outputAudio')
|
|
| 325 |
+ } |
|
| 326 |
+ }, |
|
| 327 |
+ password : userSIPToken, |
|
| 328 |
+ authorizationUser : user.User, |
|
| 329 |
+ displayName : user.Display, |
|
| 330 |
+ uri : user.User +'@'+ user.Realm, |
|
| 331 |
+ transportOptions : {
|
|
| 332 |
+ wsServers : user.WSServer, |
|
| 333 |
+ traceSip : traceornot, |
|
| 334 |
+ log : { level : 3 }
|
|
| 335 |
+ }, |
|
| 336 |
+ registerExpires : 9999999 |
|
| 337 |
+ }; |
|
| 338 |
+ } |
|
| 339 |
+ |
|
| 340 |
+ var ctxSip = {
|
|
| 341 |
+ |
|
| 342 |
+ config : configComp, |
|
| 343 |
+ ringtone : document.getElementById('ringtone'),
|
|
| 344 |
+ ringbacktone : document.getElementById('ringbacktone'),
|
|
| 345 |
+ recordingwarn : document.getElementById('warnUser'),
|
|
| 346 |
+ Sessions : [], |
|
| 347 |
+ callTimers : {},
|
|
| 348 |
+ callActiveID : null, |
|
| 349 |
+ callVolume : 1, |
|
| 350 |
+ Stream : null, |
|
| 351 |
+ |
|
| 352 |
+ /** |
|
| 353 |
+ * Parses a SIP uri and returns a formatted US phone number. |
|
| 354 |
+ * |
|
| 355 |
+ * @param {string} phone number or uri to format
|
|
| 356 |
+ * @return {string} formatted number
|
|
| 357 |
+ */ |
|
| 358 |
+ formatPhone : function(phone) {
|
|
| 359 |
+ |
|
| 360 |
+ var num; |
|
| 361 |
+ |
|
| 362 |
+ if (phone.indexOf('@')) {
|
|
| 363 |
+ num = phone.split('@')[0];
|
|
| 364 |
+ } else {
|
|
| 365 |
+ num = phone; |
|
| 366 |
+ } |
|
| 367 |
+ |
|
| 368 |
+ num = num.toString().replace(/[^0-9\+]/g, ''); |
|
| 369 |
+ |
|
| 370 |
+ return num; |
|
| 371 |
+ }, |
|
| 372 |
+ |
|
| 373 |
+ // Sound methods |
|
| 374 |
+ startRingTone : function() {
|
|
| 375 |
+ try { ctxSip.ringtone.play(); } catch (e) { }
|
|
| 376 |
+ }, |
|
| 377 |
+ |
|
| 378 |
+ stopRingTone : function() {
|
|
| 379 |
+ try { ctxSip.ringtone.pause(); } catch (e) { }
|
|
| 380 |
+ }, |
|
| 381 |
+ |
|
| 382 |
+ startRingbackTone : function() {
|
|
| 383 |
+ try { ctxSip.ringbacktone.play(); } catch (e) { }
|
|
| 384 |
+ }, |
|
| 385 |
+ |
|
| 386 |
+ stopRingbackTone : function() {
|
|
| 387 |
+ try { ctxSip.ringbacktone.pause(); } catch (e) { }
|
|
| 388 |
+ }, |
|
| 389 |
+ |
|
| 390 |
+ // Generate a random string to set an ID for a call |
|
| 391 |
+ getUniqueID : function() {
|
|
| 392 |
+ return Math.random().toString(36).substr(2, 9); |
|
| 393 |
+ }, |
|
| 394 |
+ |
|
| 395 |
+ newSession : function(newSess) {
|
|
| 396 |
+ |
|
| 397 |
+ var remoteUsr = newSess.remoteIdentity.uri.user; |
|
| 398 |
+ |
|
| 399 |
+ if (remoteUsr.length < 6) {
|
|
| 400 |
+ var remoteUriUser = remoteUsr; |
|
| 401 |
+ } else {
|
|
| 402 |
+ if (remoteUsr.slice(0,1) != "+") {
|
|
| 403 |
+ var remoteUriUser = "+"+ remoteUsr; |
|
| 404 |
+ } else {
|
|
| 405 |
+ var remoteUriUser = remoteUsr; |
|
| 406 |
+ } |
|
| 407 |
+ } |
|
| 408 |
+ newSess.displayName = newSess.remoteIdentity.displayName || remoteUriUser; |
|
| 409 |
+ newSess.ctxid = ctxSip.getUniqueID(); |
|
| 410 |
+ |
|
| 411 |
+ var status; |
|
| 412 |
+ |
|
| 413 |
+ if (newSess.direction === 'incoming') {
|
|
| 414 |
+ |
|
| 415 |
+ status = "Incoming: "+ newSess.displayName; |
|
| 416 |
+ ctxSip.startRingTone(); |
|
| 417 |
+ incomingCallNote(); |
|
| 418 |
+ changePageTitle(); |
|
| 419 |
+ } else {
|
|
| 420 |
+ status = "Trying: "+ newSess.displayName; |
|
| 421 |
+ ctxSip.startRingbackTone(); |
|
| 422 |
+ } |
|
| 423 |
+ |
|
| 424 |
+ ctxSip.logCall(newSess, 'ringing'); |
|
| 425 |
+ |
|
| 426 |
+ ctxSip.setCallSessionStatus(status); |
|
| 427 |
+ |
|
| 428 |
+ // Event callbacks |
|
| 429 |
+ |
|
| 430 |
+ newSess.on('trackAdded', function() {
|
|
| 431 |
+ |
|
| 432 |
+ var pc = newSess.sessionDescriptionHandler.peerConnection; |
|
| 433 |
+ |
|
| 434 |
+ // Get remote audio track (local audio is set up via initial GUM) |
|
| 435 |
+ var remoteStream = new MediaStream(); |
|
| 436 |
+ |
|
| 437 |
+ pc.getReceivers().forEach(function (receiver) {
|
|
| 438 |
+ if (receiver.track && receiver.track.kind == "audio") {
|
|
| 439 |
+ remoteStream.addTrack(receiver.track); |
|
| 440 |
+ } |
|
| 441 |
+ }); |
|
| 442 |
+ var remoteAudio = document.getElementById('outputAudio');
|
|
| 443 |
+ remoteAudio.srcObject = remoteStream; |
|
| 444 |
+ remoteAudio.onloadedmetadata = function(e) {
|
|
| 445 |
+ remoteAudio.play(); |
|
| 446 |
+ } |
|
| 447 |
+ ctxSip.Sessions[newSess.ctxid].isMuted = false; |
|
| 448 |
+ }); |
|
| 449 |
+ |
|
| 450 |
+ newSess.on('progress',function(e) {
|
|
| 451 |
+ if (e.direction === 'outgoing') {
|
|
| 452 |
+ ctxSip.setCallSessionStatus('Calling...');
|
|
| 453 |
+ } |
|
| 454 |
+ }); |
|
| 455 |
+ |
|
| 456 |
+ newSess.on('connecting',function(e) {
|
|
| 457 |
+ if (e.direction === 'outgoing') {
|
|
| 458 |
+ ctxSip.setCallSessionStatus('Connecting...');
|
|
| 459 |
+ } |
|
| 460 |
+ }); |
|
| 461 |
+ |
|
| 462 |
+ newSess.on('accepted',function(e) {
|
|
| 463 |
+ if (ctxSip.callActiveID && ctxSip.callActiveID !== newSess.ctxid) {
|
|
| 464 |
+ ctxSip.phoneHoldButtonPressed(ctxSip.callActiveID); |
|
| 465 |
+ } |
|
| 466 |
+ |
|
| 467 |
+ ctxSip.stopRingbackTone(); |
|
| 468 |
+ ctxSip.stopRingTone(); |
|
| 469 |
+ ctxSip.setCallSessionStatus('Answered');
|
|
| 470 |
+ ctxSip.logCall(newSess, 'answered'); |
|
| 471 |
+ ctxSip.callActiveID = newSess.ctxid; |
|
| 472 |
+ }); |
|
| 473 |
+ |
|
| 474 |
+ newSess.on('hold', function(e) {
|
|
| 475 |
+ ctxSip.callActiveID = null; |
|
| 476 |
+ ctxSip.logCall(newSess, 'holding'); |
|
| 477 |
+ ctxSip.setCallSessionStatus("Holding");
|
|
| 478 |
+ }); |
|
| 479 |
+ |
|
| 480 |
+ newSess.on('unhold', function(e) {
|
|
| 481 |
+ ctxSip.logCall(newSess, 'resumed'); |
|
| 482 |
+ ctxSip.callActiveID = newSess.ctxid; |
|
| 483 |
+ ctxSip.setCallSessionStatus("Answered");
|
|
| 484 |
+ }); |
|
| 485 |
+ |
|
| 486 |
+ newSess.on('cancel', function(e) {
|
|
| 487 |
+ ctxSip.stopRingTone(); |
|
| 488 |
+ ctxSip.stopRingbackTone(); |
|
| 489 |
+ ctxSip.setCallSessionStatus("Canceled");
|
|
| 490 |
+ if (this.direction === 'outgoing') {
|
|
| 491 |
+ ctxSip.callActiveID = null; |
|
| 492 |
+ newSess = null; |
|
| 493 |
+ ctxSip.logCall(this, 'ended'); |
|
| 494 |
+ } |
|
| 495 |
+ }); |
|
| 496 |
+ |
|
| 497 |
+ newSess.on('bye', function(e) {
|
|
| 498 |
+ ctxSip.stopRingTone(); |
|
| 499 |
+ ctxSip.stopRingbackTone(); |
|
| 500 |
+ ctxSip.setCallSessionStatus("");
|
|
| 501 |
+ ctxSip.logCall(newSess, 'ended'); |
|
| 502 |
+ ctxSip.callActiveID = null; |
|
| 503 |
+ newSess = null; |
|
| 504 |
+ }); |
|
| 505 |
+ |
|
| 506 |
+ newSess.on('failed',function(e) {
|
|
| 507 |
+ ctxSip.stopRingTone(); |
|
| 508 |
+ ctxSip.stopRingbackTone(); |
|
| 509 |
+ ctxSip.setCallSessionStatus('Terminated');
|
|
| 510 |
+ }); |
|
| 511 |
+ |
|
| 512 |
+ newSess.on('rejected',function(e) {
|
|
| 513 |
+ ctxSip.stopRingTone(); |
|
| 514 |
+ ctxSip.stopRingbackTone(); |
|
| 515 |
+ ctxSip.setCallSessionStatus('Rejected');
|
|
| 516 |
+ ctxSip.callActiveID = null; |
|
| 517 |
+ ctxSip.logCall(this, 'ended'); |
|
| 518 |
+ newSess = null; |
|
| 519 |
+ }); |
|
| 520 |
+ |
|
| 521 |
+ ctxSip.Sessions[newSess.ctxid] = newSess; |
|
| 522 |
+ |
|
| 523 |
+ // Hide contacts list |
|
| 524 |
+ $("#contactsTable").css("display", "none");
|
|
| 525 |
+ $("#ctctsUsrsLst").removeClass("contUsrsLstRed");
|
|
| 526 |
+ $("#ctctsUsrsLst").addClass("contUsrsLst");
|
|
| 527 |
+ }, |
|
| 528 |
+ |
|
| 529 |
+ // getUserMedia failed or device wasn't present |
|
| 530 |
+ getUserMediaFailure : function(e) {
|
|
| 531 |
+ window.console.error('getUserMedia failed: ', e);
|
|
| 532 |
+ ctxSip.setError(true, 'Media Error.', 'You must allow access to your microphone. Check the address bar.', true); |
|
| 533 |
+ }, |
|
| 534 |
+ |
|
| 535 |
+ getUserMediaSuccess : function(stream) {
|
|
| 536 |
+ ctxSip.Stream = stream; |
|
| 537 |
+ }, |
|
| 538 |
+ |
|
| 539 |
+ /** |
|
| 540 |
+ * Sets the UI call status field |
|
| 541 |
+ * |
|
| 542 |
+ * @param {string} status
|
|
| 543 |
+ */ |
|
| 544 |
+ setCallSessionStatus : function(status) {
|
|
| 545 |
+ $('#txtCallStatus').html(status);
|
|
| 546 |
+ }, |
|
| 547 |
+ |
|
| 548 |
+ /** |
|
| 549 |
+ * Sets the UI connection status field |
|
| 550 |
+ * |
|
| 551 |
+ * @param {string} status
|
|
| 552 |
+ */ |
|
| 553 |
+ setStatus : function(status) {
|
|
| 554 |
+ $("#txtRegStatus").html('<i class="fa fa-signal"></i> '+ status);
|
|
| 555 |
+ }, |
|
| 556 |
+ |
|
| 557 |
+ /** |
|
| 558 |
+ * Logs a call to localStorage |
|
| 559 |
+ * |
|
| 560 |
+ * @param {object} session
|
|
| 561 |
+ * @param {string} status Enum 'ringing', 'answered', 'ended', 'holding', 'resumed'
|
|
| 562 |
+ */ |
|
| 563 |
+ logCall : function(session, status) {
|
|
| 564 |
+ |
|
| 565 |
+ var log = {
|
|
| 566 |
+ clid : session.displayName, |
|
| 567 |
+ uri : session.remoteIdentity.uri.toString(), |
|
| 568 |
+ id : session.ctxid, |
|
| 569 |
+ time : new Date().getTime() |
|
| 570 |
+ }; |
|
| 571 |
+ var calllog = JSON.parse(localStorage.getItem('sipCalls'));
|
|
| 572 |
+ |
|
| 573 |
+ if (!calllog) { calllog = {}; }
|
|
| 574 |
+ |
|
| 575 |
+ if (!calllog.hasOwnProperty(session.ctxid)) {
|
|
| 576 |
+ calllog[log.id] = {
|
|
| 577 |
+ id : log.id, |
|
| 578 |
+ clid : log.clid, |
|
| 579 |
+ uri : log.uri, |
|
| 580 |
+ start : log.time, |
|
| 581 |
+ flow : session.direction |
|
| 582 |
+ }; |
|
| 583 |
+ } |
|
| 584 |
+ |
|
| 585 |
+ if (status === 'answered') {
|
|
| 586 |
+ calllog[log.id].start = log.time; |
|
| 587 |
+ } |
|
| 588 |
+ |
|
| 589 |
+ if (status === 'ended') {
|
|
| 590 |
+ calllog[log.id].stop = log.time; |
|
| 591 |
+ } |
|
| 592 |
+ |
|
| 593 |
+ if (status === 'ended' && calllog[log.id].status === 'ringing') {
|
|
| 594 |
+ calllog[log.id].status = 'missed'; |
|
| 595 |
+ } else {
|
|
| 596 |
+ calllog[log.id].status = status; |
|
| 597 |
+ } |
|
| 598 |
+ |
|
| 599 |
+ localStorage.setItem('sipCalls', JSON.stringify(calllog));
|
|
| 600 |
+ ctxSip.logShow(); |
|
| 601 |
+ }, |
|
| 602 |
+ |
|
| 603 |
+ /** |
|
| 604 |
+ * Adds a UI item to the call log |
|
| 605 |
+ * |
|
| 606 |
+ * @param {object} item log item
|
|
| 607 |
+ */ |
|
| 608 |
+ logItem : function(item) {
|
|
| 609 |
+ |
|
| 610 |
+ var callActive = (item.status !== 'ended' && item.status !== 'missed'); |
|
| 611 |
+ var callLength = (item.status !== 'ended')? '<span id="'+ item.id +'"></span>' : formatDuration(moment.duration(item.stop - item.start)); |
|
| 612 |
+ |
|
| 613 |
+ var callClass = ''; |
|
| 614 |
+ var callIcon = ''; |
|
| 615 |
+ var callTitle = ''; |
|
| 616 |
+ |
|
| 617 |
+ switch (item.status) {
|
|
| 618 |
+ case 'ringing': |
|
| 619 |
+ callClass = 'list-group-item-success'; |
|
| 620 |
+ callIcon = 'fa-bell'; |
|
| 621 |
+ break; |
|
| 622 |
+ |
|
| 623 |
+ case 'missed': |
|
| 624 |
+ callClass = 'list-group-item-danger'; |
|
| 625 |
+ if (item.flow === "incoming") { callIcon = 'incomingCall'; callTitle = 'Incoming call'; }
|
|
| 626 |
+ if (item.flow === "outgoing") { callIcon = 'outgoingCall'; callTitle = 'Outgoing call'; }
|
|
| 627 |
+ break; |
|
| 628 |
+ |
|
| 629 |
+ case 'holding': |
|
| 630 |
+ callClass = 'list-group-item-warning'; |
|
| 631 |
+ callIcon = 'fa-pause'; |
|
| 632 |
+ break; |
|
| 633 |
+ |
|
| 634 |
+ case 'answered': ; |
|
| 635 |
+ case 'resumed': |
|
| 636 |
+ callClass = 'list-group-item-info'; |
|
| 637 |
+ callIcon = 'fa-phone-square'; |
|
| 638 |
+ break; |
|
| 639 |
+ |
|
| 640 |
+ case 'ended': |
|
| 641 |
+ if (item.flow === "incoming") { callIcon = 'incomingCall'; callTitle = 'Incoming call'; }
|
|
| 642 |
+ if (item.flow === "outgoing") { callIcon = 'outgoingCall'; callTitle = 'Outgoing call'; }
|
|
| 643 |
+ break; |
|
| 644 |
+ } |
|
| 645 |
+ |
|
| 646 |
+ var i = '<div class="list-group-item sip-logitem clearfix '+ callClass +'" data-sessionid="'+ item.id +'">'; |
|
| 647 |
+ i += '<div class="clearfix"><div class="pull-left">'; |
|
| 648 |
+ i += '<i class="fa fa-fw '+ callIcon +'" title="'+ callTitle +'"></i><div class="listPhNb" data-uri="'+ item.uri +'" title="Double click to call">'+ ctxSip.formatPhone(item.uri) +'</div><div class="callTimeMmt" title="Call time">'+ moment(item.start).format('YYYY/MM/DD HH:mm:ss') +'</div></div>';
|
|
| 649 |
+ i += '<div class="pull-right text-right" title="Target number/Caller"><em>'+ item.clid +'</em><div class="callDuration" title="Call duration">'+ callLength +'</div></div></div>'; |
|
| 650 |
+ |
|
| 651 |
+ if (callActive) {
|
|
| 652 |
+ i += '<div class="btn-group btn-group-xs pull-right">'; |
|
| 653 |
+ if (item.status === 'ringing' && item.flow === 'incoming') {
|
|
| 654 |
+ i += '<button class="btn btn-xs btn-success btnCall" title="Call"><i class="fa fa-phone"></i></button>'; |
|
| 655 |
+ } else {
|
|
| 656 |
+ i += '<button id="hold-'+ item.id +'" class="btn btn-xs btn-primary btnHoldResume" title="Hold"><i class="fa fa-pause"></i></button>'; |
|
| 657 |
+ i += '<button class="btn btn-xs btn-info btnTransfer" title="Transfer"><i class="fa fa-random"></i></button>'; |
|
| 658 |
+ i += '<button id="mute-'+ item.id +'" class="btn btn-xs btn-warning btnMute" title="Mute"><i class="fa fa-fw fa-microphone"></i></button>'; |
|
| 659 |
+ i += '<button id="rec-'+ item.id +'" class="btn btn-xs btnRecord" title="Start recording"><i class="fa fa-fw fa-dot-circle-o"></i></button>'; |
|
| 660 |
+ } |
|
| 661 |
+ i += '<button class="btn btn-xs btn-danger btnHangUp" title="Hangup"><i class="fa fa-stop"></i></button>'; |
|
| 662 |
+ i += '</div>'; |
|
| 663 |
+ } |
|
| 664 |
+ i += '</div>'; |
|
| 665 |
+ |
|
| 666 |
+ $('#sip-logitems').append(i);
|
|
| 667 |
+ |
|
| 668 |
+ // Start call timer on answer |
|
| 669 |
+ if (item.status === 'answered') {
|
|
| 670 |
+ var tEle = document.getElementById(item.id); |
|
| 671 |
+ ctxSip.callTimers[item.id] = new Stopwatch(tEle); |
|
| 672 |
+ ctxSip.callTimers[item.id].start(); |
|
| 673 |
+ } |
|
| 674 |
+ |
|
| 675 |
+ if (callActive && item.status !== 'ringing') {
|
|
| 676 |
+ ctxSip.callTimers[item.id].start({ startTime : item.start });
|
|
| 677 |
+ } |
|
| 678 |
+ |
|
| 679 |
+ $('#sip-logitems').scrollTop(0);
|
|
| 680 |
+ }, |
|
| 681 |
+ |
|
| 682 |
+ /** |
|
| 683 |
+ * Updates the call log UI |
|
| 684 |
+ */ |
|
| 685 |
+ logShow : function() {
|
|
| 686 |
+ |
|
| 687 |
+ var calllog = JSON.parse(localStorage.getItem('sipCalls'));
|
|
| 688 |
+ var x = []; |
|
| 689 |
+ |
|
| 690 |
+ if (calllog !== null) {
|
|
| 691 |
+ |
|
| 692 |
+ $('#sip-splash').css("display", "none");
|
|
| 693 |
+ $('#sip-log').css("display", "block");
|
|
| 694 |
+ |
|
| 695 |
+ // Empty existing logs |
|
| 696 |
+ $('#sip-logitems').empty();
|
|
| 697 |
+ |
|
| 698 |
+ // JS doesn't guarantee property order so, create an array with the start time as the key and sort by that |
|
| 699 |
+ |
|
| 700 |
+ // Add start time to array |
|
| 701 |
+ $.each(calllog, function(k,v) {
|
|
| 702 |
+ x.push(v); |
|
| 703 |
+ }); |
|
| 704 |
+ |
|
| 705 |
+ // Sort descending |
|
| 706 |
+ x.sort(function(a, b) {
|
|
| 707 |
+ return b.start - a.start; |
|
| 708 |
+ }); |
|
| 709 |
+ |
|
| 710 |
+ $.each(x, function(k, v) {
|
|
| 711 |
+ ctxSip.logItem(v); |
|
| 712 |
+ }); |
|
| 713 |
+ |
|
| 714 |
+ } else {
|
|
| 715 |
+ $('#sip-splash').css("display", "block");
|
|
| 716 |
+ $('#sip-log').css("display", "none");
|
|
| 717 |
+ } |
|
| 718 |
+ |
|
| 719 |
+ showContactsNmbrs(); |
|
| 720 |
+ }, |
|
| 721 |
+ |
|
| 722 |
+ /** |
|
| 723 |
+ * Remove log items from localStorage and update the UI |
|
| 724 |
+ */ |
|
| 725 |
+ logClear : function() {
|
|
| 726 |
+ |
|
| 727 |
+ localStorage.removeItem('sipCalls');
|
|
| 728 |
+ ctxSip.logShow(); |
|
| 729 |
+ }, |
|
| 730 |
+ |
|
| 731 |
+ sipCall : function(target) {
|
|
| 732 |
+ |
|
| 733 |
+ try {
|
|
| 734 |
+ |
|
| 735 |
+ // Get the name of the SIP provider and send it to Asterisk, so that it knows what provider to use for outbound calls |
|
| 736 |
+ var callerNumber = $("#fromNumber").val();
|
|
| 737 |
+ |
|
| 738 |
+ if (callerNumber.indexOf(":") >= 0) {
|
|
| 739 |
+ var shortProv = callerNumber.split(":");
|
|
| 740 |
+ var sipProvider = shortProv[0].replace(" ", "");
|
|
| 741 |
+ var callFromNumber = shortProv[1].replace(" ", "");
|
|
| 742 |
+ } else {
|
|
| 743 |
+ var sipProvider = 'n/a'; |
|
| 744 |
+ var callFromNumber = callerNumber; |
|
| 745 |
+ } |
|
| 746 |
+ |
|
| 747 |
+ var s = ctxSip.phone.invite(target, {
|
|
| 748 |
+ media : {
|
|
| 749 |
+ remote : {
|
|
| 750 |
+ video : document.getElementById('outputVideo'),
|
|
| 751 |
+ audio : document.getElementById('outputAudio')
|
|
| 752 |
+ } |
|
| 753 |
+ }, |
|
| 754 |
+ extraHeaders : [ 'X-SipProvider: '+ sipProvider , 'X-CallFromNumber: '+ callFromNumber ], |
|
| 755 |
+ sessionDescriptionHandlerOptions : {
|
|
| 756 |
+ constraints : { audio : true, video : false },
|
|
| 757 |
+ rtcConfiguration : { RTCConstraints : { "optional" : [{ 'DtlsSrtpKeyAgreement' : 'true'} ]}, stream : ctxSip.Stream }
|
|
| 758 |
+ |
|
| 759 |
+ } |
|
| 760 |
+ }); |
|
| 761 |
+ s.direction = 'outgoing'; |
|
| 762 |
+ ctxSip.newSession(s); |
|
| 763 |
+ |
|
| 764 |
+ s.on('trackAdded', function() {
|
|
| 765 |
+ |
|
| 766 |
+ var pc = s.sessionDescriptionHandler.peerConnection; |
|
| 767 |
+ |
|
| 768 |
+ // Get remote audio track (local audio is set up via initial GUM) |
|
| 769 |
+ var remoteStream = new MediaStream(); |
|
| 770 |
+ |
|
| 771 |
+ pc.getReceivers().forEach(function (receiver) {
|
|
| 772 |
+ if (receiver.track && receiver.track.kind == "audio") {
|
|
| 773 |
+ remoteStream.addTrack(receiver.track); |
|
| 774 |
+ } |
|
| 775 |
+ }); |
|
| 776 |
+ var remoteAudio = document.getElementById('outputAudio');
|
|
| 777 |
+ remoteAudio.srcObject = remoteStream; |
|
| 778 |
+ remoteAudio.onloadedmetadata = function(e) {
|
|
| 779 |
+ remoteAudio.play(); |
|
| 780 |
+ } |
|
| 781 |
+ }); |
|
| 782 |
+ |
|
| 783 |
+ } catch(e) {
|
|
| 784 |
+ throw(e); |
|
| 785 |
+ } |
|
| 786 |
+ }, |
|
| 787 |
+ |
|
| 788 |
+ sipTransfer : function(sessionid) {
|
|
| 789 |
+ |
|
| 790 |
+ var s = ctxSip.Sessions[sessionid], |
|
| 791 |
+ target = window.prompt('Enter destination number', '');
|
|
| 792 |
+ if (target) {
|
|
| 793 |
+ ctxSip.setCallSessionStatus('<i>Transfering the call...</i>');
|
|
| 794 |
+ } |
|
| 795 |
+ s.refer(target); |
|
| 796 |
+ showContactsNmbrs(); |
|
| 797 |
+ }, |
|
| 798 |
+ |
|
| 799 |
+ sipHangUp : function(sessionid) {
|
|
| 800 |
+ |
|
| 801 |
+ var s = ctxSip.Sessions[sessionid]; |
|
| 802 |
+ |
|
| 803 |
+ if (!s) {
|
|
| 804 |
+ return; |
|
| 805 |
+ } else if (s.startTime) {
|
|
| 806 |
+ s.bye(); |
|
| 807 |
+ } else if (s.reject) {
|
|
| 808 |
+ s.reject(); |
|
| 809 |
+ } else if (s.cancel) {
|
|
| 810 |
+ s.cancel(); |
|
| 811 |
+ } |
|
| 812 |
+ |
|
| 813 |
+ $("#numDisplay").val("");
|
|
| 814 |
+ showContactsNmbrs(); |
|
| 815 |
+ }, |
|
| 816 |
+ |
|
| 817 |
+ sipSendDTMF : function(digit) {
|
|
| 818 |
+ |
|
| 819 |
+ var a = ctxSip.callActiveID; |
|
| 820 |
+ if (a) {
|
|
| 821 |
+ var s = ctxSip.Sessions[a]; |
|
| 822 |
+ s.dtmf(digit); |
|
| 823 |
+ } |
|
| 824 |
+ }, |
|
| 825 |
+ |
|
| 826 |
+ phoneCallButtonPressed : function(sessionid) {
|
|
| 827 |
+ |
|
| 828 |
+ var s = ctxSip.Sessions[sessionid], |
|
| 829 |
+ target = $("#numDisplay").val();
|
|
| 830 |
+ |
|
| 831 |
+ if (!s) {
|
|
| 832 |
+ |
|
| 833 |
+ $("#numDisplay").val("");
|
|
| 834 |
+ ctxSip.sipCall(target); |
|
| 835 |
+ |
|
| 836 |
+ } else if (s.accept && !s.startTime) {
|
|
| 837 |
+ |
|
| 838 |
+ s.accept({
|
|
| 839 |
+ media : {
|
|
| 840 |
+ remote : {
|
|
| 841 |
+ video : document.getElementById('outputVideo'),
|
|
| 842 |
+ audio : document.getElementById('outputAudio')
|
|
| 843 |
+ } |
|
| 844 |
+ }, |
|
| 845 |
+ sessionDescriptionHandlerOptions : {
|
|
| 846 |
+ constraints : { audio : true, video : false },
|
|
| 847 |
+ rtcConfiguration : { RTCConstraints : { "optional" : [{ 'DtlsSrtpKeyAgreement' : 'true'} ]}, stream : ctxSip.Stream }
|
|
| 848 |
+ |
|
| 849 |
+ } |
|
| 850 |
+ }); |
|
| 851 |
+ } |
|
| 852 |
+ |
|
| 853 |
+ // Hide contacts list |
|
| 854 |
+ $("#contactsTable").css("display", "none");
|
|
| 855 |
+ $("#ctctsUsrsLst").removeClass("contUsrsLstRed");
|
|
| 856 |
+ $("#ctctsUsrsLst").addClass("contUsrsLst");
|
|
| 857 |
+ }, |
|
| 858 |
+ |
|
| 859 |
+ // Record audio call |
|
| 860 |
+ phoneRecordButtonPressed : function (recbtnid) {
|
|
| 861 |
+ |
|
| 862 |
+ var recBtn = document.getElementById(recbtnid); |
|
| 863 |
+ |
|
| 864 |
+ if (mediaRecorder === null) {
|
|
| 865 |
+ |
|
| 866 |
+ var sessionid = recbtnid.replace("rec-", "");
|
|
| 867 |
+ var crtsess = ctxSip.Sessions[sessionid]; |
|
| 868 |
+ var pc = crtsess.sessionDescriptionHandler.peerConnection; |
|
| 869 |
+ var audioTracks = []; |
|
| 870 |
+ |
|
| 871 |
+ pc.getSenders().forEach(function (rtpSender) {
|
|
| 872 |
+ if (rtpSender.track && rtpSender.track.kind == "audio") {
|
|
| 873 |
+ console.log("Adding sender audio track to record: ", rtpSender.track.label);
|
|
| 874 |
+ audioTracks.push(rtpSender.track); |
|
| 875 |
+ } |
|
| 876 |
+ }); |
|
| 877 |
+ |
|
| 878 |
+ pc.getReceivers().forEach(function (rtpReceiver) {
|
|
| 879 |
+ if (rtpReceiver.track && rtpReceiver.track.kind == "audio") {
|
|
| 880 |
+ console.log("Adding receiver audio track to record: ", rtpReceiver.track.label);
|
|
| 881 |
+ audioTracks.push(rtpReceiver.track); |
|
| 882 |
+ } |
|
| 883 |
+ }); |
|
| 884 |
+ |
|
| 885 |
+ // Combine the audio tracks into one track |
|
| 886 |
+ const ac = new AudioContext(); |
|
| 887 |
+ const sources = audioTracks.map(function(t) { return ac.createMediaStreamSource(new MediaStream([t])); });
|
|
| 888 |
+ const dest = ac.createMediaStreamDestination(); |
|
| 889 |
+ sources.forEach(function(s) { s.connect(dest); });
|
|
| 890 |
+ |
|
| 891 |
+ var mediaStream = new MediaStream(dest.stream); |
|
| 892 |
+ mediaRecorder = new MediaRecorder(mediaStream); |
|
| 893 |
+ var recordedChunks = []; |
|
| 894 |
+ |
|
| 895 |
+ mediaRecorder.addEventListener("dataavailable", function (event) {
|
|
| 896 |
+ recordedChunks.push(event.data); |
|
| 897 |
+ }); |
|
| 898 |
+ |
|
| 899 |
+ mediaRecorder.addEventListener("stop", function() {
|
|
| 900 |
+ |
|
| 901 |
+ const rawblob = new Blob(recordedChunks, { type: 'audio/webm' });
|
|
| 902 |
+ let duration = recordedChunks.length * 200; |
|
| 903 |
+ |
|
| 904 |
+ // Add duration to the media blob, so that the final webm/ogx file becomes seekable |
|
| 905 |
+ ysFixWebmDuration(rawblob, duration, function(fixedBlob) {
|
|
| 906 |
+ |
|
| 907 |
+ let filename = window.prompt('Enter the name of the audio file:');
|
|
| 908 |
+ let downloadLink = document.createElement('a');
|
|
| 909 |
+ downloadLink.href = URL.createObjectURL(fixedBlob); |
|
| 910 |
+ downloadLink.download = `${filename}.webm`;
|
|
| 911 |
+ |
|
| 912 |
+ document.body.appendChild(downloadLink); |
|
| 913 |
+ downloadLink.click(); |
|
| 914 |
+ URL.revokeObjectURL(fixedBlob); |
|
| 915 |
+ document.body.removeChild(downloadLink); |
|
| 916 |
+ |
|
| 917 |
+ }); |
|
| 918 |
+ }); |
|
| 919 |
+ |
|
| 920 |
+ confirmAlert("In some countries it is a legal requirement to warn the interlocutor before recording a conversation. Do you want to play a short audio warning at the beginning of the recording, to inform the interlocutor that (s)he will be recorded ?");
|
|
| 921 |
+ |
|
| 922 |
+ $("#confirmOk").click(function() {
|
|
| 923 |
+ |
|
| 924 |
+ // Start recording in chunks of 200 milliseconds |
|
| 925 |
+ mediaRecorder.start(200); |
|
| 926 |
+ |
|
| 927 |
+ // Warn the interlocutor about the recording |
|
| 928 |
+ ctxSip.recordingwarn.play(); |
|
| 929 |
+ $("#alertMsgOverlay").remove();
|
|
| 930 |
+ $("#alertConfMessage").remove();
|
|
| 931 |
+ }); |
|
| 932 |
+ $("#confirmCancel").click(function() {
|
|
| 933 |
+ mediaRecorder.start(200); |
|
| 934 |
+ $("#alertMsgOverlay").remove();
|
|
| 935 |
+ $("#alertConfMessage").remove();
|
|
| 936 |
+ }); |
|
| 937 |
+ recBtn.title = "Stop recording"; |
|
| 938 |
+ recBtn.classList.add("changeRecBtn");
|
|
| 939 |
+ |
|
| 940 |
+ } else {
|
|
| 941 |
+ |
|
| 942 |
+ recBtn.classList.remove("changeRecBtn");
|
|
| 943 |
+ recBtn.title = "Start recording"; |
|
| 944 |
+ |
|
| 945 |
+ // Stop recording |
|
| 946 |
+ mediaRecorder.stop(); |
|
| 947 |
+ mediaRecorder = null; |
|
| 948 |
+ } |
|
| 949 |
+ }, |
|
| 950 |
+ |
|
| 951 |
+ phoneMuteButtonPressed : function (sessionid) {
|
|
| 952 |
+ |
|
| 953 |
+ var sess = ctxSip.Sessions[sessionid]; |
|
| 954 |
+ var pc = sess.sessionDescriptionHandler.peerConnection; |
|
| 955 |
+ |
|
| 956 |
+ if (sess.isMuted) {
|
|
| 957 |
+ sess.isMuted = false; |
|
| 958 |
+ pc.getSenders().forEach(function(rtpSender) {
|
|
| 959 |
+ if (rtpSender.track && rtpSender.track.kind == "audio") {
|
|
| 960 |
+ rtpSender.track.enabled = true; |
|
| 961 |
+ } |
|
| 962 |
+ }); |
|
| 963 |
+ $("#txtCallStatus").text("Answered");
|
|
| 964 |
+ $("#mute-"+ sessionid +"").prop("title", "Mute").css("background-color", "#f0ad4e");
|
|
| 965 |
+ } else {
|
|
| 966 |
+ sess.isMuted = true; |
|
| 967 |
+ pc.getSenders().forEach(function(rtpSender) {
|
|
| 968 |
+ if (rtpSender.track && rtpSender.track.kind == "audio") {
|
|
| 969 |
+ rtpSender.track.enabled = false; |
|
| 970 |
+ } |
|
| 971 |
+ }); |
|
| 972 |
+ $("#txtCallStatus").text("Muted");
|
|
| 973 |
+ $("#mute-"+ sessionid +"").prop("title", "Unmute").css("background-color", "#c47e1a");
|
|
| 974 |
+ } |
|
| 975 |
+ }, |
|
| 976 |
+ |
|
| 977 |
+ phoneHoldButtonPressed : function(sessionid) {
|
|
| 978 |
+ |
|
| 979 |
+ var ses = ctxSip.Sessions[sessionid]; |
|
| 980 |
+ var direction = ses.sessionDescriptionHandler.getDirection(); |
|
| 981 |
+ |
|
| 982 |
+ if (direction === 'sendrecv') {
|
|
| 983 |
+ console.log('Call is on hold');
|
|
| 984 |
+ ses.hold(); |
|
| 985 |
+ ctxSip.logCall(ses, 'holding'); |
|
| 986 |
+ $("#txtCallStatus").text("Holding");
|
|
| 987 |
+ $("#hold-"+ sessionid +"").prop("title", "Unhold").css("background-color", "#20496c");
|
|
| 988 |
+ |
|
| 989 |
+ } else {
|
|
| 990 |
+ console.log('Call is not on hold');
|
|
| 991 |
+ ses.unhold(); |
|
| 992 |
+ ctxSip.logCall(ses, 'resumed'); |
|
| 993 |
+ $("#txtCallStatus").text("Answered");
|
|
| 994 |
+ $("#hold-"+ sessionid +"").prop("title", "Hold").css("background-color", "#337ab7");
|
|
| 995 |
+ } |
|
| 996 |
+ }, |
|
| 997 |
+ |
|
| 998 |
+ setError : function(err, title, msg, closable) {
|
|
| 999 |
+ |
|
| 1000 |
+ // Show modal if err === true |
|
| 1001 |
+ if (err === true) {
|
|
| 1002 |
+ $("#mdlError p").html(msg);
|
|
| 1003 |
+ $("#mdlError").modal('show');
|
|
| 1004 |
+ |
|
| 1005 |
+ if (closable) {
|
|
| 1006 |
+ var b = '<button type="button" class="close" data-dismiss="modal">×</button>'; |
|
| 1007 |
+ $("#mdlError .modal-header").find('button').remove();
|
|
| 1008 |
+ $("#mdlError .modal-header").prepend(b);
|
|
| 1009 |
+ $("#mdlError .modal-title").html(title);
|
|
| 1010 |
+ $("#mdlError").modal({ keyboard : true });
|
|
| 1011 |
+ } else {
|
|
| 1012 |
+ $("#mdlError .modal-header").find('button').remove();
|
|
| 1013 |
+ $("#mdlError .modal-title").html(title);
|
|
| 1014 |
+ $("#mdlError").modal({ keyboard : false });
|
|
| 1015 |
+ } |
|
| 1016 |
+ } else {
|
|
| 1017 |
+ $('#numDisplay').removeProp('disabled');
|
|
| 1018 |
+ $("#mdlError").modal('hide');
|
|
| 1019 |
+ } |
|
| 1020 |
+ }, |
|
| 1021 |
+ |
|
| 1022 |
+ /** |
|
| 1023 |
+ * Test for an audio call capable browser and return an error on failure |
|
| 1024 |
+ */ |
|
| 1025 |
+ hasWebRTC : function() {
|
|
| 1026 |
+ |
|
| 1027 |
+ if (navigator.mediaDevices.getUserMedia) {
|
|
| 1028 |
+ return true; |
|
| 1029 |
+ } else if (navigator.webkitGetUserMedia) {
|
|
| 1030 |
+ return true; |
|
| 1031 |
+ } else if (navigator.mozGetUserMedia) {
|
|
| 1032 |
+ return true; |
|
| 1033 |
+ } else {
|
|
| 1034 |
+ ctxSip.setError(true, 'Unsupported Browser.', 'Your browser does not support the features required for this phone.'); |
|
| 1035 |
+ window.console.error("WebRTC support not found");
|
|
| 1036 |
+ return false; |
|
| 1037 |
+ } |
|
| 1038 |
+ } |
|
| 1039 |
+ }; |
|
| 1040 |
+ |
|
| 1041 |
+ ctxSip.hasWebRTC(); |
|
| 1042 |
+ |
|
| 1043 |
+ ctxSip.phone = new SIP.UA(ctxSip.config); |
|
| 1044 |
+ |
|
| 1045 |
+ ctxSip.phone.on('connected', function(e) {
|
|
| 1046 |
+ ctxSip.setStatus("Connected");
|
|
| 1047 |
+ ctxSip.setError(false); |
|
| 1048 |
+ userSIPToken = ''; |
|
| 1049 |
+ }); |
|
| 1050 |
+ |
|
| 1051 |
+ ctxSip.phone.on('disconnected', function(e) {
|
|
| 1052 |
+ ctxSip.setStatus("Disconnected");
|
|
| 1053 |
+ |
|
| 1054 |
+ // Disable phone |
|
| 1055 |
+ ctxSip.setError(true, 'Websocket Disconnected.', 'An Error occurred connecting to the websocket.'); |
|
| 1056 |
+ |
|
| 1057 |
+ userSIPToken = ''; |
|
| 1058 |
+ }); |
|
| 1059 |
+ |
|
| 1060 |
+ ctxSip.phone.on('registered', function(e) {
|
|
| 1061 |
+ |
|
| 1062 |
+ navigator.mediaDevices.getUserMedia({ audio : true, video : false }).then(function(stream) {
|
|
| 1063 |
+ ctxSip.setError(false); |
|
| 1064 |
+ var closeEditorWarning = function() {
|
|
| 1065 |
+ return 'If you close this window, you will not be able to make or receive calls from your browser.'; |
|
| 1066 |
+ }; |
|
| 1067 |
+ |
|
| 1068 |
+ var closePhone = function() {
|
|
| 1069 |
+ // Stop the phone on unload |
|
| 1070 |
+ localStorage.removeItem('ctxPhone');
|
|
| 1071 |
+ ctxSip.phone.stop(); |
|
| 1072 |
+ }; |
|
| 1073 |
+ |
|
| 1074 |
+ window.onbeforeunload = closeEditorWarning; |
|
| 1075 |
+ window.onunload = closePhone; |
|
| 1076 |
+ |
|
| 1077 |
+ // This key is set to prevent multiple windows |
|
| 1078 |
+ localStorage.setItem('ctxPhone', 'true');
|
|
| 1079 |
+ |
|
| 1080 |
+ $("#mldError").modal('hide');
|
|
| 1081 |
+ ctxSip.setStatus("Ready");
|
|
| 1082 |
+ }); |
|
| 1083 |
+ |
|
| 1084 |
+ userSIPToken = ''; |
|
| 1085 |
+ }); |
|
| 1086 |
+ |
|
| 1087 |
+ ctxSip.phone.on('registrationFailed', function(e) {
|
|
| 1088 |
+ console.log(e) |
|
| 1089 |
+ ctxSip.setError(true, 'Registration Error.', 'An Error occurred registering your phone. Check your settings.'); |
|
| 1090 |
+ ctxSip.setStatus("Error: Registration Failed");
|
|
| 1091 |
+ userSIPToken = ''; |
|
| 1092 |
+ }); |
|
| 1093 |
+ |
|
| 1094 |
+ ctxSip.phone.on('unregistered', function(e) {
|
|
| 1095 |
+ ctxSip.setError(true, 'Registration Error.', 'An Error occurred registering your phone. Please wait while we try to connect it again.'); |
|
| 1096 |
+ ctxSip.setStatus("Error: Registration Failed");
|
|
| 1097 |
+ userSIPToken = ''; |
|
| 1098 |
+ }); |
|
| 1099 |
+ |
|
| 1100 |
+ ctxSip.phone.on('invite', function (incomingSession) {
|
|
| 1101 |
+ var s = incomingSession; |
|
| 1102 |
+ s.direction = 'incoming'; |
|
| 1103 |
+ ctxSip.newSession(s); |
|
| 1104 |
+ showContactsNmbrs(); |
|
| 1105 |
+ }); |
|
| 1106 |
+ |
|
| 1107 |
+ $('#numDisplay').keypress(function(e) {
|
|
| 1108 |
+ // If 'Enter' is pressed, dial |
|
| 1109 |
+ if (e.which === 13) {
|
|
| 1110 |
+ ctxSip.phoneCallButtonPressed(); |
|
| 1111 |
+ } |
|
| 1112 |
+ }); |
|
| 1113 |
+ |
|
| 1114 |
+ $('#phoneIcon').click(function(event) {
|
|
| 1115 |
+ // If 'Enter' is pressed, dial |
|
| 1116 |
+ event.preventDefault(); |
|
| 1117 |
+ ctxSip.phoneCallButtonPressed(); |
|
| 1118 |
+ }); |
|
| 1119 |
+ |
|
| 1120 |
+ $(".digit").click(function(event) {
|
|
| 1121 |
+ |
|
| 1122 |
+ if (event.shiftKey) {
|
|
| 1123 |
+ |
|
| 1124 |
+ clck++; |
|
| 1125 |
+ event.preventDefault(); |
|
| 1126 |
+ var num = $('#numDisplay').val();
|
|
| 1127 |
+ var dig; |
|
| 1128 |
+ var diginit = $(this).data('digit').toString().split(',');
|
|
| 1129 |
+ var elct = diginit.length; |
|
| 1130 |
+ |
|
| 1131 |
+ dig = diginit[clck%elct]; |
|
| 1132 |
+ var numsec = num.slice(0,-1); |
|
| 1133 |
+ $('#numDisplay').val(numsec+dig);
|
|
| 1134 |
+ ctxSip.sipSendDTMF(dig); |
|
| 1135 |
+ |
|
| 1136 |
+ } else {
|
|
| 1137 |
+ event.preventDefault(); |
|
| 1138 |
+ var num = $('#numDisplay').val();
|
|
| 1139 |
+ var dig; |
|
| 1140 |
+ var diginit = $(this).data('digit').toString().split(',');
|
|
| 1141 |
+ |
|
| 1142 |
+ dig = diginit[0]; |
|
| 1143 |
+ clck = 0; |
|
| 1144 |
+ $('#numDisplay').val(num+dig);
|
|
| 1145 |
+ ctxSip.sipSendDTMF(dig); |
|
| 1146 |
+ } |
|
| 1147 |
+ |
|
| 1148 |
+ $("#deleteInput").css("display", "block");
|
|
| 1149 |
+ return false; |
|
| 1150 |
+ }); |
|
| 1151 |
+ |
|
| 1152 |
+ // Show the backspace icon |
|
| 1153 |
+ $("#numDisplay").on("focus", function() { $("#deleteInput").css("display", "block"); });
|
|
| 1154 |
+ |
|
| 1155 |
+ $("#deleteInput").click(function() {
|
|
| 1156 |
+ var entNmbr = $('#numDisplay').val().slice(0, -1);
|
|
| 1157 |
+ $('#numDisplay').val(entNmbr);
|
|
| 1158 |
+ }); |
|
| 1159 |
+ |
|
| 1160 |
+ // Hide the backspace icon |
|
| 1161 |
+ $("#sip-splash,#sip-log,#selectFromNmbr,#contactsTable").click(function() { $("#deleteInput").css("display", "none"); });
|
|
| 1162 |
+ |
|
| 1163 |
+ // Change keypad title |
|
| 1164 |
+ $("#dropDownButton").click(function() {
|
|
| 1165 |
+ $("#deleteInput").css("display", "none");
|
|
| 1166 |
+ if ($("#sip-dialpad").is(":visible")) { $("#dropDownButton").prop("title", "Show keypad"); } else { $("#dropDownButton").prop("title", "Hide keypad"); }
|
|
| 1167 |
+ }); |
|
| 1168 |
+ $("#sip-dialpad").click(function() { $("#dropDownButton").prop("title", "Show keypad"); });
|
|
| 1169 |
+ |
|
| 1170 |
+ $('#phoneUI .dropdown-menu').click(function(e) {
|
|
| 1171 |
+ e.preventDefault(); |
|
| 1172 |
+ }); |
|
| 1173 |
+ |
|
| 1174 |
+ $('#phoneUI').delegate('.btnCall', 'click', function(event) {
|
|
| 1175 |
+ ctxSip.phoneCallButtonPressed(); |
|
| 1176 |
+ // Close the dropdown |
|
| 1177 |
+ return true; |
|
| 1178 |
+ }); |
|
| 1179 |
+ |
|
| 1180 |
+ $('.sipLogClear').click(function(event) {
|
|
| 1181 |
+ event.preventDefault(); |
|
| 1182 |
+ ctxSip.logClear(); |
|
| 1183 |
+ showContactsNmbrs(); |
|
| 1184 |
+ }); |
|
| 1185 |
+ |
|
| 1186 |
+ $('#sip-logitems').delegate('.sip-logitem .btnCall', 'click', function(event) {
|
|
| 1187 |
+ var sessionid = $(this).closest('.sip-logitem').data('sessionid');
|
|
| 1188 |
+ ctxSip.phoneCallButtonPressed(sessionid); |
|
| 1189 |
+ return false; |
|
| 1190 |
+ }); |
|
| 1191 |
+ |
|
| 1192 |
+ $('#sip-logitems').delegate('.sip-logitem .btnHoldResume', 'click', function(event) {
|
|
| 1193 |
+ var sessionid = $(this).closest('.sip-logitem').data('sessionid');
|
|
| 1194 |
+ ctxSip.phoneHoldButtonPressed(sessionid); |
|
| 1195 |
+ return false; |
|
| 1196 |
+ }); |
|
| 1197 |
+ |
|
| 1198 |
+ $('#sip-logitems').delegate('.sip-logitem .btnHangUp', 'click', function(event) {
|
|
| 1199 |
+ var sessionid = $(this).closest('.sip-logitem').data('sessionid');
|
|
| 1200 |
+ ctxSip.sipHangUp(sessionid); |
|
| 1201 |
+ return false; |
|
| 1202 |
+ }); |
|
| 1203 |
+ |
|
| 1204 |
+ $('#sip-logitems').delegate('.sip-logitem .btnTransfer', 'click', function(event) {
|
|
| 1205 |
+ var sessionid = $(this).closest('.sip-logitem').data('sessionid');
|
|
| 1206 |
+ ctxSip.sipTransfer(sessionid); |
|
| 1207 |
+ return false; |
|
| 1208 |
+ }); |
|
| 1209 |
+ |
|
| 1210 |
+ $('#sip-logitems').delegate('.sip-logitem .btnMute', 'click', function(event) {
|
|
| 1211 |
+ var sessionid = $(this).closest('.sip-logitem').data('sessionid');
|
|
| 1212 |
+ ctxSip.phoneMuteButtonPressed(sessionid); |
|
| 1213 |
+ return false; |
|
| 1214 |
+ }); |
|
| 1215 |
+ |
|
| 1216 |
+ $('#sip-logitems').delegate('.sip-logitem .btnRecord', 'click', function(event) {
|
|
| 1217 |
+ ctxSip.phoneRecordButtonPressed(this.id); |
|
| 1218 |
+ return false; |
|
| 1219 |
+ }); |
|
| 1220 |
+ |
|
| 1221 |
+ $('#sip-logitems').delegate('.listPhNb', 'dblclick', function(event) {
|
|
| 1222 |
+ event.preventDefault(); |
|
| 1223 |
+ |
|
| 1224 |
+ var uricalled = $(this).data('uri');
|
|
| 1225 |
+ var uriproc = uricalled.split(":");
|
|
| 1226 |
+ var uripronb = uriproc[1].split("@");
|
|
| 1227 |
+ var uri = uripronb[0]; |
|
| 1228 |
+ $('#numDisplay').val(uri);
|
|
| 1229 |
+ ctxSip.phoneCallButtonPressed(); |
|
| 1230 |
+ }); |
|
| 1231 |
+ |
|
| 1232 |
+ $('#sldVolume').on('change', function() {
|
|
| 1233 |
+ |
|
| 1234 |
+ var v = $(this).val() / 100, |
|
| 1235 |
+ btn = $('#btnVol'),
|
|
| 1236 |
+ icon = $('#btnVol').find('i'),
|
|
| 1237 |
+ active = ctxSip.callActiveID; |
|
| 1238 |
+ |
|
| 1239 |
+ // Set the object and media stream volumes |
|
| 1240 |
+ if (ctxSip.Sessions[active]) {
|
|
| 1241 |
+ ctxSip.Sessions[active].player.volume = v; |
|
| 1242 |
+ ctxSip.callVolume = v; |
|
| 1243 |
+ } |
|
| 1244 |
+ |
|
| 1245 |
+ // Set the others |
|
| 1246 |
+ $('audio').each(function() {
|
|
| 1247 |
+ $(this).get()[0].volume = v; |
|
| 1248 |
+ }); |
|
| 1249 |
+ |
|
| 1250 |
+ if (v < 0.1) {
|
|
| 1251 |
+ btn.removeClass(function (index, css) {
|
|
| 1252 |
+ return (css.match (/(^|\s)btn\S+/g) || []).join(' ');
|
|
| 1253 |
+ }) |
|
| 1254 |
+ .addClass('btn btn-sm btn-danger');
|
|
| 1255 |
+ icon.removeClass().addClass('fa fa-fw fa-volume-off');
|
|
| 1256 |
+ } else if (v < 0.8) {
|
|
| 1257 |
+ btn.removeClass(function (index, css) {
|
|
| 1258 |
+ return (css.match (/(^|\s)btn\S+/g) || []).join(' ');
|
|
| 1259 |
+ }).addClass('btn btn-sm btn-info');
|
|
| 1260 |
+ icon.removeClass().addClass('fa fa-fw fa-volume-down');
|
|
| 1261 |
+ } else {
|
|
| 1262 |
+ btn.removeClass(function (index, css) {
|
|
| 1263 |
+ return (css.match (/(^|\s)btn\S+/g) || []).join(' ');
|
|
| 1264 |
+ }).addClass('btn btn-sm btn-primary');
|
|
| 1265 |
+ icon.removeClass().addClass('fa fa-fw fa-volume-up');
|
|
| 1266 |
+ } |
|
| 1267 |
+ return false; |
|
| 1268 |
+ }); |
|
| 1269 |
+ |
|
| 1270 |
+ // Hide the splash and show the call log after 1 second |
|
| 1271 |
+ setTimeout(function() {
|
|
| 1272 |
+ ctxSip.logShow(); |
|
| 1273 |
+ }, 1000); |
|
| 1274 |
+ |
|
| 1275 |
+ |
|
| 1276 |
+ /** |
|
| 1277 |
+ * Stopwatch object used for call timers |
|
| 1278 |
+ * |
|
| 1279 |
+ * @param {dom element} elem
|
|
| 1280 |
+ * @param {[object]} options
|
|
| 1281 |
+ */ |
|
| 1282 |
+ var Stopwatch = function(elem, options) {
|
|
| 1283 |
+ |
|
| 1284 |
+ // Private functions |
|
| 1285 |
+ function createTimer() {
|
|
| 1286 |
+ return document.createElement("span");
|
|
| 1287 |
+ } |
|
| 1288 |
+ |
|
| 1289 |
+ var timer = createTimer(), |
|
| 1290 |
+ offset, |
|
| 1291 |
+ clock, |
|
| 1292 |
+ interval; |
|
| 1293 |
+ |
|
| 1294 |
+ // Default options |
|
| 1295 |
+ options = options || {};
|
|
| 1296 |
+ options.delay = options.delay || 1000; |
|
| 1297 |
+ options.startTime = options.startTime || Date.now(); |
|
| 1298 |
+ |
|
| 1299 |
+ // Append elements |
|
| 1300 |
+ elem.appendChild(timer); |
|
| 1301 |
+ |
|
| 1302 |
+ function start() {
|
|
| 1303 |
+ if (!interval) {
|
|
| 1304 |
+ offset = options.startTime; |
|
| 1305 |
+ interval = setInterval(update, options.delay); |
|
| 1306 |
+ } |
|
| 1307 |
+ } |
|
| 1308 |
+ |
|
| 1309 |
+ function stop() {
|
|
| 1310 |
+ if (interval) {
|
|
| 1311 |
+ clearInterval(interval); |
|
| 1312 |
+ interval = null; |
|
| 1313 |
+ } |
|
| 1314 |
+ } |
|
| 1315 |
+ |
|
| 1316 |
+ function reset() {
|
|
| 1317 |
+ clock = 0; |
|
| 1318 |
+ render(); |
|
| 1319 |
+ } |
|
| 1320 |
+ |
|
| 1321 |
+ function update() {
|
|
| 1322 |
+ clock += delta(); |
|
| 1323 |
+ render(); |
|
| 1324 |
+ } |
|
| 1325 |
+ |
|
| 1326 |
+ function render() {
|
|
| 1327 |
+ timer.innerHTML = moment(clock).format('mm:ss');
|
|
| 1328 |
+ } |
|
| 1329 |
+ |
|
| 1330 |
+ function delta() {
|
|
| 1331 |
+ var now = Date.now(); |
|
| 1332 |
+ var d = now - offset; |
|
| 1333 |
+ |
|
| 1334 |
+ offset = now; |
|
| 1335 |
+ return d; |
|
| 1336 |
+ } |
|
| 1337 |
+ |
|
| 1338 |
+ // Initialize |
|
| 1339 |
+ reset(); |
|
| 1340 |
+ |
|
| 1341 |
+ // Public API |
|
| 1342 |
+ this.start = start; |
|
| 1343 |
+ this.stop = stop; |
|
| 1344 |
+ }; |
|
| 1345 |
+ |
|
| 1346 |
+ |
|
| 1347 |
+ function confirmAlert(alertText) {
|
|
| 1348 |
+ |
|
| 1349 |
+ $("#alertMsgOverlay").remove();
|
|
| 1350 |
+ $("#alertConfMessage").remove();
|
|
| 1351 |
+ |
|
| 1352 |
+ let alertwndcf = "<div id='alertConfMessage'>"; |
|
| 1353 |
+ alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>"; |
|
| 1354 |
+ alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>"; |
|
| 1355 |
+ alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Record without warning'>"; |
|
| 1356 |
+ alertwndcf += "<input type='submit' id='confirmOk' value='Record with warning'></div>"; |
|
| 1357 |
+ alertwndcf += "</div>"; |
|
| 1358 |
+ |
|
| 1359 |
+ $("#flContainer").append("<div id='alertMsgOverlay'></div>");
|
|
| 1360 |
+ $("#flContainer").append(alertwndcf);
|
|
| 1361 |
+ |
|
| 1362 |
+ let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px"; |
|
| 1363 |
+ let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px"; |
|
| 1364 |
+ $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
|
|
| 1365 |
+ |
|
| 1366 |
+ $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
|
|
| 1367 |
+ $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
|
|
| 1368 |
+ } |
|
| 1369 |
+ |
|
| 1370 |
+ $(window).on('beforeunload', function() {
|
|
| 1371 |
+ localStorage.removeItem('SIPCreds');
|
|
| 1372 |
+ localStorage.removeItem('NCContacts');
|
|
| 1373 |
+ }); |
|
| 1374 |
+}); |