diff --git a/.gitignore b/.gitignore
index b25c15b..11164a1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
*~
+freeswitch.serial
+
diff --git a/autoload_configs/.erlang.cookie b/autoload_configs/.erlang.cookie
deleted file mode 100644
index 890613d..0000000
--- a/autoload_configs/.erlang.cookie
+++ /dev/null
@@ -1 +0,0 @@
-change_me
diff --git a/autoload_configs/acl.conf.xml b/autoload_configs/acl.conf.xml
deleted file mode 100644
index 4bfedc6..0000000
--- a/autoload_configs/acl.conf.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/autoload_configs/cepstral.conf.xml b/autoload_configs/cepstral.conf.xml
new file mode 100644
index 0000000..cf4aa92
--- /dev/null
+++ b/autoload_configs/cepstral.conf.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autoload_configs/conference.conf.xml b/autoload_configs/conference.conf.xml
index e1dbace..c1831ae 100644
--- a/autoload_configs/conference.conf.xml
+++ b/autoload_configs/conference.conf.xml
@@ -30,89 +30,5 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/autoload_configs/erlang_event.conf.xml b/autoload_configs/erlang_event.conf.xml
deleted file mode 100644
index fb33720..0000000
--- a/autoload_configs/erlang_event.conf.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/autoload_configs/httapi.conf.xml b/autoload_configs/httapi.conf.xml
new file mode 100644
index 0000000..50bbe78
--- /dev/null
+++ b/autoload_configs/httapi.conf.xml
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autoload_configs/kazoo.conf.xml b/autoload_configs/kazoo.conf.xml
index 9293d4e..547e725 100644
--- a/autoload_configs/kazoo.conf.xml
+++ b/autoload_configs/kazoo.conf.xml
@@ -1,12 +1,12 @@
-
+
-
+
-
+
-
+
\ No newline at end of file
diff --git a/autoload_configs/local_stream.conf.xml b/autoload_configs/local_stream.conf.xml
index f0f289b..75dfb94 100644
--- a/autoload_configs/local_stream.conf.xml
+++ b/autoload_configs/local_stream.conf.xml
@@ -11,37 +11,4 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/autoload_configs/modules.conf.xml b/autoload_configs/modules.conf.xml
index edda1de..8dc91db 100644
--- a/autoload_configs/modules.conf.xml
+++ b/autoload_configs/modules.conf.xml
@@ -6,20 +6,16 @@
-
-
-
+
-
-
-
+
@@ -32,14 +28,14 @@
-
-
-
-
+
+
+
+
-
-
+
+
@@ -47,7 +43,6 @@
-
diff --git a/autoload_configs/spandsp.conf.xml b/autoload_configs/spandsp.conf.xml
index 94849ff..849d662 100644
--- a/autoload_configs/spandsp.conf.xml
+++ b/autoload_configs/spandsp.conf.xml
@@ -1,8 +1,8 @@
-
+
-
+
diff --git a/autoload_configs/switch.conf.xml b/autoload_configs/switch.conf.xml
index 595aa37..ed7710c 100644
--- a/autoload_configs/switch.conf.xml
+++ b/autoload_configs/switch.conf.xml
@@ -16,6 +16,8 @@
+
+
diff --git a/autoload_configs/xml_cdr.conf.xml b/autoload_configs/xml_cdr.conf.xml
deleted file mode 100644
index a6f7b55..0000000
--- a/autoload_configs/xml_cdr.conf.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/dialplan/empty.xml b/dialplan/empty.xml
deleted file mode 100644
index dd68d75..0000000
--- a/dialplan/empty.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/directory/empty.xml b/directory/empty.xml
deleted file mode 100644
index dd68d75..0000000
--- a/directory/empty.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/freeswitch.xml b/freeswitch.xml
index 483c9ab..59f8d7c 100644
--- a/freeswitch.xml
+++ b/freeswitch.xml
@@ -43,11 +43,9 @@
diff --git a/lang/de/de.xml b/lang/de/de.xml
index 5239489..a7dbab0 100644
--- a/lang/de/de.xml
+++ b/lang/de/de.xml
@@ -1,7 +1,22 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/lang/de/demo/demo.xml b/lang/de/demo/demo.xml
index 61582b2..fa77948 100644
--- a/lang/de/demo/demo.xml
+++ b/lang/de/demo/demo.xml
@@ -1,71 +1,82 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/de/vm/sounds.xml b/lang/de/vm/sounds.xml
new file mode 100644
index 0000000..657e611
--- /dev/null
+++ b/lang/de/vm/sounds.xml
@@ -0,0 +1,413 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/de/vm/tts.xml b/lang/de/vm/tts.xml
index 7a8f18c..f91cae1 100644
--- a/lang/de/vm/tts.xml
+++ b/lang/de/vm/tts.xml
@@ -1,8 +1,9 @@
-
+
+
-
+
@@ -10,7 +11,7 @@
-
+
@@ -18,7 +19,7 @@
-
+
@@ -26,7 +27,7 @@
-
+
@@ -34,7 +35,7 @@
-
+
@@ -42,7 +43,7 @@
-
+
@@ -50,12 +51,12 @@
-
+
-
+
@@ -63,27 +64,25 @@
-
+
-
-
+
-
-
+
@@ -91,8 +90,8 @@
-
+
@@ -100,8 +99,8 @@
-
+
@@ -109,8 +108,8 @@
-
+
@@ -118,7 +117,7 @@
-
+
@@ -126,7 +125,7 @@
-
+
@@ -134,7 +133,7 @@
-
+
@@ -142,7 +141,7 @@
-
+
@@ -150,7 +149,7 @@
-
+
@@ -158,7 +157,7 @@
-
+
@@ -166,7 +165,7 @@
-
+
@@ -174,7 +173,7 @@
-
+
@@ -182,7 +181,7 @@
-
+
@@ -190,7 +189,7 @@
-
+
@@ -198,7 +197,7 @@
-
+
@@ -206,9 +205,20 @@
-
+
-
+
+
diff --git a/lang/en/demo/demo-ivr.xml b/lang/en/demo/demo-ivr.xml
new file mode 100644
index 0000000..98f155a
--- /dev/null
+++ b/lang/en/demo/demo-ivr.xml
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/en/demo/demo.xml b/lang/en/demo/demo.xml
new file mode 100644
index 0000000..bcfe6a8
--- /dev/null
+++ b/lang/en/demo/demo.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/en/demo/funnies.xml b/lang/en/demo/funnies.xml
new file mode 100644
index 0000000..e901c5a
--- /dev/null
+++ b/lang/en/demo/funnies.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lang/en/demo/new-demo-ivr.xml b/lang/en/demo/new-demo-ivr.xml
new file mode 100644
index 0000000..619d992
--- /dev/null
+++ b/lang/en/demo/new-demo-ivr.xml
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/en/dir/sounds.xml b/lang/en/dir/sounds.xml
index 6c32066..b715a7f 100644
--- a/lang/en/dir/sounds.xml
+++ b/lang/en/dir/sounds.xml
@@ -1,121 +1,130 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/lang/en/dir/tts.xml b/lang/en/dir/tts.xml
index 67ae5ab..d5f112d 100644
--- a/lang/en/dir/tts.xml
+++ b/lang/en/dir/tts.xml
@@ -1,96 +1,106 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/lang/en/en.xml b/lang/en/en.xml
index eef246b..3d27bce 100644
--- a/lang/en/en.xml
+++ b/lang/en/en.xml
@@ -1,6 +1,25 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/en/ivr/sounds.xml b/lang/en/ivr/sounds.xml
new file mode 100644
index 0000000..0c4f0b9
--- /dev/null
+++ b/lang/en/ivr/sounds.xml
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/en/vm/sounds.xml b/lang/en/vm/sounds.xml
index 63c9cd7..fdef472 100644
--- a/lang/en/vm/sounds.xml
+++ b/lang/en/vm/sounds.xml
@@ -1,9 +1,10 @@
-
+
+
-
-
+
+
@@ -11,8 +12,8 @@
-
-
+
+
@@ -20,7 +21,23 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -28,7 +45,7 @@
-
+
@@ -36,7 +53,7 @@
-
+
@@ -44,7 +61,7 @@
-
+
@@ -52,18 +69,18 @@
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
@@ -71,18 +88,28 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -90,21 +117,34 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -112,7 +152,7 @@
-
+
@@ -120,15 +160,15 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
@@ -136,12 +176,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -149,12 +189,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -162,9 +202,9 @@
-
-
-
+
+
+
@@ -172,7 +212,7 @@
-
+
@@ -180,43 +220,43 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -224,7 +264,7 @@
-
+
@@ -232,7 +272,7 @@
-
+
@@ -240,7 +280,7 @@
-
+
@@ -248,7 +288,7 @@
-
+
@@ -256,9 +296,9 @@
-
-
-
+
+
+
@@ -266,9 +306,9 @@
-
-
-
+
+
+
@@ -276,7 +316,7 @@
-
+
@@ -284,17 +324,25 @@
-
-
-
+
+
+
+
+
+
+
+
-
+
+
+
+
@@ -302,39 +350,39 @@
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
@@ -342,16 +390,16 @@
-
+
-
-
-
+
+
+
@@ -378,4 +426,16 @@
-
+
+
+
diff --git a/lang/en/vm/tts.xml b/lang/en/vm/tts.xml
index 1fc877d..2de4b37 100644
--- a/lang/en/vm/tts.xml
+++ b/lang/en/vm/tts.xml
@@ -1,8 +1,9 @@
-
+
+
-
+
@@ -10,7 +11,7 @@
-
+
@@ -18,7 +19,7 @@
-
+
@@ -26,7 +27,7 @@
-
+
@@ -34,7 +35,7 @@
-
+
@@ -42,7 +43,7 @@
-
+
@@ -50,12 +51,12 @@
-
+
-
+
@@ -63,27 +64,25 @@
-
+
-
-
+
-
-
+
@@ -92,8 +91,8 @@
-
+
@@ -101,8 +100,8 @@
-
+
@@ -110,7 +109,7 @@
-
+
@@ -118,7 +117,7 @@
-
+
@@ -126,7 +125,7 @@
-
+
@@ -134,8 +133,8 @@
-
+
@@ -143,7 +142,7 @@
-
+
@@ -151,7 +150,7 @@
-
+
@@ -159,7 +158,7 @@
-
+
@@ -167,7 +166,7 @@
-
+
@@ -175,7 +174,7 @@
-
+
@@ -183,7 +182,7 @@
-
+
@@ -191,7 +190,7 @@
-
+
@@ -199,7 +198,7 @@
-
+
@@ -207,7 +206,7 @@
-
+
@@ -215,7 +214,7 @@
-
+
@@ -223,7 +222,7 @@
-
+
@@ -231,9 +230,20 @@
-
+
-
+
+
diff --git a/lang/en/vm/voicemail_ivr.xml b/lang/en/vm/voicemail_ivr.xml
new file mode 100644
index 0000000..1c48299
--- /dev/null
+++ b/lang/en/vm/voicemail_ivr.xml
@@ -0,0 +1,417 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/demo/demo-es-ES.xml b/lang/es/demo/demo-es-ES.xml
new file mode 100644
index 0000000..4c6919d
--- /dev/null
+++ b/lang/es/demo/demo-es-ES.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/demo/demo-es-MX.xml b/lang/es/demo/demo-es-MX.xml
new file mode 100644
index 0000000..4c6919d
--- /dev/null
+++ b/lang/es/demo/demo-es-MX.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/demo/demo-ivr-es-ES.xml b/lang/es/demo/demo-ivr-es-ES.xml
new file mode 100644
index 0000000..ec7d7bc
--- /dev/null
+++ b/lang/es/demo/demo-ivr-es-ES.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/demo/demo-ivr-es-MX.xml b/lang/es/demo/demo-ivr-es-MX.xml
new file mode 100644
index 0000000..ec7d7bc
--- /dev/null
+++ b/lang/es/demo/demo-ivr-es-MX.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/dir/sounds-es-ES.xml b/lang/es/dir/sounds-es-ES.xml
new file mode 100644
index 0000000..2bdc149
--- /dev/null
+++ b/lang/es/dir/sounds-es-ES.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/dir/sounds-es-MX.xml b/lang/es/dir/sounds-es-MX.xml
new file mode 100644
index 0000000..2bdc149
--- /dev/null
+++ b/lang/es/dir/sounds-es-MX.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/dir/tts-es-ES.xml b/lang/es/dir/tts-es-ES.xml
new file mode 100644
index 0000000..fbdeca7
--- /dev/null
+++ b/lang/es/dir/tts-es-ES.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/dir/tts-es-MX.xml b/lang/es/dir/tts-es-MX.xml
new file mode 100644
index 0000000..ddf15d0
--- /dev/null
+++ b/lang/es/dir/tts-es-MX.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/es_ES.xml b/lang/es/es_ES.xml
new file mode 100644
index 0000000..f8de685
--- /dev/null
+++ b/lang/es/es_ES.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/lang/es/es_MX.xml b/lang/es/es_MX.xml
new file mode 100644
index 0000000..936abcf
--- /dev/null
+++ b/lang/es/es_MX.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/lang/es/vm/sounds-es-ES.xml b/lang/es/vm/sounds-es-ES.xml
new file mode 100644
index 0000000..dcc9d9f
--- /dev/null
+++ b/lang/es/vm/sounds-es-ES.xml
@@ -0,0 +1,404 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/vm/sounds-es-MX.xml b/lang/es/vm/sounds-es-MX.xml
new file mode 100644
index 0000000..1f22c43
--- /dev/null
+++ b/lang/es/vm/sounds-es-MX.xml
@@ -0,0 +1,404 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/vm/tts-es-ES.xml b/lang/es/vm/tts-es-ES.xml
new file mode 100644
index 0000000..6dab48c
--- /dev/null
+++ b/lang/es/vm/tts-es-ES.xml
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/es/vm/tts-es-MX.xml b/lang/es/vm/tts-es-MX.xml
new file mode 100644
index 0000000..ce5722e
--- /dev/null
+++ b/lang/es/vm/tts-es-MX.xml
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/fr/demo/demo.xml b/lang/fr/demo/demo.xml
index 8066020..0d0de59 100644
--- a/lang/fr/demo/demo.xml
+++ b/lang/fr/demo/demo.xml
@@ -1,18 +1,29 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/fr/dir/sounds.xml b/lang/fr/dir/sounds.xml
index 02d6b36..a0dcb2c 100644
--- a/lang/fr/dir/sounds.xml
+++ b/lang/fr/dir/sounds.xml
@@ -1,121 +1,130 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/lang/fr/dir/tts.xml b/lang/fr/dir/tts.xml
index 1f5b0ca..7d3e5e3 100644
--- a/lang/fr/dir/tts.xml
+++ b/lang/fr/dir/tts.xml
@@ -1,101 +1,110 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/lang/fr/fr.xml b/lang/fr/fr.xml
index 12bec06..124ca02 100644
--- a/lang/fr/fr.xml
+++ b/lang/fr/fr.xml
@@ -1,8 +1,23 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/fr/vm/sounds.xml b/lang/fr/vm/sounds.xml
index 55190a6..9cd209e 100644
--- a/lang/fr/vm/sounds.xml
+++ b/lang/fr/vm/sounds.xml
@@ -1,9 +1,9 @@
-
-
+
+
-
+
@@ -11,7 +11,7 @@
-
+
@@ -19,7 +19,7 @@
-
+
@@ -27,7 +27,7 @@
-
+
@@ -35,7 +35,7 @@
-
+
@@ -43,7 +43,7 @@
-
+
@@ -51,17 +51,17 @@
-
+
-
+
-
+
@@ -69,27 +69,25 @@
-
+
-
-
+
-
-
+
@@ -98,8 +96,8 @@
-
+
@@ -107,8 +105,8 @@
-
+
@@ -116,8 +114,8 @@
-
+
@@ -125,7 +123,7 @@
-
+
@@ -133,7 +131,7 @@
-
+
@@ -141,7 +139,7 @@
-
+
@@ -149,7 +147,7 @@
-
+
@@ -157,7 +155,7 @@
-
+
@@ -165,7 +163,7 @@
-
+
@@ -173,7 +171,7 @@
-
+
@@ -181,12 +179,12 @@
-
+
-
+
@@ -194,7 +192,7 @@
-
+
@@ -202,7 +200,7 @@
-
+
@@ -210,27 +208,27 @@
-
+
-
+
-
+
-
+
-
+
@@ -238,9 +236,20 @@
-
+
-
\ No newline at end of file
+
+
diff --git a/lang/he/demo/demo-ivr.xml b/lang/he/demo/demo-ivr.xml
new file mode 100644
index 0000000..df8d24b
--- /dev/null
+++ b/lang/he/demo/demo-ivr.xml
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/he/demo/demo.xml b/lang/he/demo/demo.xml
new file mode 100644
index 0000000..bcfe6a8
--- /dev/null
+++ b/lang/he/demo/demo.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/he/dir/sounds.xml b/lang/he/dir/sounds.xml
new file mode 100644
index 0000000..5fd13ff
--- /dev/null
+++ b/lang/he/dir/sounds.xml
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/he/he.xml b/lang/he/he.xml
new file mode 100644
index 0000000..7cca73c
--- /dev/null
+++ b/lang/he/he.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/he/vm/sounds.xml b/lang/he/vm/sounds.xml
new file mode 100644
index 0000000..917c84b
--- /dev/null
+++ b/lang/he/vm/sounds.xml
@@ -0,0 +1,417 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/demo/demo-ivr-pt-BR.xml b/lang/pt/demo/demo-ivr-pt-BR.xml
new file mode 100644
index 0000000..ec7d7bc
--- /dev/null
+++ b/lang/pt/demo/demo-ivr-pt-BR.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/demo/demo-ivr-pt-PT.xml b/lang/pt/demo/demo-ivr-pt-PT.xml
new file mode 100644
index 0000000..ec7d7bc
--- /dev/null
+++ b/lang/pt/demo/demo-ivr-pt-PT.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/demo/demo-pt-BR.xml b/lang/pt/demo/demo-pt-BR.xml
new file mode 100644
index 0000000..846561a
--- /dev/null
+++ b/lang/pt/demo/demo-pt-BR.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/demo/demo-pt-PT.xml b/lang/pt/demo/demo-pt-PT.xml
new file mode 100644
index 0000000..34464f7
--- /dev/null
+++ b/lang/pt/demo/demo-pt-PT.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/dir/sounds-pt-BR.xml b/lang/pt/dir/sounds-pt-BR.xml
new file mode 100644
index 0000000..2bdc149
--- /dev/null
+++ b/lang/pt/dir/sounds-pt-BR.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/dir/sounds-pt-PT.xml b/lang/pt/dir/sounds-pt-PT.xml
new file mode 100644
index 0000000..2bdc149
--- /dev/null
+++ b/lang/pt/dir/sounds-pt-PT.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/dir/tts-pt-BR.xml b/lang/pt/dir/tts-pt-BR.xml
new file mode 100644
index 0000000..71b79c6
--- /dev/null
+++ b/lang/pt/dir/tts-pt-BR.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/dir/tts-pt-PT.xml b/lang/pt/dir/tts-pt-PT.xml
new file mode 100644
index 0000000..4f03c5a
--- /dev/null
+++ b/lang/pt/dir/tts-pt-PT.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/pt_BR.xml b/lang/pt/pt_BR.xml
new file mode 100644
index 0000000..690ee69
--- /dev/null
+++ b/lang/pt/pt_BR.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/lang/pt/pt_PT.xml b/lang/pt/pt_PT.xml
new file mode 100644
index 0000000..c30b361
--- /dev/null
+++ b/lang/pt/pt_PT.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/lang/pt/vm/sounds-pt-BR.xml b/lang/pt/vm/sounds-pt-BR.xml
new file mode 100644
index 0000000..1ab472a
--- /dev/null
+++ b/lang/pt/vm/sounds-pt-BR.xml
@@ -0,0 +1,404 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/vm/sounds-pt-PT.xml b/lang/pt/vm/sounds-pt-PT.xml
new file mode 100644
index 0000000..587d3fe
--- /dev/null
+++ b/lang/pt/vm/sounds-pt-PT.xml
@@ -0,0 +1,404 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/vm/tts-pt-BR.xml b/lang/pt/vm/tts-pt-BR.xml
new file mode 100644
index 0000000..4f77045
--- /dev/null
+++ b/lang/pt/vm/tts-pt-BR.xml
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/pt/vm/tts-pt-PT.xml b/lang/pt/vm/tts-pt-PT.xml
new file mode 100644
index 0000000..c3dfc3a
--- /dev/null
+++ b/lang/pt/vm/tts-pt-PT.xml
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/ru/demo/demo-ivr.xml b/lang/ru/demo/demo-ivr.xml
index 8c6f3f8..7de0d7f 100644
--- a/lang/ru/demo/demo-ivr.xml
+++ b/lang/ru/demo/demo-ivr.xml
@@ -1,6 +1,4 @@
-
-
-
+
@@ -66,7 +64,7 @@
-
+
@@ -129,7 +127,7 @@
-
+
@@ -142,4 +140,15 @@
-
+
+
diff --git a/lang/ru/demo/demo.xml b/lang/ru/demo/demo.xml
index 7e450fb..10c9dbc 100644
--- a/lang/ru/demo/demo.xml
+++ b/lang/ru/demo/demo.xml
@@ -1,100 +1,109 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/ru/dir/sounds.xml b/lang/ru/dir/sounds.xml
index 02d6b36..a0dcb2c 100644
--- a/lang/ru/dir/sounds.xml
+++ b/lang/ru/dir/sounds.xml
@@ -1,121 +1,130 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/lang/ru/dir/tts.xml b/lang/ru/dir/tts.xml
index 67ae5ab..f0aafa2 100644
--- a/lang/ru/dir/tts.xml
+++ b/lang/ru/dir/tts.xml
@@ -1,96 +1,105 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/lang/ru/ru.xml b/lang/ru/ru.xml
index 25d63b6..5f52e76 100644
--- a/lang/ru/ru.xml
+++ b/lang/ru/ru.xml
@@ -1,9 +1,23 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/lang/ru/vm/sounds.xml b/lang/ru/vm/sounds.xml
index ffd9ec5..2ee9e6e 100644
--- a/lang/ru/vm/sounds.xml
+++ b/lang/ru/vm/sounds.xml
@@ -1,10 +1,10 @@
-
-
+
+
-
-
+
+
@@ -12,8 +12,8 @@
-
-
+
+
@@ -21,7 +21,7 @@
-
+
@@ -29,7 +29,7 @@
-
+
@@ -37,7 +37,7 @@
-
+
@@ -45,7 +45,7 @@
-
+
@@ -53,30 +53,30 @@
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
@@ -84,50 +84,48 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
@@ -135,15 +133,15 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
@@ -151,12 +149,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -164,12 +162,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -177,9 +175,9 @@
-
-
-
+
+
+
@@ -187,7 +185,7 @@
-
+
@@ -239,7 +237,7 @@
-
+
@@ -247,7 +245,7 @@
-
+
@@ -255,7 +253,7 @@
-
+
@@ -263,7 +261,7 @@
-
+
@@ -271,9 +269,9 @@
-
-
-
+
+
+
@@ -281,9 +279,9 @@
-
-
-
+
+
+
@@ -291,7 +289,7 @@
-
+
@@ -299,9 +297,9 @@
-
-
-
+
+
+
@@ -309,7 +307,7 @@
-
+
@@ -317,39 +315,39 @@
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
@@ -357,9 +355,20 @@
-
+
-
+
+
diff --git a/lang/ru/vm/tts.xml b/lang/ru/vm/tts.xml
index 1fc877d..2de4b37 100644
--- a/lang/ru/vm/tts.xml
+++ b/lang/ru/vm/tts.xml
@@ -1,8 +1,9 @@
-
+
+
-
+
@@ -10,7 +11,7 @@
-
+
@@ -18,7 +19,7 @@
-
+
@@ -26,7 +27,7 @@
-
+
@@ -34,7 +35,7 @@
-
+
@@ -42,7 +43,7 @@
-
+
@@ -50,12 +51,12 @@
-
+
-
+
@@ -63,27 +64,25 @@
-
+
-
-
+
-
-
+
@@ -92,8 +91,8 @@
-
+
@@ -101,8 +100,8 @@
-
+
@@ -110,7 +109,7 @@
-
+
@@ -118,7 +117,7 @@
-
+
@@ -126,7 +125,7 @@
-
+
@@ -134,8 +133,8 @@
-
+
@@ -143,7 +142,7 @@
-
+
@@ -151,7 +150,7 @@
-
+
@@ -159,7 +158,7 @@
-
+
@@ -167,7 +166,7 @@
-
+
@@ -175,7 +174,7 @@
-
+
@@ -183,7 +182,7 @@
-
+
@@ -191,7 +190,7 @@
-
+
@@ -199,7 +198,7 @@
-
+
@@ -207,7 +206,7 @@
-
+
@@ -215,7 +214,7 @@
-
+
@@ -223,7 +222,7 @@
-
+
@@ -231,9 +230,20 @@
-
+
-
+
+
diff --git a/opensips/dispatcher.sh b/opensips/dispatcher.sh
deleted file mode 100755
index 50ae2ee..0000000
--- a/opensips/dispatcher.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/bash
-DISPATCHER_FILE="/usr/local/etc/opensips/dispatcher.list"
-OSIP_CTL="/usr/local/etc/opensips/opensipsctl"
-
-fUsage () {
- echo "Usage: $0 [-r reload] [-f flush] [Media Server IP] [-a active] [-i inactive] [-p probing]"
- exit 1
-}
-
-cd `dirname $0`
-
-[[ ! $1 == -* ]] && server=$1 && shift
-
-while [ -n "$*" ]; do
- case "x$1" in
- x-a)
- action="a"
- ;;
- x-i)
- action="i"
- ;;
- x-p)
- action="p"
- ;;
- x-r)
- action="r"
- ;;
- x-f)
- action="f"
- ;;
- x--help)
- fUsage
- ;;
- *)
- fUsage
- ;;
- esac
- shift
-done
-
-if [ -z $action ]; then
- echo "# $OSIP_CTL fifo ds_list"
- $OSIP_CTL fifo ds_list
- exit 0
-elif [ $action == "r" ]; then
- echo "# $OSIP_CTL fifo ds_reload"
- $OSIP_CTL fifo ds_reload
- exit 0
-elif grep -q $server $DISPATCHER_FILE; then
- echo "# $OSIP_CTL fifo ds_set_state $action `grep $server $DISPATCHER_FILE | cut -d' ' -f 1` `grep $server $DISPATCHER_FILE | cut -d' ' -f 2`"
- $OSIP_CTL fifo ds_set_state $action `grep $server $DISPATCHER_FILE | cut -d' ' -f 1` `grep $server $DISPATCHER_FILE | cut -d' ' -f 2`
- exit 0
-else
- echo "ERROR: Could not locate $server in $DISPATCHER_FILE"
- exit 1
-fi
diff --git a/opensips/opensips.tmp b/opensips/opensips.tmp
deleted file mode 100644
index f10c697..0000000
--- a/opensips/opensips.tmp
+++ /dev/null
@@ -1,1057 +0,0 @@
-## TEMPLATE RENDER CMD: sed "s|{{SIP_IP}}|184.106.171.135|g;s|{{SIP_PORT}}|5060|g;s|{{SIP_TLS_PORT}}|5061|g" opensips.tmp > opensips.cfg
-######################################################################
-## Core Parameters
-######################################################################
-# chroot=
-# group="opensips"
-# user="opensips"
-# dbversion_table=
-disable_core_dump=no
-max_while_loops=100
-maxbuffer=262144
-memdump=3
-memlog=2
-# open_files_limit=2048
-server_signature=no
-server_header="Server: 2600hz"
-user_agent_header="User-Agent: 2600hz"
-
-######################################################################
-## Core Fork Parameters
-######################################################################
-fork=yes
-children=8
-tcp_children=8
-
-######################################################################
-## Core Logging Parameters
-######################################################################
-debug=3
-sip_warning=0
-log_stderror=no
-log_facility=LOG_LOCAL0
-log_name="opensips"
-
-######################################################################
-## Aliases
-######################################################################
-auto_aliases=yes
-alias=localhost
-alias=localhost.localdomain
-
-######################################################################
-## Connectivity
-######################################################################
-listen=udp:eth0:{{SIP_PORT}}
-listen=udp:eth0:7000
-listen=tcp:eth0:{{SIP_PORT}}
-listen=tcp:eth0:7000
-tos=IPTOS_LOWDELAY
-# advertised_address={{SIP_IP}}
-# advertised_port={{SIP_PORT}}
-mcast_loopback=no
-mcast_ttl=1
-mhomed=0
-tcp_accept_aliases=yes
-tcp_connect_timeout=3
-tcp_connection_lifetime=120
-tcp_max_connections=2048
-# tcp_poll_method=select
-
-######################################################################
-## DNS
-######################################################################
-dns=no
-dns_retr_time=1
-dns_retr_no=3
-# dns_servers_no=2
-dns_try_ipv6=no
-disable_dns_blacklist=yes
-disable_dns_failover=no
-dns_use_search_list=no
-rev_dns=no
-
-######################################################################
-## SIP
-######################################################################
-check_via=0
-#! disable_503_translation=no
-disable_stateless_fwd=no
-disable_tcp=no
-# disable_tls=no
-#! reply_to_via=1
-
-######################################################################
-## TLS
-######################################################################
-# disable_tls=no
-# listen=tls:{{SIP_IP}}:{{SIP_TLS_PORT}}
-# tls_verify_server=1
-# tls_verify_client=1
-# tls_require_client_certificate=0
-# tls_method=TLSv1
-# tls_certificate="/usr/local/etc/opensips/tls/user/user-cert.pem"
-# tls_private_key="/usr/local/etc/opensips/tls/user/user-privkey.pem"
-# tls_ca_list="/usr/local/etc/opensips/tls/user/user-calist.pem"
-
-######################################################################
-## Destination Blacklist
-######################################################################
-# dst_blacklist=gw:{( tcp , 192.168.2.100 , 5060 , "" ),( any , 192.168.2.101 , 0 , "" )}
-# dst_blacklist=net_filter2:{ !( any , 192.168.30.0/255.255.255.0 , 0 , "" )}
-
-######################################################################
-## Attribute Value Pairs
-######################################################################
-# avp_aliases="uuid=I:660;email=s:email_addr;fwd=i:753"
-
-######################################################################
-## Module Loading
-######################################################################
-mpath="/usr/lib64/opensips/modules/"
-loadmodule "localcache.so"
-loadmodule "signaling.so"
-loadmodule "sl.so"
-loadmodule "tm.so"
-loadmodule "dialog.so"
-loadmodule "maxfwd.so"
-loadmodule "rr.so"
-loadmodule "path.so"
-loadmodule "uri.so"
-loadmodule "textops.so"
-loadmodule "usrloc.so"
-loadmodule "nathelper.so"
-loadmodule "nat_traversal.so"
-loadmodule "uac_redirect.so"
-loadmodule "dispatcher.so"
-loadmodule "mi_fifo.so"
-# loadmodule "mi_datagram.so"
-# loadmodule "xlog.so"
-
-######################################################################
-## Localcache Module Parameters
-######################################################################
-modparam("localcache", "cache_table_size", 10)
-modparam("localcache", "cache_clean_period", 120)
-
-######################################################################
-## Stateless UA Module Parameters
-######################################################################
-modparam("sl", "enable_stats", 1)
-
-######################################################################
-## SIP Transaction UA Module Parameters
-######################################################################
-modparam("tm", "fr_timer", 3)
-modparam("tm", "fr_inv_timer", 120)
-# modparam("tm", "wt_timer", 5)
-# modparam("tm", "delete_timer", 2)
-# modparam("tm", "T1_timer", 500)
-# modparam("tm", "T2_timer", 4000)
-# modparam("tm", "ruri_matching", 1)
-# modparam("tm", "via1_matching", 1)
-# modparam("tm", "unix_tx_timeout", 2)
-# modparam("tm", "restart_fr_on_each_reply", 1)
-modparam("tm", "fr_timer_avp", "$avp(s:final_reply_timer)")
-# modparam("tm", "fr_inv_timer_avp", "$avp(s:final_reply_prov)")
-# modparam("tm", "tw_append",
-# "test: ua=$hdr(User-Agent) ;avp=$avp(i:10);$rb;time=$Ts")
-modparam("tm", "pass_provisional_replies", 1)
-# modparam("tm", "syn_branch", 1)
-# modparam("tm", "onreply_avp_mode", 0)
-# modparam("tm", "disable_6xx_block", 0)
-# modparam("tm", "enable_stats", 1)
-# modparam("tm", "minor_branch_flag", 3)
-
-######################################################################
-## Max Forward Module Parameters
-######################################################################
-modparam("maxfwd", "max_limit", 30)
-
-######################################################################
-## Record Route Module Parameters
-######################################################################
-modparam("rr", "enable_full_lr", 1)
-modparam("rr", "append_fromtag", 1)
-modparam("rr", "enable_double_rr", 0)
-modparam("rr", "add_username", 0)
-
-######################################################################
-## Path Module Parameters
-######################################################################
-modparam("path", "use_received", 1)
-
-######################################################################
-## URI Module Parameters
-######################################################################
-# modparam("uri", "aaa_url", "radius:/etc/radiusclient-ng/radiusclient.conf")
-modparam("uri", "use_sip_uri_host", 0)
-modparam("uri", "use_uri_table", 0)
-modparam("uri", "service_type", 10)
-modparam("uri", "use_domain", 1)
-modparam("uri", "use_uri_table", 0)
-# modparam("uri", "db_url", "mysql://username:password@localhost/opensips")
-# modparam("uri", "db_table", "uri")
-# modparam("uri", "user_column", "username")
-# modparam("uri", "domain_column", "domain")
-# modparam("uri", "uriuser_column", "uri_user")
-
-######################################################################
-## User Location Module Parameters
-######################################################################
-modparam("usrloc", "nat_bflag", 6)
-modparam("usrloc", "use_domain", 1)
-modparam("usrloc", "desc_time_order", 0)
-modparam("usrloc", "timer_interval", 60)
-modparam("usrloc", "matching_mode", 0)
-modparam("usrloc", "cseq_delay", 20)
-modparam("usrloc", "hash_size", 9)
-modparam("usrloc", "db_mode", 0)
-# modparam("usrloc", "db_url", "dbdriver://username:password@dbhost/dbname")
-modparam("usrloc", "fetch_rows", 2000)
-modparam("usrloc", "user_column", "username")
-modparam("usrloc", "domain_column", "domain")
-modparam("usrloc", "contact_column", "contact")
-modparam("usrloc", "expires_column", "expires")
-modparam("usrloc", "q_column", "q")
-modparam("usrloc", "callid_column", "callid")
-modparam("usrloc", "cseq_column", "cseq")
-modparam("usrloc", "methods_column", "methods")
-modparam("usrloc", "flags_column", "flags")
-modparam("usrloc", "cflags_column", "cflags")
-modparam("usrloc", "user_agent_column", "user_agent")
-modparam("usrloc", "received_column", "received")
-modparam("usrloc", "socket_column", "socket")
-modparam("usrloc", "path_column", "path")
-
-######################################################################
-## Nathelper Module Parameters
-######################################################################
-# modparam("nathelper", "rtpproxy_sock", "udp:127.0.0.1:7890")
-# modparam("nathelper", "natping_interval", 30)
-# modparam("nathelper", "ping_nated_only", 1)
-# modparam("nathelper", "natping_processes", 3)
-# modparam("nathelper", "sipping_bflag", 7)
-# modparam("nathelper", "sipping_from", "sip:sipcheck@{{SIP_IP}}:{{SIP_PORT}}")
-# modparam("nathelper", "sipping_method", "INFO")
-
-######################################################################
-## NAT Traversal Module Parameters
-######################################################################
-modparam("nat_traversal", "keepalive_interval", 60)
-modparam("nat_traversal", "keepalive_method", "OPTIONS")
-modparam("nat_traversal", "keepalive_from", "sip:keepalive@{{SIP_IP}}:{{SIP_PORT}}")
-modparam("nat_traversal", "keepalive_state_file", "/tmp/opensips_keepalive_state")
-
-######################################################################
-## UAC Redirect Module Parameters
-######################################################################
-modparam("uac_redirect", "default_filter", "accept")
-# modparam("uac_redirect", "deny_filter", NULL)
-# modparam("uac_redirect", "accept_filter", NULL)
-# modparam("uac_redirect", "acc_function", "acc_log_request")
-# modparam("uac_redirect", "acc_db_table", "acc")
-
-######################################################################
-## Dispatcher Module Parameters
-######################################################################
-modparam("dispatcher", "list_file", "/etc/opensips/dispatcher.list")
-modparam("dispatcher", "flags", 2)
-modparam("dispatcher", "use_default", 0)
-modparam("dispatcher", "force_dst", 1)
-modparam("dispatcher", "dst_avp", "$avp(i:271)")
-modparam("dispatcher", "attrs_avp", "$avp(i:272)")
-modparam("dispatcher", "grp_avp", "$avp(i:273)")
-modparam("dispatcher", "cnt_avp", "$avp(i:274)")
-modparam("dispatcher", "hash_pvar", "$avp(i:273)")
-# modparam("dispatcher", "setid_pvar", "$var(setid)")
-modparam("dispatcher", "ds_ping_method", "OPTIONS")
-modparam("dispatcher", "ds_ping_from", "sip:sipcheck@{{SIP_IP}}:{{SIP_PORT}}")
-modparam("dispatcher", "ds_ping_interval", 10)
-# modparam("dispatcher", "ds_ping_sock", "udp:{{SIP_IP}}:{{SIP_PORT}}")
-modparam("dispatcher", "ds_probing_threshhold", 3)
-modparam("dispatcher", "ds_probing_mode", 1)
-modparam("dispatcher", "options_reply_codes", "501,403,404,400,200")
-
-######################################################################
-## MI-FIFO Module Parameters
-######################################################################
-modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
-
-######################################################################
-## MI-Datagram Module Parameters
-######################################################################
-# modparam("mi_datagram", "socket_name", "udp:127.0.0.1:8889")
-# modparam("mi_datagram", "children_count", 1)
-# modparam("mi_datagram", "unix_socket_mode", 0600)
-# modparam("mi_datagram", "unix_socket_group", "root")
-# modparam("mi_datagram", "unix_socket_user", "root")
-# modparam("mi_datagram", "socket_timeout", 2000)
-# modparam("mi_datagram", "reply_indent", "\t")
-
-######################################################################
-## XLog Module Parameters
-######################################################################
-# modparam("xlog", "buf_size", 4096)
-# modparam("xlog", "force_color", 0)
-
-######################################################################
-## Multiple Module Parameters
-######################################################################
-######################################################################
-## Main Request Routing
-######################################################################
-route
-{
- # log the basic info regarding this call
- xlog("L_INFO", "$ci|start|recieved $oP request $rm $ou");
- xlog("L_INFO", "$ci|log|source $si:$sp");
- xlog("L_INFO", "$ci|log|from $fu");
- xlog("L_INFO", "$ci|log|to $tu");
-
- replace("PolycomSoundPointIP[^\s]*", "PolySPIP");
- replace("PolycomVVX[^\s]*", "PolyVVX");
-
- # check that hop cound for this request and make sure it is under 10
- # to prevent endless loops
- if (!mf_process_maxfwd_header("10"))
- {
- xlog("L_WARN", "$ci|end|to many hops");
-
- sl_send_reply("483", "We refuse to process your infinite loop.");
-
- exit;
- }
-
- # this check detemines if the opensips has routed the request to itself,
- # this happens because the server is the destination of the request but
- # we mangle it to send it else where. When that mangeling fails and we
- # still relay it then it just comes right back to us...
- if (src_ip==myself)
- {
- xlog("L_WARN", "$ci|end|sourced from this server");
-
- exit;
- }
-
- # if the source IP/port are in one of the server dispatch lists
- # then this request originated from one of our media servers, mark it
- # as such by setting flag 26
- if (ds_is_in_list("$si", "", "1") || ds_is_in_list("$si", "", "3"))
- {
- xlog("L_INFO", "$ci|log|originated from internal sources");
-
- # Flag 26 marks the source as a on-net server
- setflag(26);
-
- setbflag(26);
- }
- # if the request source IP/port was not in any dispatcher lists
- # this this originated outside our equipment (carrier, client, ect)
- else
- {
- xlog("L_INFO", "$ci|log|originated from external sources");
- }
-
- # we must forward SIP OPTIONS pings from FreeSWITCH to registered devices to keep NAT
- # pinholes open. Someday we need to move this somewhere more reliable but this will
- # do for now.
- if (is_method("OPTIONS"))
- {
- if (isflagset(26))
- {
- xlog("L_INFO", "$ci|log|forwarding OPTIONS ping to endpoint");
-
- route(internal_to_external_relay);
- } else {
- # this request came from an external device to us. Reject it
- xlog("L_NOTICE", "$ci|end|unsupported method");
-
- sl_send_reply("503", "Rawr!!");
-
- }
-
- exit;
- }
-
- # if the to header has a tag attached then it implies this request
- # has been processed by us before (IE: a media server has added
- # its tag on the to header in prior messages)
- if (has_totag())
- {
- # sequential request within a dialog should
- # take the path determined by record-routing
- if (loose_route())
- {
- append_hf("P-hint: rr-enforced\r\n");
-
- # if we have locked this call to a media server then
- # maintain that association
- if (cache_fetch("local", "$ci", $avp(i:55)))
- {
- if (is_method("BYE"))
- {
- # remove the association between the call-id and the media server (if one)
- # but leave the contact user and server to support transfers
- cache_remove("local", "$ci");
-
- xlog("L_INFO", "$ci|log|cleaned up call id from cache");
- }
- else if (isflagset(26) && is_method("INVITE"))
- {
- cache_store("local", "$tU", "$avp(i:55)", 3600);
-
- xlog("L_INFO", "$ci|log|maintaining associated $tU with media server $avp(i:55)");
- }
- else if ($ct.fields(uri) && is_method("INVITE"))
- {
- cache_store("local", "$(ct.fields(uri){uri.user})", "$avp(i:55)", 3600);
-
- xlog("L_INFO", "$ci|log|maintaining associated $(ct.fields(uri){uri.user}) with media server $avp(i:55)");
- }
-
- cache_store("local", "$ci", "$avp(i:55)", 3600);
- }
-
- xlog("L_INFO", "$ci|log|forwarding based on the route set");
-
- if (isflagset(26))
- {
- route(internal_to_external_relay);
- }
- else
- {
- route(external_to_internal_relay);
- }
-
- exit();
- }
- else if ( is_method("ACK") )
- {
- if ( t_check_trans() )
- {
- # non loose-route, but stateful ACK; must be an ACK after
- # a 487 or e.g. 404 from upstream server
- xlog("L_INFO", "$ci|log|in dialog request belongs to a known transaction");
-
- route(logged_relay);
- }
- else
- {
- # ACK without matching transaction ->
- # ignore and discard
- xlog("L_NOTICE", "$ci|end|no matching transaction");
- }
-
- exit();
- }
- else if ( is_method("NOTIFY") )
- {
- route(logged_relay);
-
- exit();
- }
-
- # request with a to tag that cant be routed loosly and is not an ACK
- # ignor eand discard
- xlog("L_WARN", "$ci|end|could not route in dialog");
-
- sl_send_reply("486", "PC Load Letter");
-
- exit();
- }
-
- # if the request is to cancel a transaction process it now
- if (is_method("CANCEL"))
- {
- # If this cancel is part of a transaction
- # then pass it along to concerned parties
- if (t_check_trans())
- {
- xlog("L_INFO", "$ci|log|request belogs to a known transaction");
-
- route(logged_relay);
- }
- # if the cancel does not belong to a known transaction or a
- # request that has not progressed outside this server dont relay it
- else
- {
- xlog("L_NOTICE", "$ci|end|no matching transaction");
- }
-
- # remove the association between the call-id and the media server (if one)
- # but leave the contact user and server to support transfers
- cache_remove("local", "$ci");
-
- xlog("L_INFO", "$ci|log|cleaned up call id from cache");
-
- exit;
- }
-
- # If this is a retransmission it will break/stop the script
- # and do standard processing of the message
- t_check_trans();
-
- # Except for an ACK no request should have a route set with no to tag, this would
- # indicate that the intial request has the Route headers and is likely someone trying
- # to get us to send the request were they want
- if (loose_route())
- {
- if (!is_method("ACK"))
- {
- xlog("L_WARN", "$ci|end|initial request contained a preloaded route set");
-
- sl_send_reply("403", "The only winning move it not to play");
-
- exit;
- }
- }
-
- # If the request is a register we will pass it along but we need
- # to add the path header (along with the received IP/port info)
- if (is_method("REGISTER"))
- {
- # if we fail to add the path header then dont let it
- # register because it will cause issues later...
- if (!add_path_received())
- {
- xlog("L_ERR", "$ci|log|unable to add path");
-
- sl_send_reply("503", "Internal path befuddlement");
-
- # remove the association between the call-id and the media server (if one)
- # but leave the contact user and server to support transfers
- cache_remove("local", "$ci");
-
- xlog("L_INFO", "$ci|end|cleaned up call id from cache");
-
- exit;
- }
-
- xlog("L_INFO", "$ci|log|added path");
- }
-
- # for all initial request (not having been processed above in the has_totag)
- # that are not a register or message add this sever to the route set on the
- # request so subsequent messages come through this server
- if (!is_method("REGISTER|MESSAGE"))
- {
- # Record the route that this request has taken
- # so we remain in the signaling path
- record_route();
-
- xlog("L_INFO", "$ci|log|added this server to the route set");
- }
-
- # if the request is from a media server send it out
- if (isflagset(26))
- {
- route(internal_to_external_relay);
-
- exit();
- }
-
- # if the request is not from a media server it must be for one,
- # there is much work to do!
-
- # load a list of currently active media servers
- # if no media server could be set with ds_select_domain then there are no
- # active servers, no need to conitnue
- if (is_method("REGISTER")) {
- if (!ds_select_domain("3", "4") && !ds_select_domain("1", "4"))
- {
- xlog("L_ERR", "$ci|end|no servers avaliable");
-
- sl_send_reply("480", "All servers busy");
-
- exit;
- }
- }
- else
- {
- if (!ds_select_domain("1", "4"))
- {
- xlog("L_ERR", "$ci|end|no servers avaliable");
-
- sl_send_reply("480", "All servers busy");
-
- exit;
- }
- }
-
- if (cache_fetch("local", "$ou", $avp(i:55)))
- {
- xlog("L_INFO", "$ci|log|request $ou is associated with media server $avp(i:55)");
-
- cache_remove("local", "$ou");
-
- cache_store("local", "$ci", "$avp(i:55)", 3600);
- }
- # if the request is not from our media severs but has a call-id in localcache
- # then change the routing to go to the server previously associated with it.
- else if (cache_fetch("local", "$ci", $avp(i:55)))
- {
- cache_store("local", "$ci", "$avp(i:55)", 3600);
-
- xlog("L_INFO", "$ci|log|call-id is associated with media server $avp(i:55)");
- }
- # if the request is not from our media severs but has a contact uri in localcache
- # then change the routing to go to the server previously associated with it.
- else if ($ct.fields(uri) && cache_fetch("local", "$(ct.fields(uri){uri.user})", $avp(i:55)))
- {
- cache_store("local", "$(ct.fields(uri){uri.user})", "$avp(i:55)", 3600);
-
- xlog("L_INFO", "$ci|log|contact $(ct.fields(uri){uri.user}) is associated with media server $avp(i:55)");
- }
- # if the request is not from our media servers and no associations in localcache
- # then use the distribute list as is
- else
- {
- xlog("L_INFO", "$ci|log|routing call to arbitrary media server $rd:$rp");
- }
-
- if($avp(i:55) && $rU == "*6683*")
- {
- xlog("L_INFO", "$ci|log|removing association with server $avp(i:55)");
-
- if($(avp(i:271)[0]) != $avp(i:55))
- {
- # set the domain for this request (server IP to route to)
- $rd = $(avp(i:271)[0]{uri.host});
-
- # set the port for this request (server IP to route to)
- $rp = $(avp(i:271)[0]{uri.port});
- }
- else
- {
- # set the domain for this request (server IP to route to)
- $rd = $(avp(i:271)[1]{uri.host});
-
- # set the port for this request (server IP to route to)
- $rp = $(avp(i:271)[1]{uri.port});
- }
-
- if ($ct.fields(uri))
- {
- xlog("L_INFO", "$ci|log|created new association between $(ct.fields(uri){uri.user}) and media server sip:$rd:$rp");
-
- cache_store("local", "$(ct.fields(uri){uri.user})", "sip:$rd:$rp", 3600);
- }
-
- cache_remove("local", "$ci");
-
- sl_send_reply("503", "sip:$rd:$rp");
-
- exit;
- }
- # if the dispatcher list (in 271) does not start with
- # the request domain/port that we are sending this call
- # to, re-order the list so that it does
- else if($avp(i:55) && $(avp(i:271)[0]) != $avp(i:55))
- {
- # create a index var for our loop (arrays are start at 0 and this is a count)
- $var(i) = $avp(i:274) - 1;
-
- # loop over the dispatcher list
- while($var(i) > 0)
- {
- # if this element in the dispatch list is the same
- # as the call destination
- if($(avp(i:271)[$var(i)]) == $avp(i:55))
- {
- # replace it with the first element of the list
- $(avp(i:271)[$(var(i))]) = $(avp(i:271)[0]);
-
- # break out of the loop
- $var(i) = -1;
- }
-
- $var(i) = $var(i) - 1;
- }
-
- # handles the case were we only have two servers
- # and the one that we are locked to has failed
- if ($var(i) >= 0)
- {
-
- xlog("L_INFO", "$ci|log|associated media server is inactive, moving to $rd");
-
- if ($ct.fields(uri) && cache_fetch("local", "$ci", $avp(i:56)))
- {
- cache_store("local", "$(ct.fields(uri){uri.user})", "sip:$rd:$rp", 3600);
-
- xlog("L_INFO", "$ci|log|associated contact $(ct.fields(uri){uri.user}) with media server sip:$rd:$rp");
- }
-
- # update the callid cache
- cache_store("local", "$ci", "sip:$rd:$rp", 3600);
- }
- # the server we are locked to is in the active server list from then
- # dispatcher so re-arrange the list to try it first
- else
- {
- xlog("L_INFO", "$ci|log|re-ordering the dispatcher list to keep associated server first");
-
- # set the first element of the list to the destination
- $(avp(i:271)[0]) = $avp(i:55);
-
- # set the domain for this request (server IP to route to)
- $rd = $(avp(i:55){uri.host});
-
- # set the port for this request (server IP to route to)
- $rp = $(avp(i:55){uri.port});
- }
- }
-
- route(external_to_internal_relay);
-}
-
-route[external_to_internal_relay]
-{
- # 1. correct any nat issues
- # 2. remove any X-AUTH-IP headers so we will be the only one to set it
- # 3. set the X-AUTH-IP header for freeswitch ACLs
- # 4. set the final reply timer to two seconds, so we failover faster
- # 5. arm a logging branch for replies
- # 6. arm a failure branch that will try another one of our media servers when possible
-
- route("nat_test_and_correct");
-
- remove_hf("X-AUTH-IP");
-
- append_hf("X-AUTH-IP: $si\r\n");
-
- xlog("L_INFO", "$ci|log|X-AUTH-IP: $si");
-
- $avp(s:final_reply_timer) = 3;
-
- t_on_reply("internal_reply");
-
- t_on_failure("internal_fault");
-
- route("logged_relay");
-
- exit;
-}
-
-route[internal_to_external_relay]
-{
- # if the request is from a media server then assume it is going somewhere
- # outside our control and give that equipment longer to respond.
- # Also arm a branch to log the replies
-
- $avp(s:final_reply_timer) = 6;
-
- t_on_reply("external_reply");
-
- route("logged_relay");
-
- exit;
-}
-
-route[logged_relay]
-{
- # try to send the request on its way, if it fails send back a
- # stateless error to the requestor
- if (t_relay())
- {
- xlog("L_INFO", "$ci|pass|$rd:$rp");
- }
- else
- {
- xlog("L_ERR", "$ci|end|unable to relay message");
-
- sl_reply_error();
- }
-}
-
-route[nat_test_and_correct]
-{
- # 1. Contact header field is searched for occurrence of RFC1918 addresses
-# if (nat_uac_test("1"))
-# {
-# xlog("L_INFO", "$ci|log|contact header field contains a RFC1918 address");
-#
-# fix_contact();
-# }
-
- # 2 - the "received" test is used: address in Via is compared against source IP address of signaling
- if (nat_uac_test("2") && !ds_is_in_list("$si", "", "2"))
- {
- xlog("L_INFO", "$ci|log|address in Via differs from source IP");
-
- # adds the rport parameter to the first Via header
- force_rport();
-
- fix_contact();
- }
-
- # if the request has a body see if it needs NAT corrections as well,
- # this check looks at:
- # 8. SDP is searched for occurrence of RFC1918 addresses
- if (has_body("application/sdp") && nat_uac_test("8"))
- {
- xlog("L_INFO", "$ci|log|SDP contains a RFC1918 address");
-
- # alters the SDP information in order to facilitate NAT traversal.
- # 2. rewrite media IP address (c=) with source IP
- # 8. rewrite IP from origin description (o=) with source IP
- fix_nated_sdp("10");
- }
-}
-
-onreply_route[external_reply]
-{
- # this branch handles replies that are comming from equipment
- # outside our control
-
- xlog("L_INFO", "$ci|start|recieved external reply $rs $rr");
- xlog("L_INFO", "$ci|log|source $si:$sp");
-
- # This ensures that if a endpoint recieves a call they can properly
- # transfer that call
- # TODO: this will track calls made to carriers when we start sending carrier
- # traffic through opensips
- # Target: A endpoint answering a call made from one of our media
- # servers should lock that endpoint to the server
- if (t_check_status("200") && is_method("INVITE") && $(fd{ip.isip}) && (ds_is_in_list("$fd", "", "1") || ds_is_in_list("$fd", "", "3")))
- {
- $var(d) = $(fu{uri.host});
-
- if ($(fu{uri.port}) == 0)
- {
- $var(p) = 5060;
- }
- else
- {
- $var(p) = $(fu{uri.port});
- }
-
- if ($ct.fields(uri))
- {
- cache_store("local", "$(ct.fields(uri){uri.user})", "sip:$var(d):$var(p)", 3600);
-
- xlog("L_INFO", "$ci|log|associated $(ct.fields(uri){uri.user}) with media server sip:$var(d):$var(p)");
- }
-
- cache_store("local", "$ci", "sip:$var(d):$var(p)", 3600);
-
- xlog("L_INFO", "$ci|log|associated call-id with media server sip:$var(d):$var(p)");
- }
-
- if (is_method("BYE"))
- {
- # remove the association between the call-id and the media server (if one)
- # but leave the contact user and server to support transfers
- cache_remove("local", "$ci");
-
- xlog("L_INFO", "$ci|log|cleaned up call id from cache");
- }
-
- route("nat_test_and_correct");
-
- xlog("L_INFO", "$ci|pass|$(si):$(sp)");
-
- # if the reply is not dropped (only provisional replies can be),
- # it will be injected and processed by the transaction engine.
-}
-
-onreply_route[internal_reply]
-{
- # this branch handles replies that are comming from our media server
- if(t_local_replied("last"))
- {
- xlog("L_INFO", "$ci|start|recieved local internal reply $T_reply_code $rr");
- }
- else
- {
- xlog("L_INFO", "$ci|start|recieved internal reply $T_reply_code $rr");
- xlog("L_INFO", "$ci|log|source $si:$sp");
- }
-
- # Ensure that if we challenge an endpoint its response is not round-robin'd
- # We have to do it in the reply so we have the correct call id
- # Target: Endpoint intiated a request that was challenged, lock that
- # call id to the challenging server so it recieves the reply
- if (t_check_status("(407)|(401)") && $(si{ip.isip}) && (ds_is_in_list("$si", "", "1") || ds_is_in_list("$si", "", "3")))
- {
- cache_store("local", "$ci", "sip:$si:$sp", 3600);
-
- xlog("L_INFO", "$ci|log|associated call-id with media server sip:$si:$sp");
- }
-
- if (is_method("BYE"))
- {
- # remove the association between the call-id and the media server (if one)
- # but leave the contact user and server to support transfers
- cache_store("local", "$ci", "sip:$si:$sp", 360);
-
- xlog("L_INFO", "$ci|log|cleaned up call id from cache");
- }
-
- if ($rs < 300)
- {
- xlog("L_INFO", "$ci|pass|$(si):$(sp)");
- }
-
- # if the reply is not dropped (only provisional replies can be),
- # it will be injected and processed by the transaction engine.
-}
-
-failure_route[internal_fault]
-{
- # this branch handles failures (>=300) to our media servers,
- # which we can sometimes overcome by routing to another server
-
- # if the failure cause was due to the transaction being
- # cancelled then we are complete
- if (t_was_cancelled())
- {
- xlog("L_INFO", "$ci|log|transaction was cancelled");
-
- # remove the association between the call-id and the media server (if one)
- # but leave the contact user and server to support transfers
- cache_remove("local", "$ci");
-
- xlog("L_INFO", "$ci|end|cleaned up call id from cache");
-
- exit;
- }
-
- # if the failure case was soemthing that we should recover
- # from then try to find a new media server
- if (t_check_status("(401)|(407)"))
- {
- xlog("L_INFO", "$ci|log|failure route ignoring auth reply $T_reply_code $rr");
- }
- else if (t_check_status("403"))
- {
- xlog("L_INFO", "$ci|log|failure route overriding reply code 403 with 503");
-
- xlog("L_INFO", "$ci|pass|$(si):$(sp)");
-
- send_reply("503", "Error: Services Unavailable. Try Later");
-
- exit();
- }
- else if (t_check_status("402"))
- {
- xlog("L_INFO", "$ci|log|failure route overriding reply code 402 with 486");
-
- xlog("L_INFO", "$ci|pass|$(si):$(sp)");
-
- send_reply("486", "Insufficient Funds");
-
- exit();
- }
- else if (t_check_status("6[0-9][0-9]"))
- {
- send_reply("4$(T_reply_code{s.substr,1,0})", "$(rr)");
-
- exit();
- }
- else if (t_check_status("(4[0-9][0-9])|(5[0-9][0-9])"))
- {
- xlog("L_INFO", "$ci|start|received failure reply $T_reply_code $rr");
-
- if (cache_fetch("local", "$ci-failure", $avp(i:55)))
- {
- $avp(i:55) = $(avp(i:55){s.int});
- }
- else
- {
- $avp(i:55) = 0;
- }
-
- xlog("L_INFO", "$ci|log|attempting retry $avp(i:55) of failed request");
-
- # try to find a new media server to send the call to
- if($avp(i:55) < 3 && ds_next_domain())
- {
- xlog("L_INFO", "$ci|log|routing call to next media server $rd:$rp");
-
- # store the new callid association
- cache_store("local", "$ci", "sip:$rd:$rp", 3600);
-
- # if the request has a contact and is an INVITE then store the new
- # association
- if ($ct.fields(uri) && is_method("INVITE"))
- {
- cache_store("local", "$(ct.fields(uri){uri.user})", "sip:$rd:$rp", 3600);
-
- xlog("L_INFO", "$ci|log|associated contact $(ct.fields(uri){uri.user}) with media server sip:$rd:$rp");
- }
-
- # reset the final reply timer
- $avp(s:final_reply_timer) = 3;
-
- t_on_reply("internal_reply");
-
- t_on_failure("internal_fault");
-
- xlog("L_INFO", "$ci|pass|$rd:$rp");
-
- # relay the request to the new media server
- t_relay();
-
- $avp(i:55) = $avp(i:55) + 1;
-
- cache_store("local", "$ci-failure", "$avp(i:55)", 60);
-
- exit();
- }
- else if (t_check_status("404"))
- {
- xlog("L_ERR", "$ci|log|no other media servers avaliable, sending 486");
-
- cache_remove("local", "$ci-failure");
-
- send_reply("486", "Not found");
-
- exit();
- }
- else
- {
- cache_remove("local", "$ci-failure");
-
- xlog("L_ERR", "$ci|log|no other media servers avaliable");
- }
- }
- else if (t_check_status("302"))
- {
- if( $(hdr(X-Redirect-Server)) && $(ct.fields(uri)) )
- {
- $var(redirect_host) = $(hdr(X-Redirect-Server){uri.host});
-
- $var(redirect_port) = $(hdr(X-Redirect-Server){uri.port});
-
- cache_store("local", "$(ct.fields(uri))", "sip:$var(redirect_host):$var(redirect_port)", 60);
-
- xlog("L_INFO", "$ci|log|stored redirect mapping for $(ct.fields(uri)) to sip:$var(redirect_host):$var(redirect_port)");
-
- remove_hf("X-Redirect-Server");
- }
- }
- else
- {
- xlog("L_INFO", "$ci|log|failure route ignoring reply $T_reply_code $rr");
- }
-
- if (!t_check_status("(407)|(401)|(302)"))
- {
- # remove the association between the call-id and the media server (if one)
- # but leave the contact user and server to support transfers
- cache_remove("local", "$ci");
-
- xlog("L_INFO", "$ci|log|cleaned up call id from cache");
- }
-
- xlog("L_INFO", "$ci|pass|$(si):$(sp)");
-
- # if no new branch is generated or no reply is forced over, by default,
- # the winning reply will be sent back to UAC.
-}
-
-
-# For VIM:
-# vim: set expandtab softtabstop=4 shiftwidth=2 tabstop=2:
diff --git a/sip_profiles/internal.xml b/sip_profiles/sipinterface_1.xml
similarity index 100%
rename from sip_profiles/internal.xml
rename to sip_profiles/sipinterface_1.xml