aboutsummaryrefslogtreecommitdiffstats
path: root/admportal
diff options
context:
space:
mode:
Diffstat (limited to 'admportal')
-rw-r--r--admportal/.gitignore12
-rw-r--r--admportal/README52
-rw-r--r--admportal/certs/README1
-rw-r--r--admportal/config/admportal.json68
-rw-r--r--admportal/config/admportal.log4js.json154
-rw-r--r--admportal/config/svclogic.properties5
-rw-r--r--admportal/config/svclogic.properties.sdnctldb015
-rw-r--r--admportal/config/svclogic.properties.sdnctldb025
-rw-r--r--admportal/lib/CSPCheck.java27
-rw-r--r--admportal/lib/GLCookieDecryption.jarbin0 -> 11656 bytes
-rw-r--r--admportal/lib/Helloworld.java7
-rw-r--r--admportal/lib/ST4-4.0.8.jarbin0 -> 239543 bytes
-rwxr-xr-xadmportal/lib/antlr4-4.5.1.jarbin0 -> 1478697 bytes
-rwxr-xr-xadmportal/lib/antlr4-runtime-4.5.1.jarbin0 -> 302027 bytes
-rw-r--r--admportal/lib/java-concurrent-hash-trie-map-0.2.23.jarbin0 -> 47084 bytes
-rw-r--r--admportal/lib/jsr305-2.0.3.jarbin0 -> 33031 bytes
-rw-r--r--admportal/lib/object-cache-api-0.6.3-Helium-SR1.jarbin0 -> 13946 bytes
-rw-r--r--admportal/lib/org.abego.treelayout.core-1.0.1.jarbin0 -> 25515 bytes
-rw-r--r--admportal/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jarbin0 -> 1396459 bytes
-rw-r--r--admportal/lib/util-0.6.3-Helium-SR1.jarbin0 -> 115612 bytes
-rw-r--r--admportal/lib/yang-binding-0.6.3-Helium-SR1.jarbin0 -> 62971 bytes
-rw-r--r--admportal/lib/yang-common-0.6.3-Helium-SR1.jarbin0 -> 19216 bytes
-rw-r--r--admportal/package.json35
-rw-r--r--admportal/pom.xml97
-rw-r--r--admportal/process.http.json17
-rw-r--r--admportal/process.https.json17
-rw-r--r--admportal/public/fonts/glyphicons-halflings-regular.eotbin0 -> 20127 bytes
-rw-r--r--admportal/public/fonts/glyphicons-halflings-regular.svg288
-rw-r--r--admportal/public/fonts/glyphicons-halflings-regular.ttfbin0 -> 45404 bytes
-rw-r--r--admportal/public/fonts/glyphicons-halflings-regular.woffbin0 -> 23424 bytes
-rw-r--r--admportal/public/fonts/glyphicons-halflings-regular.woff2bin0 -> 18028 bytes
-rw-r--r--admportal/public/javascripts/admportal.js79
-rw-r--r--admportal/public/javascripts/bootbox.min.js6
-rw-r--r--admportal/public/javascripts/bootstrap-submenu.js185
-rw-r--r--admportal/public/javascripts/bootstrap-submenu.min.js7
-rw-r--r--admportal/public/javascripts/bootstrap-table.js2690
-rw-r--r--admportal/public/javascripts/bootstrap.min.js7
-rw-r--r--admportal/public/javascripts/dataTables.bootstrap.min.js9
-rw-r--r--admportal/public/javascripts/jquery-2.2.0.min.js4
-rw-r--r--admportal/public/javascripts/jquery.dataTables.min.js164
-rw-r--r--admportal/public/javascripts/jquery.min.js4
-rw-r--r--admportal/public/javascripts/jquery.treegrid.bootstrap3.js4
-rw-r--r--admportal/public/javascripts/jquery.treegrid.js626
-rw-r--r--admportal/public/javascripts/sla.js9
-rw-r--r--admportal/public/stylesheets/bootstrap-submenu.css125
-rw-r--r--admportal/public/stylesheets/bootstrap-submenu.css.map1
-rw-r--r--admportal/public/stylesheets/bootstrap-submenu.min.css8
-rw-r--r--admportal/public/stylesheets/bootstrap-submenu.min.css.map1
-rw-r--r--admportal/public/stylesheets/bootstrap-table.css297
-rw-r--r--admportal/public/stylesheets/bootstrap-theme.min.css6
-rw-r--r--admportal/public/stylesheets/bootstrap.min.css6
-rw-r--r--admportal/public/stylesheets/dataTables.bootstrap.min.css1
-rw-r--r--admportal/public/stylesheets/jquery.treegrid.css6
-rw-r--r--admportal/public/stylesheets/signin.css40
-rw-r--r--admportal/public/stylesheets/style.css8
-rw-r--r--admportal/routes/index.js9
-rw-r--r--admportal/routes/users.js9
-rw-r--r--admportal/server/adminPortal.dbbin0 -> 3072 bytes
-rw-r--r--admportal/server/app.js69
-rw-r--r--admportal/server/netdb_updater.js749
-rw-r--r--admportal/server/npm-debug.log18
-rw-r--r--admportal/server/router/index.js18
-rwxr-xr-xadmportal/server/router/routes/Odl.js594
-rwxr-xr-xadmportal/server/router/routes/admin.js83
-rw-r--r--admportal/server/router/routes/csp.js84
-rw-r--r--admportal/server/router/routes/dbRoutes.js1192
-rw-r--r--admportal/server/router/routes/gamma.js1667
-rw-r--r--admportal/server/router/routes/helpers.js66
-rw-r--r--admportal/server/router/routes/mobility.js1339
-rw-r--r--admportal/server/router/routes/network.js400
-rw-r--r--admportal/server/router/routes/odl.js258
-rw-r--r--admportal/server/router/routes/preload.js154
-rw-r--r--admportal/server/router/routes/root.js111
-rw-r--r--admportal/server/router/routes/sla.js369
-rw-r--r--admportal/server/router/routes/user.js169
-rw-r--r--admportal/server/router/routes/vnf.js603
-rwxr-xr-xadmportal/shell/getAdmPortalProp.py13
-rwxr-xr-xadmportal/shell/start.sh11
-rwxr-xr-xadmportal/shell/start_netdb.sh12
-rwxr-xr-xadmportal/shell/start_portal.sh32
-rwxr-xr-xadmportal/shell/startssl.sh28
-rw-r--r--admportal/shell/stop.sh2
-rwxr-xr-xadmportal/shell/stopssl.sh13
-rw-r--r--admportal/shell/svclogic.sh32
-rwxr-xr-xadmportal/shell/www14
-rw-r--r--admportal/src/assembly/assemble_zip.xml101
-rw-r--r--admportal/src/main/swm/deinstall/postproc/post_proc4
-rw-r--r--admportal/src/main/swm/deinstall/preproc/pre_proc4
-rw-r--r--admportal/src/main/swm/fallback/postproc/post_proc4
-rw-r--r--admportal/src/main/swm/fallback/preproc/pre_proc4
-rw-r--r--admportal/src/main/swm/initinst/postproc/post_proc4
-rw-r--r--admportal/src/main/swm/initinst/preproc/pre_proc4
-rw-r--r--admportal/src/main/swm/install/postproc/post_proc4
-rw-r--r--admportal/src/main/swm/install/preproc/pre_proc3
-rw-r--r--admportal/src/main/swm/notes.txt3
-rw-r--r--admportal/test/YYYYMMDDHH_ctag_pool.csv1501
-rw-r--r--admportal/test/eipam/sample.xml36
-rwxr-xr-xadmportal/test/gen.sh4
-rw-r--r--admportal/uploads/temp0
-rw-r--r--admportal/views/admin/list_usertrace.ejs68
-rw-r--r--admportal/views/admin/parameters.ejs181
-rw-r--r--admportal/views/css_delete/bootstrap-theme.min.css5
-rw-r--r--admportal/views/css_delete/bootstrap.min.css5
-rw-r--r--admportal/views/error.ejs3
-rw-r--r--admportal/views/gamma/list.ejs162
-rw-r--r--admportal/views/gamma/listAicAvailZone.ejs166
-rw-r--r--admportal/views/gamma/listAicSwitch.ejs156
-rw-r--r--admportal/views/gamma/listServiceHoming.ejs241
-rw-r--r--admportal/views/gamma/listServiceHomingRollback.ejs117
-rw-r--r--admportal/views/gamma/listSite.ejs171
-rw-r--r--admportal/views/gamma/listVpePool.ejs194
-rw-r--r--admportal/views/gamma/listVplspePool.ejs178
-rw-r--r--admportal/views/gamma/nbVlanPool.ejs124
-rw-r--r--admportal/views/gamma/nbVlanRange.ejs205
-rw-r--r--admportal/views/gamma/networkProfile.ejs164
-rw-r--r--admportal/views/javascript_delete/jquery.min.js4
-rw-r--r--admportal/views/javascript_delete/sla.js11
-rw-r--r--admportal/views/logs/accesslog.ejs83
-rw-r--r--admportal/views/logs/accesslog.ejs.0223121
-rw-r--r--admportal/views/logs/usertrace.ejs83
-rw-r--r--admportal/views/logs/usertrace.ejs.0223122
-rw-r--r--admportal/views/mobility/displayVnfData.ejs36
-rw-r--r--admportal/views/mobility/displayVnfNetworkData.ejs36
-rw-r--r--admportal/views/mobility/vmNetworks.ejs198
-rw-r--r--admportal/views/mobility/vmProfile.ejs173
-rw-r--r--admportal/views/mobility/vnfNetworks.ejs163
-rw-r--r--admportal/views/mobility/vnfPreloadData.ejs244
-rw-r--r--admportal/views/mobility/vnfPreloadNetworkData.ejs242
-rw-r--r--admportal/views/mobility/vnfProfile.ejs177
-rw-r--r--admportal/views/odl/cluster_status.ejs84
-rw-r--r--admportal/views/odl/listVRlan.ejs1069
-rw-r--r--admportal/views/odl/listWklst.ejs2224
-rw-r--r--admportal/views/odl/view.ejs91
-rw-r--r--admportal/views/odl/viewvnf.ejs62
-rw-r--r--admportal/views/pages/csplogout.ejs47
-rw-r--r--admportal/views/pages/err.ejs33
-rw-r--r--admportal/views/pages/home.ejs33
-rw-r--r--admportal/views/pages/home.ejs.orig20
-rw-r--r--admportal/views/pages/login.ejs45
-rw-r--r--admportal/views/pages/setuplogin.ejs51
-rw-r--r--admportal/views/pages/signup.ejs45
-rw-r--r--admportal/views/pages/testdb.ejs38
-rw-r--r--admportal/views/partials/add_service_homing.ejs52
-rw-r--r--admportal/views/partials/alts_credentials.ejs65
-rw-r--r--admportal/views/partials/dhcp.ejs66
-rw-r--r--admportal/views/partials/env.ejs1
-rw-r--r--admportal/views/partials/equipment.ejs58
-rw-r--r--admportal/views/partials/excluded_v4_address.ejs38
-rw-r--r--admportal/views/partials/excluded_v4_address_from_default_pool.ejs38
-rw-r--r--admportal/views/partials/excluded_v6_address_from_default_pool.ejs38
-rw-r--r--admportal/views/partials/excluded_v6_addresses.ejs38
-rw-r--r--admportal/views/partials/feature_list.ejs50
-rw-r--r--admportal/views/partials/firewall_lite.ejs43
-rw-r--r--admportal/views/partials/footer.ejs5
-rw-r--r--admportal/views/partials/form.ejs55
-rw-r--r--admportal/views/partials/gammaHeader.ejs63
-rw-r--r--admportal/views/partials/head.ejs20
-rw-r--r--admportal/views/partials/head.ejs.orig13
-rw-r--r--admportal/views/partials/header.ejs11
-rw-r--r--admportal/views/partials/header.ejs.orig55
-rw-r--r--admportal/views/partials/interface.ejs42
-rw-r--r--admportal/views/partials/internet_evc_modal.ejs44
-rw-r--r--admportal/views/partials/ipv4_infrastructure_static_route.ejs50
-rw-r--r--admportal/views/partials/ipv6_infrastructure_static_route.ejs50
-rw-r--r--admportal/views/partials/l2_homing_information_modal.ejs46
-rw-r--r--admportal/views/partials/l3_interface_ipv4_address_list.ejs42
-rw-r--r--admportal/views/partials/l3_interface_ipv6_address_list.ejs42
-rw-r--r--admportal/views/partials/l3sdn_vnf_fields.ejs70
-rw-r--r--admportal/views/partials/link_latency_master.ejs100
-rw-r--r--admportal/views/partials/link_master.ejs109
-rw-r--r--admportal/views/partials/max_port_speed.ejs86
-rw-r--r--admportal/views/partials/max_server_speed.ejs88
-rw-r--r--admportal/views/partials/metroroadm_service_request.ejs170
-rw-r--r--admportal/views/partials/nat.ejs38
-rw-r--r--admportal/views/partials/nb_vlan_pool.ejs38
-rw-r--r--admportal/views/partials/nb_vlan_range.ejs45
-rw-r--r--admportal/views/partials/ncs_credentials.ejs74
-rw-r--r--admportal/views/partials/network_connections.ejs66
-rw-r--r--admportal/views/partials/network_profile.ejs59
-rw-r--r--admportal/views/partials/new_parameter.ejs36
-rw-r--r--admportal/views/partials/newuserform.ejs37
-rw-r--r--admportal/views/partials/oper_status_modal.ejs68
-rw-r--r--admportal/views/partials/owbc_properties.ejs98
-rw-r--r--admportal/views/partials/partner_properties.ejs74
-rw-r--r--admportal/views/partials/pat.ejs50
-rw-r--r--admportal/views/partials/pat_pools.ejs46
-rw-r--r--admportal/views/partials/phs_credentials.ejs92
-rw-r--r--admportal/views/partials/request_information_modal.ejs60
-rw-r--r--admportal/views/partials/resource_rule.ejs118
-rw-r--r--admportal/views/partials/ro_header.ejs43
-rw-r--r--admportal/views/partials/roadm_mapping.ejs101
-rw-r--r--admportal/views/partials/router_master.ejs59
-rw-r--r--admportal/views/partials/routing_protocol.ejs38
-rw-r--r--admportal/views/partials/sdnc_request_header_modal.ejs46
-rw-r--r--admportal/views/partials/sdnfcHeader.ejs61
-rw-r--r--admportal/views/partials/sdnmlcHeader.ejs63
-rw-r--r--admportal/views/partials/service_information_modal.ejs46
-rw-r--r--admportal/views/partials/service_manager_credentials.ejs65
-rw-r--r--admportal/views/partials/service_status_modal.ejs68
-rwxr-xr-xadmportal/views/partials/startssl.sh28
-rw-r--r--admportal/views/partials/svc_config_additional_data.ejs38
-rw-r--r--admportal/views/partials/svc_topology_additional_data_modal.ejs36
-rw-r--r--admportal/views/partials/t_provided_v4_lan_public_prefixes.ejs46
-rw-r--r--admportal/views/partials/t_provided_v6_lan_public_prefixes.ejs46
-rw-r--r--admportal/views/partials/tcp_port_list.ejs38
-rw-r--r--admportal/views/partials/threshold_alarm.ejs71
-rw-r--r--admportal/views/partials/udp_port_list.ejs38
-rw-r--r--admportal/views/partials/update_aic_avail_zone.ejs54
-rw-r--r--admportal/views/partials/update_aic_site.ejs57
-rw-r--r--admportal/views/partials/update_aic_switch.ejs41
-rw-r--r--admportal/views/partials/update_max_port_speed.ejs45
-rw-r--r--admportal/views/partials/update_parameter.ejs37
-rw-r--r--admportal/views/partials/update_resource_rule.ejs57
-rw-r--r--admportal/views/partials/update_service_homing.ejs55
-rw-r--r--admportal/views/partials/update_vlan_id_pool.ejs51
-rw-r--r--admportal/views/partials/update_vpe_pool.ejs88
-rw-r--r--admportal/views/partials/update_vplspe_pool.ejs72
-rw-r--r--admportal/views/partials/userform.ejs41
-rw-r--r--admportal/views/partials/v4_dhcp_pools.ejs50
-rw-r--r--admportal/views/partials/v4_firewall_packet_filters.ejs46
-rw-r--r--admportal/views/partials/v4_nat_mapping_entries.ejs46
-rw-r--r--admportal/views/partials/v4_static_routes.ejs46
-rw-r--r--admportal/views/partials/v6_dhcp_pools.ejs50
-rw-r--r--admportal/views/partials/v6_firewall_packet_filters.ejs46
-rw-r--r--admportal/views/partials/v6_static_routes.ejs46
-rw-r--r--admportal/views/partials/vlan.ejs46
-rw-r--r--admportal/views/partials/vm_networks.ejs57
-rw-r--r--admportal/views/partials/vm_profile.ejs32
-rw-r--r--admportal/views/partials/vnf_network.ejs28
-rw-r--r--admportal/views/partials/vnf_profile.ejs32
-rw-r--r--admportal/views/partials/vnf_vm_information.ejs42
-rw-r--r--admportal/views/partials/vr_lan_interface.ejs66
-rw-r--r--admportal/views/partials/vrr_credentials.ejs82
-rw-r--r--admportal/views/resalloc/max_port_speed.ejs205
-rw-r--r--admportal/views/resalloc/max_server_speed.ejs207
-rw-r--r--admportal/views/resalloc/resource_rule.ejs228
-rw-r--r--admportal/views/resalloc/threshold_alarms.ejs186
-rw-r--r--admportal/views/sdnfc/viewTables.ejs102
-rw-r--r--admportal/views/sdnfc/vrrCredentials.ejs223
-rw-r--r--admportal/views/sla/list.ejs189
-rw-r--r--admportal/views/sla/printasgv.ejs43
-rw-r--r--admportal/views/sla/printasxml.ejs35
-rw-r--r--admportal/views/tunnel/linkLatencyMaster.ejs240
-rw-r--r--admportal/views/tunnel/linkMaster.ejs213
-rw-r--r--admportal/views/tunnel/metroRoadmServiceRequest.ejs300
-rw-r--r--admportal/views/tunnel/owbcProperties.ejs223
-rw-r--r--admportal/views/tunnel/partnerProperties.ejs184
-rw-r--r--admportal/views/tunnel/roadmMapping.ejs230
-rw-r--r--admportal/views/tunnel/routerMaster.ejs167
-rw-r--r--admportal/views/ucpe/altsCredentials.ejs171
-rw-r--r--admportal/views/ucpe/apiLogins.ejs93
-rw-r--r--admportal/views/ucpe/chainingTopologies.ejs98
-rw-r--r--admportal/views/ucpe/customerNcsServers.ejs102
-rw-r--r--admportal/views/ucpe/mappedServicePort.ejs98
-rw-r--r--admportal/views/ucpe/mcapServers.ejs92
-rw-r--r--admportal/views/ucpe/ncsCredentials.ejs180
-rw-r--r--admportal/views/ucpe/nmInterfaces.ejs96
-rw-r--r--admportal/views/ucpe/phsCredentials.ejs202
-rw-r--r--admportal/views/ucpe/phsServers.ejs92
-rw-r--r--admportal/views/ucpe/physicalDeviceLogins.ejs98
-rw-r--r--admportal/views/ucpe/referenceData.ejs224
-rw-r--r--admportal/views/ucpe/serviceManagerCredentials.ejs171
-rw-r--r--admportal/views/ucpe/servicePort.ejs88
-rw-r--r--admportal/views/ucpe/vnfLogins.ejs94
-rw-r--r--admportal/views/ucpe/vnfMapDevice.ejs98
-rw-r--r--admportal/views/ucpe/vnfModelFeatures.ejs90
-rw-r--r--admportal/views/ucpe/vnfModelSoftware.ejs98
-rw-r--r--admportal/views/ucpe/vnfModels.ejs122
-rw-r--r--admportal/views/ucpe/vnfNmInterfaces.ejs98
-rw-r--r--admportal/views/ucpe/vnfPorts.ejs94
-rw-r--r--admportal/views/user/list.ejs194
271 files changed, 33111 insertions, 0 deletions
diff --git a/admportal/.gitignore b/admportal/.gitignore
new file mode 100644
index 00000000..1b8a6ba9
--- /dev/null
+++ b/admportal/.gitignore
@@ -0,0 +1,12 @@
+org.eclipse.core.resources.prefs
+.classpath
+.project
+.settings
+.idea
+.externalToolBuilders
+maven-eclipse.xml
+*.class
+target/
+MANIFEST.MF
+.DS_STORE
+.metadata
diff --git a/admportal/README b/admportal/README
new file mode 100644
index 00000000..5712b36d
--- /dev/null
+++ b/admportal/README
@@ -0,0 +1,52 @@
+5.0.1 Initial Build for 1512
+
+10/29/2015
+MR 36,39
+
+11/12/2015
+MR: SDNGC-84 Handle BGP block correctly
+
+11/18/2015
+5.0.3
+MR: SDNGC-145 error with loading uCPE reference data files
+MR: SDNGC=153
+
+11/19/2015
+5.0.4
+MR: SDNGC-154 change ack namespaces for instar request
+
+1/5/2016
+6.0.1
+MR: SDNGC-323 changes to reflect CSI namespace changes
+
+1/7/2016
+6.0.2
+MR: SDNGC-339
+
+1/19/2016
+MR: SDNGC-394 add as-override and secondary-asn to AVPN BGP params
+
+1/20/2016
+MR: SDNGC-404 send response back to CSI before sending request to SDNC
+
+1/27/2016
+MR: SDNGC-463 UCPE Reference Data Change for ucpenminterfaces_MMDDYYYY file
+
+2/15/2016
+MR: SDNGC-489 Add multicast parameters
+
+2/29/2016
+MR: SDNGC-690 AdmPortal protocol changes for 1604
+
+3/22/2016
+MR: SDNGC-909 instar.js handling CSI namespace changes
+
+5/4/2016
+MR: SDNGC-1386 Fix multicast indicator checking
+
+5/19/2016
+MR: SDNGC-1522 CSI format changes in 16.07 for instar CDN
+
+5/23/2016
+MR: SDNGC-1531 More CSI format fixes
+
diff --git a/admportal/certs/README b/admportal/certs/README
new file mode 100644
index 00000000..4ac10fc3
--- /dev/null
+++ b/admportal/certs/README
@@ -0,0 +1 @@
+SSL certs are stored in this directory
diff --git a/admportal/config/admportal.json b/admportal/config/admportal.json
new file mode 100644
index 00000000..830b7629
--- /dev/null
+++ b/admportal/config/admportal.json
@@ -0,0 +1,68 @@
+{
+ "MainMenu": "gamma",
+ "dbConnLimit": "100",
+ "home": "/opt/admportal",
+ "sslEnabled": "false",
+ "nonSslPort": "8843",
+ "ConexusNetworkPort": "8443",
+ "AppNetworkPort": "8543",
+ "clusterPort": "8443",
+ "serviceHomingServiceType": "SDN-ETHERNET-INTERNET",
+ "passwordKey": "QtfJMKggVk",
+ "preloadImportDirectory": "C:/data/csv",
+ "clusterPrefixURL": "/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-",
+ "clusterMidURL": "-shard-",
+ "clusterSuffixURL": "-config,type=DistributedConfigDatastore",
+ "shards": [
+ "default",
+ "inventory",
+ "topology"
+ ],
+ "dbFabric": "false",
+ "ip-addresses": {
+ "lo": "127.0.0.1",
+ "eth0": "127.0.0.1",
+ "docker0": "172.17.0.1",
+ "virbr0": "192.168.122.1"
+ },
+ "svclogicPropertiesDb01": "/opt/openecomp/sdnc/data/properties/svclogic.properties.sdnctldb01",
+ "databases": [
+ "dbhost|sdnctldb01"
+ ],
+ "dbFabricServer": "localhost",
+ "dbFabricPort": "32275",
+ "dbFabricGroupId": "hagroup1",
+ "dbFabricUser": "admin",
+ "dbFabricPassword": "admin",
+ "dbFabricDB": "mysql",
+ "dbUser": "sdnctl",
+ "dbPassword": "gamma",
+ "dbName": "sdnctl",
+ "odlProtocol": "http",
+ "odlHost": "sdnhost",
+ "odlConexusHost": "sdnhost",
+ "odlPort": "8181",
+ "odlConexusPort": "8181",
+ "odlUser": "admin",
+ "odlPasswd": "admin",
+ "ConexusNetwork_sslCert": "",
+ "ConexusNetwork_sslKey": "",
+ "AppNetwork_sslCert": "",
+ "AppNetwork_sslKey": "",
+ "hostnameList": [
+ {
+ "hname": "localhost"
+ }
+ ],
+ "shard_list": [
+ {
+ "shard_name": "default"
+ },
+ {
+ "shard_name": "inventory"
+ },
+ {
+ "shard_name": "topology"
+ }
+ ]
+}
diff --git a/admportal/config/admportal.log4js.json b/admportal/config/admportal.log4js.json
new file mode 100644
index 00000000..1dcb699e
--- /dev/null
+++ b/admportal/config/admportal.log4js.json
@@ -0,0 +1,154 @@
+{
+ "appenders": [
+ {
+ "category": "accesslog",
+ "type" : "dateFile",
+ "absolute": true,
+ "filename": "/opt/admportal/logs/accesslog.rp",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "usertrace",
+ "type" : "file",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/usertrace.log"
+ },
+ {
+ "category": "tracelog",
+ "type" : "dateFile",
+ "absolute": true,
+ "filename": "/opt/admportal/logs/tracelog.log",
+ "pattern": "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "eipam",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/eipam.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "instar",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/instar.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "app",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/app.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "csp",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/csp.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "db",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/db.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "admin",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/admin.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "resalloc",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/resalloc.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "logs",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/applogs.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "sla",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/sla.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "gamma",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/gamma.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "odl",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/odl.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "mobility",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/mobility.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "ucpe",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/ucpe.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ },
+ {
+ "category" : "user",
+ "type" : "dateFile",
+ "absolute" : true,
+ "filename" : "/opt/admportal/logs/user.log",
+ "pattern" : "-yyyy-MM-dd",
+ "alwaysIncludePattern": true,
+ "backups" : 14
+ }
+ ]
+}
diff --git a/admportal/config/svclogic.properties b/admportal/config/svclogic.properties
new file mode 100644
index 00000000..f0cc841b
--- /dev/null
+++ b/admportal/config/svclogic.properties
@@ -0,0 +1,5 @@
+org.openecomp.sdnctl.sli.dbtype = jdbc
+org.openecomp.sdnctl.sli.jdbc.url = jdbc:mysql://sdnctldb01:3306/sdnctl
+org.openecomp.sdnctl.sli.jdbc.database = sdnctl
+org.openecomp.sdnctl.sli.jdbc.user = sdnctl
+org.openecomp.sdnctl.sli.jdbc.password = gamma
diff --git a/admportal/config/svclogic.properties.sdnctldb01 b/admportal/config/svclogic.properties.sdnctldb01
new file mode 100644
index 00000000..f0cc841b
--- /dev/null
+++ b/admportal/config/svclogic.properties.sdnctldb01
@@ -0,0 +1,5 @@
+org.openecomp.sdnctl.sli.dbtype = jdbc
+org.openecomp.sdnctl.sli.jdbc.url = jdbc:mysql://sdnctldb01:3306/sdnctl
+org.openecomp.sdnctl.sli.jdbc.database = sdnctl
+org.openecomp.sdnctl.sli.jdbc.user = sdnctl
+org.openecomp.sdnctl.sli.jdbc.password = gamma
diff --git a/admportal/config/svclogic.properties.sdnctldb02 b/admportal/config/svclogic.properties.sdnctldb02
new file mode 100644
index 00000000..c2b48ecc
--- /dev/null
+++ b/admportal/config/svclogic.properties.sdnctldb02
@@ -0,0 +1,5 @@
+org.openecomp.sdnctl.sli.dbtype = jdbc
+org.openecomp.sdnctl.sli.jdbc.url = jdbc:mysql://sdnctldb02:3306/sdnctl
+org.openecomp.sdnctl.sli.jdbc.database = sdnctl
+org.openecomp.sdnctl.sli.jdbc.user = sdnctl
+org.openecomp.sdnctl.sli.jdbc.password = gamma
diff --git a/admportal/lib/CSPCheck.java b/admportal/lib/CSPCheck.java
new file mode 100644
index 00000000..dac1d886
--- /dev/null
+++ b/admportal/lib/CSPCheck.java
@@ -0,0 +1,27 @@
+import esGateKeeper.*;
+import java.util.*;
+import java.io.*;
+import java.net.*;
+public class CSPCheck{
+
+public static void main(String[] args){
+ try{
+ String attuid = "";
+ if(args != null && args.length == 2){
+ String secCookie = args[0];
+ //validationEnv can be DEVL or PROD
+ String validationEnv=args[1];
+ String retString = esGateKeeper.esGateKeeper(secCookie, "CSP", validationEnv, -5, "/tmp/");
+ if(retString != null){
+ String[] dataArr = retString.split("\\|");
+ attuid= dataArr[5];
+
+ }
+ System.out.print("{" + "\"attuid\" : \"" + attuid + "\"}");
+ }
+ }catch(Exception e){
+ System.out.print("{" + "\"attuid\" : \"ERROR\"}");
+ }
+}
+}
+
diff --git a/admportal/lib/GLCookieDecryption.jar b/admportal/lib/GLCookieDecryption.jar
new file mode 100644
index 00000000..aa3d0593
--- /dev/null
+++ b/admportal/lib/GLCookieDecryption.jar
Binary files differ
diff --git a/admportal/lib/Helloworld.java b/admportal/lib/Helloworld.java
new file mode 100644
index 00000000..daf47415
--- /dev/null
+++ b/admportal/lib/Helloworld.java
@@ -0,0 +1,7 @@
+public class Helloworld{
+
+public static void main(String[] args){
+ System.out.println("hello world");
+ }
+}
+
diff --git a/admportal/lib/ST4-4.0.8.jar b/admportal/lib/ST4-4.0.8.jar
new file mode 100644
index 00000000..144828ba
--- /dev/null
+++ b/admportal/lib/ST4-4.0.8.jar
Binary files differ
diff --git a/admportal/lib/antlr4-4.5.1.jar b/admportal/lib/antlr4-4.5.1.jar
new file mode 100755
index 00000000..81039db1
--- /dev/null
+++ b/admportal/lib/antlr4-4.5.1.jar
Binary files differ
diff --git a/admportal/lib/antlr4-runtime-4.5.1.jar b/admportal/lib/antlr4-runtime-4.5.1.jar
new file mode 100755
index 00000000..7807292e
--- /dev/null
+++ b/admportal/lib/antlr4-runtime-4.5.1.jar
Binary files differ
diff --git a/admportal/lib/java-concurrent-hash-trie-map-0.2.23.jar b/admportal/lib/java-concurrent-hash-trie-map-0.2.23.jar
new file mode 100644
index 00000000..2c019d09
--- /dev/null
+++ b/admportal/lib/java-concurrent-hash-trie-map-0.2.23.jar
Binary files differ
diff --git a/admportal/lib/jsr305-2.0.3.jar b/admportal/lib/jsr305-2.0.3.jar
new file mode 100644
index 00000000..cc39b738
--- /dev/null
+++ b/admportal/lib/jsr305-2.0.3.jar
Binary files differ
diff --git a/admportal/lib/object-cache-api-0.6.3-Helium-SR1.jar b/admportal/lib/object-cache-api-0.6.3-Helium-SR1.jar
new file mode 100644
index 00000000..e75db741
--- /dev/null
+++ b/admportal/lib/object-cache-api-0.6.3-Helium-SR1.jar
Binary files differ
diff --git a/admportal/lib/org.abego.treelayout.core-1.0.1.jar b/admportal/lib/org.abego.treelayout.core-1.0.1.jar
new file mode 100644
index 00000000..2350adcd
--- /dev/null
+++ b/admportal/lib/org.abego.treelayout.core-1.0.1.jar
Binary files differ
diff --git a/admportal/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar b/admportal/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar
new file mode 100644
index 00000000..c152830e
--- /dev/null
+++ b/admportal/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar
Binary files differ
diff --git a/admportal/lib/util-0.6.3-Helium-SR1.jar b/admportal/lib/util-0.6.3-Helium-SR1.jar
new file mode 100644
index 00000000..0f8ca621
--- /dev/null
+++ b/admportal/lib/util-0.6.3-Helium-SR1.jar
Binary files differ
diff --git a/admportal/lib/yang-binding-0.6.3-Helium-SR1.jar b/admportal/lib/yang-binding-0.6.3-Helium-SR1.jar
new file mode 100644
index 00000000..6adef241
--- /dev/null
+++ b/admportal/lib/yang-binding-0.6.3-Helium-SR1.jar
Binary files differ
diff --git a/admportal/lib/yang-common-0.6.3-Helium-SR1.jar b/admportal/lib/yang-common-0.6.3-Helium-SR1.jar
new file mode 100644
index 00000000..1fc5f9f7
--- /dev/null
+++ b/admportal/lib/yang-common-0.6.3-Helium-SR1.jar
Binary files differ
diff --git a/admportal/package.json b/admportal/package.json
new file mode 100644
index 00000000..e625ef22
--- /dev/null
+++ b/admportal/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "admportal",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "start": "node ./bin/www"
+ },
+ "dependencies": {
+ "body-parser": "~1.8.1",
+ "bootstrap": "^3.3.6",
+ "bootstrap-submenu": "^2.0.3",
+ "bootstrap-table": "^1.9.1",
+ "cookie-parser": "~1.3.3",
+ "csv": "^0.4.1",
+ "csvtojson": "^0.5.3",
+ "dateformat": "^1.0.11",
+ "debug": "~2.0.0",
+ "ejs": "~0.8.5",
+ "express": "~4.9.0",
+ "express-session": "^1.10.1",
+ "fs.extra": "^1.3.2",
+ "lodash": "^3.8.0",
+ "moment": "^2.13.0",
+ "morgan": "~1.3.0",
+ "multer": "^1.1.0",
+ "mysql": "^2.5.4",
+ "node-uuid": "^1.4.7",
+ "path": "^0.12.7",
+ "properties-reader": "0.0.9",
+ "sax": "^0.6.1",
+ "serve-favicon": "~2.1.3",
+ "xml2js": "^0.4.5",
+ "dns-sync": "~0.1.3"
+ }
+}
diff --git a/admportal/pom.xml b/admportal/pom.xml
new file mode 100644
index 00000000..2ce7ac02
--- /dev/null
+++ b/admportal/pom.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>org.openecomp.sdnc.oam</groupId>
+ <artifactId>sdnc-oam</artifactId>
+ <version>1.0.0</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>pom</packaging>
+ <groupId>org.openecomp.sdnc.oam</groupId>
+ <artifactId>admportal</artifactId>
+
+ <version>1.0.0</version>
+
+ <name>Admin Portal</name>
+ <description>Admin Portal</description>
+
+ <properties>
+ <application.name>admportal</application.name>
+ <skip.SWM>true</skip.SWM>
+ <adm.base>/opt/app/admportal</adm.base>
+ <maven.build.timestamp.format>yyMMdd-HHmmss</maven.build.timestamp.format>
+ <build.number>${maven.build.timestamp}</build.number>
+ <SWM_VERSION>${project.version}-${build.number}</SWM_VERSION>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>sli-common</artifactId>
+ <version>${sdnctl.sli.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ <version>5.1.31</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>create-zip</id>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <phase>package</phase>
+ <configuration>
+ <finalName>${application.name}.${project.version}</finalName>
+ <attach>true</attach>
+ <descriptors>
+ <descriptor>src/assembly/assemble_zip.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-dependencies</id>
+ <goals>
+ <goal>copy-dependencies</goal>
+ </goals>
+ <phase>prepare-package</phase>
+ <configuration>
+ <transitive>false</transitive>
+ <outputDirectory>${project.build.directory}/lib</outputDirectory>
+ <overWriteReleases>false</overWriteReleases>
+ <overWriteSnapshots>true</overWriteSnapshots>
+ <overWriteIfNewer>true</overWriteIfNewer>
+ <useRepositoryLayout>false</useRepositoryLayout>
+ <addParentPoms>false</addParentPoms>
+ <copyPom>false</copyPom>
+ <scope>provided</scope>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <organization>
+ <name>AT&amp;T</name>
+ </organization>
+</project>
+
diff --git a/admportal/process.http.json b/admportal/process.http.json
new file mode 100644
index 00000000..717f2bc1
--- /dev/null
+++ b/admportal/process.http.json
@@ -0,0 +1,17 @@
+{
+ "apps" :[
+ {
+ "name" : "http_admportal",
+ "script" : "/opt/admportal/bin/www",
+ "out_file" : "/opt/admportal/logs/http_admportal.log",
+ "error_file" : "/opt/admportal/logs/error_http_admportal.log",
+ "cwd" : "/opt/admportal",
+ "env":
+ {
+ "NODE_ENV": "production",
+ "HTTP_PROTOCOL": "http:",
+ "CLASSPATH" : "/opt/admportal/lib/GLCookieDecryption.jar:/opt/admportal/lib"
+ }
+ }
+ ]
+}
diff --git a/admportal/process.https.json b/admportal/process.https.json
new file mode 100644
index 00000000..a9b5ae7c
--- /dev/null
+++ b/admportal/process.https.json
@@ -0,0 +1,17 @@
+{
+ "apps" :[
+ {
+ "name" : "admportal8443",
+ "script" : "/opt/admportal/bin/wwwssl",
+ "out_file" : "/opt/admportal/logs/admportal8443.log",
+ "error_file" : "/opt/admportal/logs/error_admportal8443.log",
+ "cwd" : "/opt/admportal",
+ "env":
+ {
+ "NODE_ENV": "production",
+ "HTTP_PROTOCOL": "https:",
+ "CLASSPATH" : "/opt/admportal/lib/GLCookieDecryption.jar:/opt/admportal/lib"
+ }
+ }
+ ]
+}
diff --git a/admportal/public/fonts/glyphicons-halflings-regular.eot b/admportal/public/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 00000000..b93a4953
--- /dev/null
+++ b/admportal/public/fonts/glyphicons-halflings-regular.eot
Binary files differ
diff --git a/admportal/public/fonts/glyphicons-halflings-regular.svg b/admportal/public/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 00000000..94fb5490
--- /dev/null
+++ b/admportal/public/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
+<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
+<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
+<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
+<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
+<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
+<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
+<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
+<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
+<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
+<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
+<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
+<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
+<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
+<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
+<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
+<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
+<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
+<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
+<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
+<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
+<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
+<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
+<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
+<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
+<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
+<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
+<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
+<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
+<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
+<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
+<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
+<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
+<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
+<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
+<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
+<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
+<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
+<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
+<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
+<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
+<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
+<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
+<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
+<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
+<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
+<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
+<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
+<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
+<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
+<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
+<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
+<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
+<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
+<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
+<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
+<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
+<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
+<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
+<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
+<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
+<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
+<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
+<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
+<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
+<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
+<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
+<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
+<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
+<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
+<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
+<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
+<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
+<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
+<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
+<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
+<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
+<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
+<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
+<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
+<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
+<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
+<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
+<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
+<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
+<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
+<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
+<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
+<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
+<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
+<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
+<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
+<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
+<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
+<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
+<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
+<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
+<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
+<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
+<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
+<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
+<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
+<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
+<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
+<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
+<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
+<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
+<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
+<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
+<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
+<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
+<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
+<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
+<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
+<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
+<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
+<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
+<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
+<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
+<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
+<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
+<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
+<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
+<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
+<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/admportal/public/fonts/glyphicons-halflings-regular.ttf b/admportal/public/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 00000000..1413fc60
--- /dev/null
+++ b/admportal/public/fonts/glyphicons-halflings-regular.ttf
Binary files differ
diff --git a/admportal/public/fonts/glyphicons-halflings-regular.woff b/admportal/public/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 00000000..9e612858
--- /dev/null
+++ b/admportal/public/fonts/glyphicons-halflings-regular.woff
Binary files differ
diff --git a/admportal/public/fonts/glyphicons-halflings-regular.woff2 b/admportal/public/fonts/glyphicons-halflings-regular.woff2
new file mode 100644
index 00000000..64539b54
--- /dev/null
+++ b/admportal/public/fonts/glyphicons-halflings-regular.woff2
Binary files differ
diff --git a/admportal/public/javascripts/admportal.js b/admportal/public/javascripts/admportal.js
new file mode 100644
index 00000000..d73517da
--- /dev/null
+++ b/admportal/public/javascripts/admportal.js
@@ -0,0 +1,79 @@
+function uploadFile(form)
+{
+ if ( form.filename.value.length == 0)
+ {
+ bootbox.alert('Must select a file.');
+ return false;
+ }
+ else { form.submit(); return; }
+}
+function isDigit(num)
+{
+ // false means error
+ // true means success
+ //var dlNum = obj.value;
+ var charAllowed="0123456789";
+ var thisChar;
+ var cnt = 0;
+ var blankCnt = 0;
+ if ( num.length > 0 )
+ {
+ for (var i = 0; i < num.length; i++)
+ {
+ thisChar = num.substring(i, i+1);
+ if ( charAllowed.indexOf(thisChar) != -1 ) cnt++;
+ if ( num.substring(i, i + 1) == " " ) blankCnt++;
+ }
+ if ( cnt != num.length ){
+ return false;
+ }
+ else if (blankCnt == num.length) {
+ return false;
+ }
+ return true;
+ }
+ else
+ return false;
+}
+function isFloat(num)
+{
+ // false means error
+ // true means success
+ //var dlNum = obj.value;
+ var charAllowed=".-0123456789";
+ var thisChar;
+ var cnt = 0;
+ var blankCnt = 0;
+ if ( num.length > 0 )
+ {
+ for (var i = 0; i < num.length; i++)
+ {
+ thisChar = num.substring(i, i+1);
+ if ( charAllowed.indexOf(thisChar) != -1 ) cnt++;
+ if ( num.substring(i, i + 1) == " " ) blankCnt++;
+ }
+ if ( cnt != num.length ){
+ return false;
+ }
+ else if (blankCnt == num.length) {
+ return false;
+ }
+ return true;
+ }
+ else
+ return false;
+}
+function isblank(s)
+{
+ // true means all blank
+ // flase means not blank
+ for(var i=0; i<s.length; i++) {
+ var c = s.charAt(i);
+ if ( (c != ' ') && (c != '\n') && (c != '\t') ) return false;
+ }
+ return true;
+}
+
+function padLeft(nr, n, str){
+ return Array(n-String(nr).length+1).join(str||'0')+nr;
+}
diff --git a/admportal/public/javascripts/bootbox.min.js b/admportal/public/javascripts/bootbox.min.js
new file mode 100644
index 00000000..0dc0cbd5
--- /dev/null
+++ b/admportal/public/javascripts/bootbox.min.js
@@ -0,0 +1,6 @@
+/**
+ * bootbox.js v4.4.0
+ *
+ * http://bootboxjs.com/license.txt
+ */
+!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof exports?module.exports=b(require("jquery")):a.bootbox=b(a.jQuery)}(this,function a(b,c){"use strict";function d(a){var b=q[o.locale];return b?b[a]:q.en[a]}function e(a,c,d){a.stopPropagation(),a.preventDefault();var e=b.isFunction(d)&&d.call(c,a)===!1;e||c.modal("hide")}function f(a){var b,c=0;for(b in a)c++;return c}function g(a,c){var d=0;b.each(a,function(a,b){c(a,b,d++)})}function h(a){var c,d;if("object"!=typeof a)throw new Error("Please supply an object of options");if(!a.message)throw new Error("Please specify a message");return a=b.extend({},o,a),a.buttons||(a.buttons={}),c=a.buttons,d=f(c),g(c,function(a,e,f){if(b.isFunction(e)&&(e=c[a]={callback:e}),"object"!==b.type(e))throw new Error("button with key "+a+" must be an object");e.label||(e.label=a),e.className||(e.className=2>=d&&f===d-1?"btn-primary":"btn-default")}),a}function i(a,b){var c=a.length,d={};if(1>c||c>2)throw new Error("Invalid argument length");return 2===c||"string"==typeof a[0]?(d[b[0]]=a[0],d[b[1]]=a[1]):d=a[0],d}function j(a,c,d){return b.extend(!0,{},a,i(c,d))}function k(a,b,c,d){var e={className:"bootbox-"+a,buttons:l.apply(null,b)};return m(j(e,d,c),b)}function l(){for(var a={},b=0,c=arguments.length;c>b;b++){var e=arguments[b],f=e.toLowerCase(),g=e.toUpperCase();a[f]={label:d(g)}}return a}function m(a,b){var d={};return g(b,function(a,b){d[b]=!0}),g(a.buttons,function(a){if(d[a]===c)throw new Error("button key "+a+" is not allowed (options are "+b.join("\n")+")")}),a}var n={dialog:"<div class='bootbox modal' tabindex='-1' role='dialog'><div class='modal-dialog'><div class='modal-content'><div class='modal-body'><div class='bootbox-body'></div></div></div></div></div>",header:"<div class='modal-header'><h4 class='modal-title'></h4></div>",footer:"<div class='modal-footer'></div>",closeButton:"<button type='button' class='bootbox-close-button close' data-dismiss='modal' aria-hidden='true'>&times;</button>",form:"<form class='bootbox-form'></form>",inputs:{text:"<input class='bootbox-input bootbox-input-text form-control' autocomplete=off type=text />",textarea:"<textarea class='bootbox-input bootbox-input-textarea form-control'></textarea>",email:"<input class='bootbox-input bootbox-input-email form-control' autocomplete='off' type='email' />",select:"<select class='bootbox-input bootbox-input-select form-control'></select>",checkbox:"<div class='checkbox'><label><input class='bootbox-input bootbox-input-checkbox' type='checkbox' /></label></div>",date:"<input class='bootbox-input bootbox-input-date form-control' autocomplete=off type='date' />",time:"<input class='bootbox-input bootbox-input-time form-control' autocomplete=off type='time' />",number:"<input class='bootbox-input bootbox-input-number form-control' autocomplete=off type='number' />",password:"<input class='bootbox-input bootbox-input-password form-control' autocomplete='off' type='password' />"}},o={locale:"en",backdrop:"static",animate:!0,className:null,closeButton:!0,show:!0,container:"body"},p={};p.alert=function(){var a;if(a=k("alert",["ok"],["message","callback"],arguments),a.callback&&!b.isFunction(a.callback))throw new Error("alert requires callback property to be a function when provided");return a.buttons.ok.callback=a.onEscape=function(){return b.isFunction(a.callback)?a.callback.call(this):!0},p.dialog(a)},p.confirm=function(){var a;if(a=k("confirm",["cancel","confirm"],["message","callback"],arguments),a.buttons.cancel.callback=a.onEscape=function(){return a.callback.call(this,!1)},a.buttons.confirm.callback=function(){return a.callback.call(this,!0)},!b.isFunction(a.callback))throw new Error("confirm requires a callback");return p.dialog(a)},p.prompt=function(){var a,d,e,f,h,i,k;if(f=b(n.form),d={className:"bootbox-prompt",buttons:l("cancel","confirm"),value:"",inputType:"text"},a=m(j(d,arguments,["title","callback"]),["cancel","confirm"]),i=a.show===c?!0:a.show,a.message=f,a.buttons.cancel.callback=a.onEscape=function(){return a.callback.call(this,null)},a.buttons.confirm.callback=function(){var c;switch(a.inputType){case"text":case"textarea":case"email":case"select":case"date":case"time":case"number":case"password":c=h.val();break;case"checkbox":var d=h.find("input:checked");c=[],g(d,function(a,d){c.push(b(d).val())})}return a.callback.call(this,c)},a.show=!1,!a.title)throw new Error("prompt requires a title");if(!b.isFunction(a.callback))throw new Error("prompt requires a callback");if(!n.inputs[a.inputType])throw new Error("invalid prompt type");switch(h=b(n.inputs[a.inputType]),a.inputType){case"text":case"textarea":case"email":case"date":case"time":case"number":case"password":h.val(a.value);break;case"select":var o={};if(k=a.inputOptions||[],!b.isArray(k))throw new Error("Please pass an array of input options");if(!k.length)throw new Error("prompt with select requires options");g(k,function(a,d){var e=h;if(d.value===c||d.text===c)throw new Error("given options in wrong format");d.group&&(o[d.group]||(o[d.group]=b("<optgroup/>").attr("label",d.group)),e=o[d.group]),e.append("<option value='"+d.value+"'>"+d.text+"</option>")}),g(o,function(a,b){h.append(b)}),h.val(a.value);break;case"checkbox":var q=b.isArray(a.value)?a.value:[a.value];if(k=a.inputOptions||[],!k.length)throw new Error("prompt with checkbox requires options");if(!k[0].value||!k[0].text)throw new Error("given options in wrong format");h=b("<div/>"),g(k,function(c,d){var e=b(n.inputs[a.inputType]);e.find("input").attr("value",d.value),e.find("label").append(d.text),g(q,function(a,b){b===d.value&&e.find("input").prop("checked",!0)}),h.append(e)})}return a.placeholder&&h.attr("placeholder",a.placeholder),a.pattern&&h.attr("pattern",a.pattern),a.maxlength&&h.attr("maxlength",a.maxlength),f.append(h),f.on("submit",function(a){a.preventDefault(),a.stopPropagation(),e.find(".btn-primary").click()}),e=p.dialog(a),e.off("shown.bs.modal"),e.on("shown.bs.modal",function(){h.focus()}),i===!0&&e.modal("show"),e},p.dialog=function(a){a=h(a);var d=b(n.dialog),f=d.find(".modal-dialog"),i=d.find(".modal-body"),j=a.buttons,k="",l={onEscape:a.onEscape};if(b.fn.modal===c)throw new Error("$.fn.modal is not defined; please double check you have included the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ for more details.");if(g(j,function(a,b){k+="<button data-bb-handler='"+a+"' type='button' class='btn "+b.className+"'>"+b.label+"</button>",l[a]=b.callback}),i.find(".bootbox-body").html(a.message),a.animate===!0&&d.addClass("fade"),a.className&&d.addClass(a.className),"large"===a.size?f.addClass("modal-lg"):"small"===a.size&&f.addClass("modal-sm"),a.title&&i.before(n.header),a.closeButton){var m=b(n.closeButton);a.title?d.find(".modal-header").prepend(m):m.css("margin-top","-10px").prependTo(i)}return a.title&&d.find(".modal-title").html(a.title),k.length&&(i.after(n.footer),d.find(".modal-footer").html(k)),d.on("hidden.bs.modal",function(a){a.target===this&&d.remove()}),d.on("shown.bs.modal",function(){d.find(".btn-primary:first").focus()}),"static"!==a.backdrop&&d.on("click.dismiss.bs.modal",function(a){d.children(".modal-backdrop").length&&(a.currentTarget=d.children(".modal-backdrop").get(0)),a.target===a.currentTarget&&d.trigger("escape.close.bb")}),d.on("escape.close.bb",function(a){l.onEscape&&e(a,d,l.onEscape)}),d.on("click",".modal-footer button",function(a){var c=b(this).data("bb-handler");e(a,d,l[c])}),d.on("click",".bootbox-close-button",function(a){e(a,d,l.onEscape)}),d.on("keyup",function(a){27===a.which&&d.trigger("escape.close.bb")}),b(a.container).append(d),d.modal({backdrop:a.backdrop?"static":!1,keyboard:!1,show:!1}),a.show&&d.modal("show"),d},p.setDefaults=function(){var a={};2===arguments.length?a[arguments[0]]=arguments[1]:a=arguments[0],b.extend(o,a)},p.hideAll=function(){return b(".bootbox").modal("hide"),p};var q={bg_BG:{OK:"Ок",CANCEL:"Отказ",CONFIRM:"Потвърждавам"},br:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Sim"},cs:{OK:"OK",CANCEL:"Zrušit",CONFIRM:"Potvrdit"},da:{OK:"OK",CANCEL:"Annuller",CONFIRM:"Accepter"},de:{OK:"OK",CANCEL:"Abbrechen",CONFIRM:"Akzeptieren"},el:{OK:"Εντάξει",CANCEL:"Ακύρωση",CONFIRM:"Επιβεβαίωση"},en:{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"},es:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Aceptar"},et:{OK:"OK",CANCEL:"Katkesta",CONFIRM:"OK"},fa:{OK:"قبول",CANCEL:"لغو",CONFIRM:"تایید"},fi:{OK:"OK",CANCEL:"Peruuta",CONFIRM:"OK"},fr:{OK:"OK",CANCEL:"Annuler",CONFIRM:"D'accord"},he:{OK:"אישור",CANCEL:"ביטול",CONFIRM:"אישור"},hu:{OK:"OK",CANCEL:"Mégsem",CONFIRM:"Megerősít"},hr:{OK:"OK",CANCEL:"Odustani",CONFIRM:"Potvrdi"},id:{OK:"OK",CANCEL:"Batal",CONFIRM:"OK"},it:{OK:"OK",CANCEL:"Annulla",CONFIRM:"Conferma"},ja:{OK:"OK",CANCEL:"キャンセル",CONFIRM:"確認"},lt:{OK:"Gerai",CANCEL:"Atšaukti",CONFIRM:"Patvirtinti"},lv:{OK:"Labi",CANCEL:"Atcelt",CONFIRM:"Apstiprināt"},nl:{OK:"OK",CANCEL:"Annuleren",CONFIRM:"Accepteren"},no:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},pl:{OK:"OK",CANCEL:"Anuluj",CONFIRM:"Potwierdź"},pt:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Confirmar"},ru:{OK:"OK",CANCEL:"Отмена",CONFIRM:"Применить"},sq:{OK:"OK",CANCEL:"Anulo",CONFIRM:"Prano"},sv:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},th:{OK:"ตกลง",CANCEL:"ยกเลิก",CONFIRM:"ยืนยัน"},tr:{OK:"Tamam",CANCEL:"İptal",CONFIRM:"Onayla"},zh_CN:{OK:"OK",CANCEL:"取消",CONFIRM:"确认"},zh_TW:{OK:"OK",CANCEL:"取消",CONFIRM:"確認"}};return p.addLocale=function(a,c){return b.each(["OK","CANCEL","CONFIRM"],function(a,b){if(!c[b])throw new Error("Please supply a translation for '"+b+"'")}),q[a]={OK:c.OK,CANCEL:c.CANCEL,CONFIRM:c.CONFIRM},p},p.removeLocale=function(a){return delete q[a],p},p.setLocale=function(a){return p.setDefaults("locale",a)},p.init=function(c){return a(c||b)},p}); \ No newline at end of file
diff --git a/admportal/public/javascripts/bootstrap-submenu.js b/admportal/public/javascripts/bootstrap-submenu.js
new file mode 100644
index 00000000..7c8e411b
--- /dev/null
+++ b/admportal/public/javascripts/bootstrap-submenu.js
@@ -0,0 +1,185 @@
+/*!
+ * Bootstrap-submenu v2.0.3 (https://vsn4ik.github.io/bootstrap-submenu/)
+ * Copyright 2015 Vasily A. (https://github.com/vsn4ik)
+ * Licensed under the MIT license
+ */
+
+/**
+ * $.inArray: friends with IE8. Use Array.prototype.indexOf in future.
+ * $.proxy: friends with IE8. Use Function.prototype.bind in future.
+ */
+
+'use strict';
+
+(function(factory) {
+ if (typeof define == 'function' && define.amd) {
+ // AMD. Register as an anonymous module
+ define(['jquery'], factory);
+ }
+ else if (typeof exports == 'object') {
+ // Node/CommonJS
+ module.exports = factory(require('jquery'));
+ }
+ else {
+ // Browser globals
+ factory(jQuery);
+ }
+})(function($) {
+ function Item(element) {
+ this.$element = $(element);
+ this.$menu = this.$element.closest('.dropdown-menu');
+ this.$main = this.$menu.parent();
+ this.$items = this.$menu.children('.dropdown-submenu');
+
+ this.init();
+ }
+
+ Item.prototype = {
+ init: function() {
+ this.$element.on('keydown', $.proxy(this, 'keydown'));
+ },
+ close: function() {
+ this.$main.removeClass('open');
+ this.$items.trigger('hide.bs.submenu');
+ },
+ keydown: function(event) {
+ // 27: Esc
+
+ if (event.keyCode == 27) {
+ event.stopPropagation();
+
+ this.close();
+ this.$main.children('a, button').trigger('focus');
+ }
+ }
+ };
+
+ function SubmenuItem(element) {
+ this.$element = $(element);
+ this.$main = this.$element.parent();
+ this.$menu = this.$main.children('.dropdown-menu');
+ this.$subs = this.$main.siblings('.dropdown-submenu');
+ this.$items = this.$menu.children('.dropdown-submenu');
+
+ this.init();
+ }
+
+ $.extend(SubmenuItem.prototype, Item.prototype, {
+ init: function() {
+ this.$element.on({
+ click: $.proxy(this, 'click'),
+ keydown: $.proxy(this, 'keydown')
+ });
+
+ this.$main.on('hide.bs.submenu', $.proxy(this, 'hide'));
+ },
+ click: function(event) {
+ // Fix a[href="#"]. For community
+ event.preventDefault();
+
+ event.stopPropagation();
+
+ this.toggle();
+ },
+ hide: function(event) {
+ // Stop event bubbling
+ event.stopPropagation();
+
+ this.close();
+ },
+ open: function() {
+ this.$main.addClass('open');
+ this.$subs.trigger('hide.bs.submenu');
+ },
+ toggle: function() {
+ if (this.$main.hasClass('open')) {
+ this.close();
+ }
+ else {
+ this.open();
+ }
+ },
+ keydown: function(event) {
+ // 13: Return, 32: Spacebar
+
+ if (event.keyCode == 32) {
+ // Off vertical scrolling
+ event.preventDefault();
+ }
+
+ if ($.inArray(event.keyCode, [13, 32]) != -1) {
+ this.toggle();
+ }
+ }
+ });
+
+ function Submenupicker(element) {
+ this.$element = $(element);
+ this.$main = this.$element.parent();
+ this.$menu = this.$main.children('.dropdown-menu');
+ this.$items = this.$menu.children('.dropdown-submenu');
+
+ this.init();
+ }
+
+ Submenupicker.prototype = {
+ init: function() {
+ this.$menu.off('keydown.bs.dropdown.data-api');
+ this.$menu.on('keydown', $.proxy(this, 'itemKeydown'));
+
+ this.$menu.find('li > a').each(function() {
+ new Item(this);
+ });
+
+ this.$menu.find('.dropdown-submenu > a').each(function() {
+ new SubmenuItem(this);
+ });
+
+ this.$main.on('hidden.bs.dropdown', $.proxy(this, 'hidden'));
+ },
+ hidden: function() {
+ this.$items.trigger('hide.bs.submenu');
+ },
+ itemKeydown: function(event) {
+ // 38: Arrow up, 40: Arrow down
+
+ if ($.inArray(event.keyCode, [38, 40]) != -1) {
+ // Off vertical scrolling
+ event.preventDefault();
+
+ event.stopPropagation();
+
+ var $items = this.$menu.find('li:not(.disabled):visible > a');
+ var index = $items.index(event.target);
+
+ if (event.keyCode == 38 && index !== 0) {
+ index--;
+ }
+ else if (event.keyCode == 40 && index !== $items.length - 1) {
+ index++;
+ }
+ else {
+ return;
+ }
+
+ $items.eq(index).trigger('focus');
+ }
+ }
+ };
+
+ // For AMD/Node/CommonJS used elements (optional)
+ // http://learn.jquery.com/jquery-ui/environments/amd/
+ return $.fn.submenupicker = function(elements) {
+ var $elements = this instanceof $ ? this : $(elements);
+
+ return $elements.each(function() {
+ var data = $.data(this, 'bs.submenu');
+
+ if (!data) {
+ data = new Submenupicker(this);
+
+ $.data(this, 'bs.submenu', data);
+ }
+ });
+ };
+});
diff --git a/admportal/public/javascripts/bootstrap-submenu.min.js b/admportal/public/javascripts/bootstrap-submenu.min.js
new file mode 100644
index 00000000..6293c430
--- /dev/null
+++ b/admportal/public/javascripts/bootstrap-submenu.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-submenu v2.0.3 (https://vsn4ik.github.io/bootstrap-submenu/)
+ * Copyright 2015 Vasily A. (https://github.com/vsn4ik)
+ * Licensed under the MIT license
+ */
+
+"use strict";!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){function b(b){this.$element=a(b),this.$menu=this.$element.closest(".dropdown-menu"),this.$main=this.$menu.parent(),this.$items=this.$menu.children(".dropdown-submenu"),this.init()}function c(b){this.$element=a(b),this.$main=this.$element.parent(),this.$menu=this.$main.children(".dropdown-menu"),this.$subs=this.$main.siblings(".dropdown-submenu"),this.$items=this.$menu.children(".dropdown-submenu"),this.init()}function d(b){this.$element=a(b),this.$main=this.$element.parent(),this.$menu=this.$main.children(".dropdown-menu"),this.$items=this.$menu.children(".dropdown-submenu"),this.init()}return b.prototype={init:function(){this.$element.on("keydown",a.proxy(this,"keydown"))},close:function(){this.$main.removeClass("open"),this.$items.trigger("hide.bs.submenu")},keydown:function(a){27==a.keyCode&&(a.stopPropagation(),this.close(),this.$main.children("a, button").trigger("focus"))}},a.extend(c.prototype,b.prototype,{init:function(){this.$element.on({click:a.proxy(this,"click"),keydown:a.proxy(this,"keydown")}),this.$main.on("hide.bs.submenu",a.proxy(this,"hide"))},click:function(a){a.preventDefault(),a.stopPropagation(),this.toggle()},hide:function(a){a.stopPropagation(),this.close()},open:function(){this.$main.addClass("open"),this.$subs.trigger("hide.bs.submenu")},toggle:function(){this.$main.hasClass("open")?this.close():this.open()},keydown:function(b){32==b.keyCode&&b.preventDefault(),-1!=a.inArray(b.keyCode,[13,32])&&this.toggle()}}),d.prototype={init:function(){this.$menu.off("keydown.bs.dropdown.data-api"),this.$menu.on("keydown",a.proxy(this,"itemKeydown")),this.$menu.find("li > a").each(function(){new b(this)}),this.$menu.find(".dropdown-submenu > a").each(function(){new c(this)}),this.$main.on("hidden.bs.dropdown",a.proxy(this,"hidden"))},hidden:function(){this.$items.trigger("hide.bs.submenu")},itemKeydown:function(b){if(-1!=a.inArray(b.keyCode,[38,40])){b.preventDefault(),b.stopPropagation();var c=this.$menu.find("li:not(.disabled):visible > a"),d=c.index(b.target);if(38==b.keyCode&&0!==d)d--;else{if(40!=b.keyCode||d===c.length-1)return;d++}c.eq(d).trigger("focus")}}},a.fn.submenupicker=function(b){var c=this instanceof a?this:a(b);return c.each(function(){var b=a.data(this,"bs.submenu");b||(b=new d(this),a.data(this,"bs.submenu",b))})}}); \ No newline at end of file
diff --git a/admportal/public/javascripts/bootstrap-table.js b/admportal/public/javascripts/bootstrap-table.js
new file mode 100644
index 00000000..f8715e9c
--- /dev/null
+++ b/admportal/public/javascripts/bootstrap-table.js
@@ -0,0 +1,2690 @@
+/**
+ * @author zhixin wen <wenzhixin2010@gmail.com>
+ * version: 1.9.1
+ * https://github.com/wenzhixin/bootstrap-table/
+ */
+
+!function ($) {
+ 'use strict';
+
+ // TOOLS DEFINITION
+ // ======================
+
+ var cachedWidth = null;
+
+ // it only does '%s', and return '' when arguments are undefined
+ var sprintf = function (str) {
+ var args = arguments,
+ flag = true,
+ i = 1;
+
+ str = str.replace(/%s/g, function () {
+ var arg = args[i++];
+
+ if (typeof arg === 'undefined') {
+ flag = false;
+ return '';
+ }
+ return arg;
+ });
+ return flag ? str : '';
+ };
+
+ var getPropertyFromOther = function (list, from, to, value) {
+ var result = '';
+ $.each(list, function (i, item) {
+ if (item[from] === value) {
+ result = item[to];
+ return false;
+ }
+ return true;
+ });
+ return result;
+ };
+
+ var getFieldIndex = function (columns, field) {
+ var index = -1;
+
+ $.each(columns, function (i, column) {
+ if (column.field === field) {
+ index = i;
+ return false;
+ }
+ return true;
+ });
+ return index;
+ };
+
+ // http://jsfiddle.net/wenyi/47nz7ez9/3/
+ var setFieldIndex = function (columns) {
+ var i, j, k,
+ totalCol = 0,
+ flag = [];
+
+ for (i = 0; i < columns[0].length; i++) {
+ totalCol += columns[0][i].colspan || 1;
+ }
+
+ for (i = 0; i < columns.length; i++) {
+ flag[i] = [];
+ for (j = 0; j < totalCol; j++) {
+ flag[i][j] = false;
+ }
+ }
+
+ for (i = 0; i < columns.length; i++) {
+ for (j = 0; j < columns[i].length; j++) {
+ var r = columns[i][j],
+ rowspan = r.rowspan || 1,
+ colspan = r.colspan || 1,
+ index = $.inArray(false, flag[i]);
+
+ if (colspan === 1) {
+ r.fieldIndex = index;
+ // when field is undefined, use index instead
+ if (typeof r.field === 'undefined') {
+ r.field = index;
+ }
+ }
+
+ for (k = 0; k < rowspan; k++) {
+ flag[i + k][index] = true;
+ }
+ for (k = 0; k < colspan; k++) {
+ flag[i][index + k] = true;
+ }
+ }
+ }
+ };
+
+ var getScrollBarWidth = function () {
+ if (cachedWidth === null) {
+ var inner = $('<p/>').addClass('fixed-table-scroll-inner'),
+ outer = $('<div/>').addClass('fixed-table-scroll-outer'),
+ w1, w2;
+
+ outer.append(inner);
+ $('body').append(outer);
+
+ w1 = inner[0].offsetWidth;
+ outer.css('overflow', 'scroll');
+ w2 = inner[0].offsetWidth;
+
+ if (w1 === w2) {
+ w2 = outer[0].clientWidth;
+ }
+
+ outer.remove();
+ cachedWidth = w1 - w2;
+ }
+ return cachedWidth;
+ };
+
+ var calculateObjectValue = function (self, name, args, defaultValue) {
+ var func = name;
+
+ if (typeof name === 'string') {
+ // support obj.func1.func2
+ var names = name.split('.');
+
+ if (names.length > 1) {
+ func = window;
+ $.each(names, function (i, f) {
+ func = func[f];
+ });
+ } else {
+ func = window[name];
+ }
+ }
+ if (typeof func === 'object') {
+ return func;
+ }
+ if (typeof func === 'function') {
+ return func.apply(self, args);
+ }
+ if (!func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) {
+ return sprintf.apply(this, [name].concat(args));
+ }
+ return defaultValue;
+ };
+
+ var compareObjects = function (objectA, objectB, compareLength) {
+ // Create arrays of property names
+ var objectAProperties = Object.getOwnPropertyNames(objectA),
+ objectBProperties = Object.getOwnPropertyNames(objectB),
+ propName = '';
+
+ if (compareLength) {
+ // If number of properties is different, objects are not equivalent
+ if (objectAProperties.length !== objectBProperties.length) {
+ return false;
+ }
+ }
+
+ for (var i = 0; i < objectAProperties.length; i++) {
+ propName = objectAProperties[i];
+
+ // If the property is not in the object B properties, continue with the next property
+ if ($.inArray(propName, objectBProperties) > -1) {
+ // If values of same property are not equal, objects are not equivalent
+ if (objectA[propName] !== objectB[propName]) {
+ return false;
+ }
+ }
+ }
+
+ // If we made it this far, objects are considered equivalent
+ return true;
+ };
+
+ var escapeHTML = function (text) {
+ if (typeof text === 'string') {
+ return text
+ .replace(/&/g, "&amp;")
+ .replace(/</g, "&lt;")
+ .replace(/>/g, "&gt;")
+ .replace(/"/g, "&quot;")
+ .replace(/'/g, "&#039;");
+ }
+ return text;
+ };
+
+ var getRealHeight = function ($el) {
+ var height = 0;
+ $el.children().each(function () {
+ if (height < $(this).outerHeight(true)) {
+ height = $(this).outerHeight(true);
+ }
+ });
+ return height;
+ };
+
+ var getRealDataAttr = function (dataAttr) {
+ for (var attr in dataAttr) {
+ var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase();
+ if (auxAttr !== attr) {
+ dataAttr[auxAttr] = dataAttr[attr];
+ delete dataAttr[attr];
+ }
+ }
+
+ return dataAttr;
+ };
+
+ var getItemField = function (item, field) {
+ var value = item;
+
+ if (typeof field !== 'string' || item.hasOwnProperty(field)) {
+ return item[field];
+ }
+ var props = field.split('.');
+ for (var p in props) {
+ value = value[props[p]];
+ }
+ return value;
+ };
+
+ // BOOTSTRAP TABLE CLASS DEFINITION
+ // ======================
+
+ var BootstrapTable = function (el, options) {
+ this.options = options;
+ this.$el = $(el);
+ this.$el_ = this.$el.clone();
+ this.timeoutId_ = 0;
+ this.timeoutFooter_ = 0;
+
+ this.init();
+ };
+
+ BootstrapTable.DEFAULTS = {
+ classes: 'table table-hover',
+ locale: undefined,
+ height: undefined,
+ undefinedText: '-',
+ sortName: undefined,
+ sortOrder: 'asc',
+ striped: false,
+ columns: [[]],
+ data: [],
+ dataField: 'rows',
+ method: 'get',
+ url: undefined,
+ ajax: undefined,
+ cache: true,
+ contentType: 'application/json',
+ dataType: 'json',
+ ajaxOptions: {},
+ queryParams: function (params) {
+ return params;
+ },
+ queryParamsType: 'limit', // undefined
+ responseHandler: function (res) {
+ return res;
+ },
+ pagination: false,
+ onlyInfoPagination: false,
+ sidePagination: 'client', // client or server
+ totalRows: 0, // server side need to set
+ pageNumber: 1,
+ pageSize: 10,
+ pageList: [10, 25, 50, 100],
+ paginationHAlign: 'right', //right, left
+ paginationVAlign: 'bottom', //bottom, top, both
+ paginationDetailHAlign: 'left', //right, left
+ paginationFirstText: '&laquo;',
+ paginationPreText: '&lsaquo;',
+ paginationNextText: '&rsaquo;',
+ paginationLastText: '&raquo;',
+ search: false,
+ strictSearch: false,
+ searchAlign: 'right',
+ selectItemName: 'btSelectItem',
+ showHeader: true,
+ showFooter: false,
+ showColumns: false,
+ showPaginationSwitch: false,
+ showRefresh: false,
+ showToggle: false,
+ buttonsAlign: 'right',
+ smartDisplay: true,
+ minimumCountColumns: 1,
+ idField: undefined,
+ uniqueId: undefined,
+ cardView: false,
+ detailView: false,
+ detailFormatter: function (index, row) {
+ return '';
+ },
+ trimOnSearch: true,
+ clickToSelect: false,
+ singleSelect: false,
+ toolbar: undefined,
+ toolbarAlign: 'left',
+ checkboxHeader: true,
+ sortable: true,
+ silentSort: true,
+ maintainSelected: false,
+ searchTimeOut: 500,
+ searchText: '',
+ iconSize: undefined,
+ iconsPrefix: 'glyphicon', // glyphicon of fa (font awesome)
+ icons: {
+ paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down',
+ paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up',
+ refresh: 'glyphicon-refresh icon-refresh',
+ toggle: 'glyphicon-list-alt icon-list-alt',
+ columns: 'glyphicon-th icon-th',
+ detailOpen: 'glyphicon-plus icon-plus',
+ detailClose: 'glyphicon-minus icon-minus'
+ },
+
+ rowStyle: function (row, index) {
+ return {};
+ },
+
+ rowAttributes: function (row, index) {
+ return {};
+ },
+
+ onAll: function (name, args) {
+ return false;
+ },
+ onClickCell: function (field, value, row, $element) {
+ return false;
+ },
+ onDblClickCell: function (field, value, row, $element) {
+ return false;
+ },
+ onClickRow: function (item, $element) {
+ return false;
+ },
+ onDblClickRow: function (item, $element) {
+ return false;
+ },
+ onSort: function (name, order) {
+ return false;
+ },
+ onCheck: function (row) {
+ return false;
+ },
+ onUncheck: function (row) {
+ return false;
+ },
+ onCheckAll: function (rows) {
+ return false;
+ },
+ onUncheckAll: function (rows) {
+ return false;
+ },
+ onCheckSome: function (rows) {
+ return false;
+ },
+ onUncheckSome: function (rows) {
+ return false;
+ },
+ onLoadSuccess: function (data) {
+ return false;
+ },
+ onLoadError: function (status) {
+ return false;
+ },
+ onColumnSwitch: function (field, checked) {
+ return false;
+ },
+ onPageChange: function (number, size) {
+ return false;
+ },
+ onSearch: function (text) {
+ return false;
+ },
+ onToggle: function (cardView) {
+ return false;
+ },
+ onPreBody: function (data) {
+ return false;
+ },
+ onPostBody: function () {
+ return false;
+ },
+ onPostHeader: function () {
+ return false;
+ },
+ onExpandRow: function (index, row, $detail) {
+ return false;
+ },
+ onCollapseRow: function (index, row) {
+ return false;
+ },
+ onRefreshOptions: function (options) {
+ return false;
+ },
+ onResetView: function () {
+ return false;
+ }
+ };
+
+ BootstrapTable.LOCALES = [];
+
+ BootstrapTable.LOCALES['en-US'] = BootstrapTable.LOCALES['en'] = {
+ formatLoadingMessage: function () {
+ return 'Loading, please wait...';
+ },
+ formatRecordsPerPage: function (pageNumber) {
+ return sprintf('%s records per page', pageNumber);
+ },
+ formatShowingRows: function (pageFrom, pageTo, totalRows) {
+ return sprintf('Showing %s to %s of %s rows', pageFrom, pageTo, totalRows);
+ },
+ formatDetailPagination: function (totalRows) {
+ return sprintf('Showing %s rows', totalRows);
+ },
+ formatSearch: function () {
+ return 'Search';
+ },
+ formatNoMatches: function () {
+ return 'No matching records found';
+ },
+ formatPaginationSwitch: function () {
+ return 'Hide/Show pagination';
+ },
+ formatRefresh: function () {
+ return 'Refresh';
+ },
+ formatToggle: function () {
+ return 'Toggle';
+ },
+ formatColumns: function () {
+ return 'Columns';
+ },
+ formatAllRows: function () {
+ return 'All';
+ }
+ };
+
+ $.extend(BootstrapTable.DEFAULTS, BootstrapTable.LOCALES['en-US']);
+
+ BootstrapTable.COLUMN_DEFAULTS = {
+ radio: false,
+ checkbox: false,
+ checkboxEnabled: true,
+ field: undefined,
+ title: undefined,
+ titleTooltip: undefined,
+ 'class': undefined,
+ align: undefined, // left, right, center
+ halign: undefined, // left, right, center
+ falign: undefined, // left, right, center
+ valign: undefined, // top, middle, bottom
+ width: undefined,
+ sortable: false,
+ order: 'asc', // asc, desc
+ visible: true,
+ switchable: true,
+ clickToSelect: true,
+ formatter: undefined,
+ footerFormatter: undefined,
+ events: undefined,
+ sorter: undefined,
+ sortName: undefined,
+ cellStyle: undefined,
+ searchable: true,
+ searchFormatter: true,
+ cardVisible: true
+ };
+
+ BootstrapTable.EVENTS = {
+ 'all.bs.table': 'onAll',
+ 'click-cell.bs.table': 'onClickCell',
+ 'dbl-click-cell.bs.table': 'onDblClickCell',
+ 'click-row.bs.table': 'onClickRow',
+ 'dbl-click-row.bs.table': 'onDblClickRow',
+ 'sort.bs.table': 'onSort',
+ 'check.bs.table': 'onCheck',
+ 'uncheck.bs.table': 'onUncheck',
+ 'check-all.bs.table': 'onCheckAll',
+ 'uncheck-all.bs.table': 'onUncheckAll',
+ 'check-some.bs.table': 'onCheckSome',
+ 'uncheck-some.bs.table': 'onUncheckSome',
+ 'load-success.bs.table': 'onLoadSuccess',
+ 'load-error.bs.table': 'onLoadError',
+ 'column-switch.bs.table': 'onColumnSwitch',
+ 'page-change.bs.table': 'onPageChange',
+ 'search.bs.table': 'onSearch',
+ 'toggle.bs.table': 'onToggle',
+ 'pre-body.bs.table': 'onPreBody',
+ 'post-body.bs.table': 'onPostBody',
+ 'post-header.bs.table': 'onPostHeader',
+ 'expand-row.bs.table': 'onExpandRow',
+ 'collapse-row.bs.table': 'onCollapseRow',
+ 'refresh-options.bs.table': 'onRefreshOptions',
+ 'reset-view.bs.table': 'onResetView'
+ };
+
+ BootstrapTable.prototype.init = function () {
+ this.initLocale();
+ this.initContainer();
+ this.initTable();
+ this.initHeader();
+ this.initData();
+ this.initFooter();
+ this.initToolbar();
+ this.initPagination();
+ this.initBody();
+ this.initSearchText();
+ this.initServer();
+ };
+
+ BootstrapTable.prototype.initLocale = function () {
+ if (this.options.locale) {
+ var parts = this.options.locale.split(/-|_/);
+ parts[0].toLowerCase();
+ parts[1] && parts[1].toUpperCase();
+ if ($.fn.bootstrapTable.locales[this.options.locale]) {
+ // locale as requested
+ $.extend(this.options, $.fn.bootstrapTable.locales[this.options.locale]);
+ } else if ($.fn.bootstrapTable.locales[parts.join('-')]) {
+ // locale with sep set to - (in case original was specified with _)
+ $.extend(this.options, $.fn.bootstrapTable.locales[parts.join('-')]);
+ } else if ($.fn.bootstrapTable.locales[parts[0]]) {
+ // short locale language code (i.e. 'en')
+ $.extend(this.options, $.fn.bootstrapTable.locales[parts[0]]);
+ }
+ }
+ };
+
+ BootstrapTable.prototype.initContainer = function () {
+ this.$container = $([
+ '<div class="bootstrap-table">',
+ '<div class="fixed-table-toolbar"></div>',
+ this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?
+ '<div class="fixed-table-pagination" style="clear: both;"></div>' :
+ '',
+ '<div class="fixed-table-container">',
+ '<div class="fixed-table-header"><table></table></div>',
+ '<div class="fixed-table-body">',
+ '<div class="fixed-table-loading">',
+ this.options.formatLoadingMessage(),
+ '</div>',
+ '</div>',
+ '<div class="fixed-table-footer"><table><tr></tr></table></div>',
+ this.options.paginationVAlign === 'bottom' || this.options.paginationVAlign === 'both' ?
+ '<div class="fixed-table-pagination"></div>' :
+ '',
+ '</div>',
+ '</div>'
+ ].join(''));
+
+ this.$container.insertAfter(this.$el);
+ this.$tableContainer = this.$container.find('.fixed-table-container');
+ this.$tableHeader = this.$container.find('.fixed-table-header');
+ this.$tableBody = this.$container.find('.fixed-table-body');
+ this.$tableLoading = this.$container.find('.fixed-table-loading');
+ this.$tableFooter = this.$container.find('.fixed-table-footer');
+ this.$toolbar = this.$container.find('.fixed-table-toolbar');
+ this.$pagination = this.$container.find('.fixed-table-pagination');
+
+ this.$tableBody.append(this.$el);
+ this.$container.after('<div class="clearfix"></div>');
+
+ this.$el.addClass(this.options.classes);
+ if (this.options.striped) {
+ this.$el.addClass('table-striped');
+ }
+ if ($.inArray('table-no-bordered', this.options.classes.split(' ')) !== -1) {
+ this.$tableContainer.addClass('table-no-bordered');
+ }
+ };
+
+ BootstrapTable.prototype.initTable = function () {
+ var that = this,
+ columns = [],
+ data = [];
+
+ this.$header = this.$el.find('>thead');
+ if (!this.$header.length) {
+ this.$header = $('<thead></thead>').appendTo(this.$el);
+ }
+ this.$header.find('tr').each(function () {
+ var column = [];
+
+ $(this).find('th').each(function () {
+ column.push($.extend({}, {
+ title: $(this).html(),
+ 'class': $(this).attr('class'),
+ titleTooltip: $(this).attr('title'),
+ rowspan: $(this).attr('rowspan') ? +$(this).attr('rowspan') : undefined,
+ colspan: $(this).attr('colspan') ? +$(this).attr('colspan') : undefined
+ }, $(this).data()));
+ });
+ columns.push(column);
+ });
+ if (!$.isArray(this.options.columns[0])) {
+ this.options.columns = [this.options.columns];
+ }
+ this.options.columns = $.extend(true, [], columns, this.options.columns);
+ this.columns = [];
+
+ setFieldIndex(this.options.columns);
+ $.each(this.options.columns, function (i, columns) {
+ $.each(columns, function (j, column) {
+ column = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, column);
+
+ if (typeof column.fieldIndex !== 'undefined') {
+ that.columns[column.fieldIndex] = column;
+ }
+
+ that.options.columns[i][j] = column;
+ });
+ });
+
+ // if options.data is setting, do not process tbody data
+ if (this.options.data.length) {
+ return;
+ }
+
+ this.$el.find('>tbody>tr').each(function () {
+ var row = {};
+
+ // save tr's id, class and data-* attributes
+ row._id = $(this).attr('id');
+ row._class = $(this).attr('class');
+ row._data = getRealDataAttr($(this).data());
+
+ $(this).find('td').each(function (i) {
+ var field = that.columns[i].field;
+
+ row[field] = $(this).html();
+ // save td's id, class and data-* attributes
+ row['_' + field + '_id'] = $(this).attr('id');
+ row['_' + field + '_class'] = $(this).attr('class');
+ row['_' + field + '_rowspan'] = $(this).attr('rowspan');
+ row['_' + field + '_title'] = $(this).attr('title');
+ row['_' + field + '_data'] = getRealDataAttr($(this).data());
+ });
+ data.push(row);
+ });
+ this.options.data = data;
+ };
+
+ BootstrapTable.prototype.initHeader = function () {
+ var that = this,
+ visibleColumns = {},
+ html = [];
+
+ this.header = {
+ fields: [],
+ styles: [],
+ classes: [],
+ formatters: [],
+ events: [],
+ sorters: [],
+ sortNames: [],
+ cellStyles: [],
+ searchables: []
+ };
+
+ $.each(this.options.columns, function (i, columns) {
+ html.push('<tr>');
+
+ if (i == 0 && !that.options.cardView && that.options.detailView) {
+ html.push(sprintf('<th class="detail" rowspan="%s"><div class="fht-cell"></div></th>',
+ that.options.columns.length));
+ }
+
+ $.each(columns, function (j, column) {
+ var text = '',
+ halign = '', // header align style
+ align = '', // body align style
+ style = '',
+ class_ = sprintf(' class="%s"', column['class']),
+ order = that.options.sortOrder || column.order,
+ unitWidth = 'px',
+ width = column.width;
+
+ if (column.width !== undefined && (!that.options.cardView)) {
+ if (typeof column.width === 'string') {
+ if (column.width.indexOf('%') !== -1) {
+ unitWidth = '%';
+ }
+ }
+ }
+ if (column.width && typeof column.width === 'string') {
+ width = column.width.replace('%', '').replace('px', '');
+ }
+
+ halign = sprintf('text-align: %s; ', column.halign ? column.halign : column.align);
+ align = sprintf('text-align: %s; ', column.align);
+ style = sprintf('vertical-align: %s; ', column.valign);
+ style += sprintf('width: %s; ', (column.checkbox || column.radio) && !width ?
+ '36px' : (width ? width + unitWidth : undefined));
+
+ if (typeof column.fieldIndex !== 'undefined') {
+ that.header.fields[column.fieldIndex] = column.field;
+ that.header.styles[column.fieldIndex] = align + style;
+ that.header.classes[column.fieldIndex] = class_;
+ that.header.formatters[column.fieldIndex] = column.formatter;
+ that.header.events[column.fieldIndex] = column.events;
+ that.header.sorters[column.fieldIndex] = column.sorter;
+ that.header.sortNames[column.fieldIndex] = column.sortName;
+ that.header.cellStyles[column.fieldIndex] = column.cellStyle;
+ that.header.searchables[column.fieldIndex] = column.searchable;
+
+ if (!column.visible) {
+ return;
+ }
+
+ if (that.options.cardView && (!column.cardVisible)) {
+ return;
+ }
+
+ visibleColumns[column.field] = column;
+ }
+
+ html.push('<th' + sprintf(' title="%s"', column.titleTooltip),
+ column.checkbox || column.radio ?
+ sprintf(' class="bs-checkbox %s"', column['class'] || '') :
+ class_,
+ sprintf(' style="%s"', halign + style),
+ sprintf(' rowspan="%s"', column.rowspan),
+ sprintf(' colspan="%s"', column.colspan),
+ sprintf(' data-field="%s"', column.field),
+ "tabindex='0'",
+ '>');
+
+ html.push(sprintf('<div class="th-inner %s">', that.options.sortable && column.sortable ?
+ 'sortable both' : ''));
+
+ text = column.title;
+
+ if (column.checkbox) {
+ if (!that.options.singleSelect && that.options.checkboxHeader) {
+ text = '<input name="btSelectAll" type="checkbox" />';
+ }
+ that.header.stateField = column.field;
+ }
+ if (column.radio) {
+ text = '';
+ that.header.stateField = column.field;
+ that.options.singleSelect = true;
+ }
+
+ html.push(text);
+ html.push('</div>');
+ html.push('<div class="fht-cell"></div>');
+ html.push('</div>');
+ html.push('</th>');
+ });
+ html.push('</tr>');
+ });
+
+ this.$header.html(html.join(''));
+ this.$header.find('th[data-field]').each(function (i) {
+ $(this).data(visibleColumns[$(this).data('field')]);
+ });
+ this.$container.off('click', '.th-inner').on('click', '.th-inner', function (event) {
+ if (that.options.sortable && $(this).parent().data().sortable) {
+ that.onSort(event);
+ }
+ });
+
+ this.$header.children().children().off('keypress').on('keypress', function (event) {
+ if (that.options.sortable && $(this).data().sortable) {
+ var code = event.keyCode || event.which;
+ if (code == 13) { //Enter keycode
+ that.onSort(event);
+ }
+ }
+ });
+
+ if (!this.options.showHeader || this.options.cardView) {
+ this.$header.hide();
+ this.$tableHeader.hide();
+ this.$tableLoading.css('top', 0);
+ } else {
+ this.$header.show();
+ this.$tableHeader.show();
+ this.$tableLoading.css('top', this.$header.outerHeight() + 1);
+ // Assign the correct sortable arrow
+ this.getCaret();
+ }
+
+ this.$selectAll = this.$header.find('[name="btSelectAll"]');
+ this.$container.off('click', '[name="btSelectAll"]')
+ .on('click', '[name="btSelectAll"]', function () {
+ var checked = $(this).prop('checked');
+ that[checked ? 'checkAll' : 'uncheckAll']();
+ that.updateSelected();
+ });
+ };
+
+ BootstrapTable.prototype.initFooter = function () {
+ if (!this.options.showFooter || this.options.cardView) {
+ this.$tableFooter.hide();
+ } else {
+ this.$tableFooter.show();
+ }
+ };
+
+ /**
+ * @param data
+ * @param type: append / prepend
+ */
+ BootstrapTable.prototype.initData = function (data, type) {
+ if (type === 'append') {
+ this.data = this.data.concat(data);
+ } else if (type === 'prepend') {
+ this.data = [].concat(data).concat(this.data);
+ } else {
+ this.data = data || this.options.data;
+ }
+
+ // Fix #839 Records deleted when adding new row on filtered table
+ if (type === 'append') {
+ this.options.data = this.options.data.concat(data);
+ } else if (type === 'prepend') {
+ this.options.data = [].concat(data).concat(this.options.data);
+ } else {
+ this.options.data = this.data;
+ }
+
+ if (this.options.sidePagination === 'server') {
+ return;
+ }
+ this.initSort();
+ };
+
+ BootstrapTable.prototype.initSort = function () {
+ var that = this,
+ name = this.options.sortName,
+ order = this.options.sortOrder === 'desc' ? -1 : 1,
+ index = $.inArray(this.options.sortName, this.header.fields);
+
+ if (index !== -1) {
+ this.data.sort(function (a, b) {
+ if (that.header.sortNames[index]) {
+ name = that.header.sortNames[index];
+ }
+ var aa = getItemField(a, name),
+ bb = getItemField(b, name),
+ value = calculateObjectValue(that.header, that.header.sorters[index], [aa, bb]);
+
+ if (value !== undefined) {
+ return order * value;
+ }
+
+ // Fix #161: undefined or null string sort bug.
+ if (aa === undefined || aa === null) {
+ aa = '';
+ }
+ if (bb === undefined || bb === null) {
+ bb = '';
+ }
+
+ // IF both values are numeric, do a numeric comparison
+ if ($.isNumeric(aa) && $.isNumeric(bb)) {
+ // Convert numerical values form string to float.
+ aa = parseFloat(aa);
+ bb = parseFloat(bb);
+ if (aa < bb) {
+ return order * -1;
+ }
+ return order;
+ }
+
+ if (aa === bb) {
+ return 0;
+ }
+
+ // If value is not a string, convert to string
+ if (typeof aa !== 'string') {
+ aa = aa.toString();
+ }
+
+ if (aa.localeCompare(bb) === -1) {
+ return order * -1;
+ }
+
+ return order;
+ });
+ }
+ };
+
+ BootstrapTable.prototype.onSort = function (event) {
+ var $this = event.type === "keypress" ? $(event.currentTarget) : $(event.currentTarget).parent(),
+ $this_ = this.$header.find('th').eq($this.index());
+
+ this.$header.add(this.$header_).find('span.order').remove();
+
+ if (this.options.sortName === $this.data('field')) {
+ this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc';
+ } else {
+ this.options.sortName = $this.data('field');
+ this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc';
+ }
+ this.trigger('sort', this.options.sortName, this.options.sortOrder);
+
+ $this.add($this_).data('order', this.options.sortOrder);
+
+ // Assign the correct sortable arrow
+ this.getCaret();
+
+ if (this.options.sidePagination === 'server') {
+ this.initServer(this.options.silentSort);
+ return;
+ }
+
+ this.initSort();
+ this.initBody();
+ };
+
+ BootstrapTable.prototype.initToolbar = function () {
+ var that = this,
+ html = [],
+ timeoutId = 0,
+ $keepOpen,
+ $search,
+ switchableCount = 0;
+
+ this.$toolbar.html('');
+
+ if (typeof this.options.toolbar === 'string' || typeof this.options.toolbar === 'object') {
+ $(sprintf('<div class="bars pull-%s"></div>', this.options.toolbarAlign))
+ .appendTo(this.$toolbar)
+ .append($(this.options.toolbar));
+ }
+
+ // showColumns, showToggle, showRefresh
+ html = [sprintf('<div class="columns columns-%s btn-group pull-%s">',
+ this.options.buttonsAlign, this.options.buttonsAlign)];
+
+ if (typeof this.options.icons === 'string') {
+ this.options.icons = calculateObjectValue(null, this.options.icons);
+ }
+
+ if (this.options.showPaginationSwitch) {
+ html.push(sprintf('<button class="btn btn-default" type="button" name="paginationSwitch" title="%s">',
+ this.options.formatPaginationSwitch()),
+ sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.paginationSwitchDown),
+ '</button>');
+ }
+
+ if (this.options.showRefresh) {
+ html.push(sprintf('<button class="btn btn-default' +
+ sprintf(' btn-%s', this.options.iconSize) +
+ '" type="button" name="refresh" title="%s">',
+ this.options.formatRefresh()),
+ sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.refresh),
+ '</button>');
+ }
+
+ if (this.options.showToggle) {
+ html.push(sprintf('<button class="btn btn-default' +
+ sprintf(' btn-%s', this.options.iconSize) +
+ '" type="button" name="toggle" title="%s">',
+ this.options.formatToggle()),
+ sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.toggle),
+ '</button>');
+ }
+
+ if (this.options.showColumns) {
+ html.push(sprintf('<div class="keep-open btn-group" title="%s">',
+ this.options.formatColumns()),
+ '<button type="button" class="btn btn-default' +
+ sprintf(' btn-%s', this.options.iconSize) +
+ ' dropdown-toggle" data-toggle="dropdown">',
+ sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.columns),
+ ' <span class="caret"></span>',
+ '</button>',
+ '<ul class="dropdown-menu" role="menu">');
+
+ $.each(this.columns, function (i, column) {
+ if (column.radio || column.checkbox) {
+ return;
+ }
+
+ if (that.options.cardView && (!column.cardVisible)) {
+ return;
+ }
+
+ var checked = column.visible ? ' checked="checked"' : '';
+
+ if (column.switchable) {
+ html.push(sprintf('<li>' +
+ '<label><input type="checkbox" data-field="%s" value="%s"%s> %s</label>' +
+ '</li>', column.field, i, checked, column.title));
+ switchableCount++;
+ }
+ });
+ html.push('</ul>',
+ '</div>');
+ }
+
+ html.push('</div>');
+
+ // Fix #188: this.showToolbar is for extentions
+ if (this.showToolbar || html.length > 2) {
+ this.$toolbar.append(html.join(''));
+ }
+
+ if (this.options.showPaginationSwitch) {
+ this.$toolbar.find('button[name="paginationSwitch"]')
+ .off('click').on('click', $.proxy(this.togglePagination, this));
+ }
+
+ if (this.options.showRefresh) {
+ this.$toolbar.find('button[name="refresh"]')
+ .off('click').on('click', $.proxy(this.refresh, this));
+ }
+
+ if (this.options.showToggle) {
+ this.$toolbar.find('button[name="toggle"]')
+ .off('click').on('click', function () {
+ that.toggleView();
+ });
+ }
+
+ if (this.options.showColumns) {
+ $keepOpen = this.$toolbar.find('.keep-open');
+
+ if (switchableCount <= this.options.minimumCountColumns) {
+ $keepOpen.find('input').prop('disabled', true);
+ }
+
+ $keepOpen.find('li').off('click').on('click', function (event) {
+ event.stopImmediatePropagation();
+ });
+ $keepOpen.find('input').off('click').on('click', function () {
+ var $this = $(this);
+
+ that.toggleColumn(getFieldIndex(that.columns,
+ $(this).data('field')), $this.prop('checked'), false);
+ that.trigger('column-switch', $(this).data('field'), $this.prop('checked'));
+ });
+ }
+
+ if (this.options.search) {
+ html = [];
+ html.push(
+ '<div class="pull-' + this.options.searchAlign + ' search">',
+ sprintf('<input class="form-control' +
+ sprintf(' input-%s', this.options.iconSize) +
+ '" type="text" placeholder="%s">',
+ this.options.formatSearch()),
+ '</div>');
+
+ this.$toolbar.append(html.join(''));
+ $search = this.$toolbar.find('.search input');
+ $search.off('keyup drop').on('keyup drop', function (event) {
+ clearTimeout(timeoutId); // doesn't matter if it's 0
+ timeoutId = setTimeout(function () {
+ that.onSearch(event);
+ }, that.options.searchTimeOut);
+ });
+ }
+ };
+
+ BootstrapTable.prototype.onSearch = function (event) {
+ var text = $.trim($(event.currentTarget).val());
+
+ // trim search input
+ if (this.options.trimOnSearch && $(event.currentTarget).val() !== text) {
+ $(event.currentTarget).val(text);
+ }
+
+ if (text === this.searchText) {
+ return;
+ }
+ this.searchText = text;
+
+ this.options.pageNumber = 1;
+ this.initSearch();
+ this.updatePagination();
+ this.trigger('search', text);
+ };
+
+ BootstrapTable.prototype.initSearch = function () {
+ var that = this;
+
+ if (this.options.sidePagination !== 'server') {
+ var s = this.searchText && this.searchText.toLowerCase();
+ var f = $.isEmptyObject(this.filterColumns) ? null : this.filterColumns;
+
+ // Check filter
+ this.data = f ? $.grep(this.options.data, function (item, i) {
+ for (var key in f) {
+ if ($.isArray(f[key])) {
+ if ($.inArray(item[key], f[key]) === -1) {
+ return false;
+ }
+ } else if (item[key] !== f[key]) {
+ return false;
+ }
+ }
+ return true;
+ }) : this.options.data;
+
+ this.data = s ? $.grep(this.data, function (item, i) {
+ for (var key in item) {
+ key = $.isNumeric(key) ? parseInt(key, 10) : key;
+ var value = item[key],
+ column = that.columns[getFieldIndex(that.columns, key)],
+ j = $.inArray(key, that.header.fields);
+
+ // Fix #142: search use formated data
+ if (column && column.searchFormatter) {
+ value = calculateObjectValue(column,
+ that.header.formatters[j], [value, item, i], value);
+ }
+
+ var index = $.inArray(key, that.header.fields);
+ if (index !== -1 && that.header.searchables[index] && (typeof value === 'string' || typeof value === 'number')) {
+ if (that.options.strictSearch) {
+ if ((value + '').toLowerCase() === s) {
+ return true;
+ }
+ } else {
+ if ((value + '').toLowerCase().indexOf(s) !== -1) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }) : this.data;
+ }
+ };
+
+ BootstrapTable.prototype.initPagination = function () {
+ if (!this.options.pagination) {
+ this.$pagination.hide();
+ return;
+ } else {
+ this.$pagination.show();
+ }
+
+ var that = this,
+ html = [],
+ $allSelected = false,
+ i, from, to,
+ $pageList,
+ $first, $pre,
+ $next, $last,
+ $number,
+ data = this.getData();
+
+ if (this.options.sidePagination !== 'server') {
+ this.options.totalRows = data.length;
+ }
+
+ this.totalPages = 0;
+ if (this.options.totalRows) {
+ if (this.options.pageSize === this.options.formatAllRows()) {
+ this.options.pageSize = this.options.totalRows;
+ $allSelected = true;
+ } else if (this.options.pageSize === this.options.totalRows) {
+ // Fix #667 Table with pagination,
+ // multiple pages and a search that matches to one page throws exception
+ var pageLst = typeof this.options.pageList === 'string' ?
+ this.options.pageList.replace('[', '').replace(']', '')
+ .replace(/ /g, '').toLowerCase().split(',') : this.options.pageList;
+ if ($.inArray(this.options.formatAllRows().toLowerCase(), pageLst) > -1) {
+ $allSelected = true;
+ }
+ }
+
+ this.totalPages = ~~((this.options.totalRows - 1) / this.options.pageSize) + 1;
+
+ this.options.totalPages = this.totalPages;
+ }
+ if (this.totalPages > 0 && this.options.pageNumber > this.totalPages) {
+ this.options.pageNumber = this.totalPages;
+ }
+
+ this.pageFrom = (this.options.pageNumber - 1) * this.options.pageSize + 1;
+ this.pageTo = this.options.pageNumber * this.options.pageSize;
+ if (this.pageTo > this.options.totalRows) {
+ this.pageTo = this.options.totalRows;
+ }
+
+ html.push(
+ '<div class="pull-' + this.options.paginationDetailHAlign + ' pagination-detail">',
+ '<span class="pagination-info">',
+ this.options.onlyInfoPagination ? this.options.formatDetailPagination(this.options.totalRows) :
+ this.options.formatShowingRows(this.pageFrom, this.pageTo, this.options.totalRows),
+ '</span>');
+
+ if (!this.options.onlyInfoPagination) {
+ html.push('<span class="page-list">');
+
+ var pageNumber = [
+ sprintf('<span class="btn-group %s">',
+ this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?
+ 'dropdown' : 'dropup'),
+ '<button type="button" class="btn btn-default ' +
+ sprintf(' btn-%s', this.options.iconSize) +
+ ' dropdown-toggle" data-toggle="dropdown">',
+ '<span class="page-size">',
+ $allSelected ? this.options.formatAllRows() : this.options.pageSize,
+ '</span>',
+ ' <span class="caret"></span>',
+ '</button>',
+ '<ul class="dropdown-menu" role="menu">'
+ ],
+ pageList = this.options.pageList;
+
+ if (typeof this.options.pageList === 'string') {
+ var list = this.options.pageList.replace('[', '').replace(']', '')
+ .replace(/ /g, '').split(',');
+
+ pageList = [];
+ $.each(list, function (i, value) {
+ pageList.push(value.toUpperCase() === that.options.formatAllRows().toUpperCase() ?
+ that.options.formatAllRows() : +value);
+ });
+ }
+
+ $.each(pageList, function (i, page) {
+ if (!that.options.smartDisplay || i === 0 || pageList[i - 1] <= that.options.totalRows) {
+ var active;
+ if ($allSelected) {
+ active = page === that.options.formatAllRows() ? ' class="active"' : '';
+ } else {
+ active = page === that.options.pageSize ? ' class="active"' : '';
+ }
+ pageNumber.push(sprintf('<li%s><a href="javascript:void(0)">%s</a></li>', active, page));
+ }
+ });
+ pageNumber.push('</ul></span>');
+
+ html.push(this.options.formatRecordsPerPage(pageNumber.join('')));
+ html.push('</span>');
+
+ html.push('</div>',
+ '<div class="pull-' + this.options.paginationHAlign + ' pagination">',
+ '<ul class="pagination' + sprintf(' pagination-%s', this.options.iconSize) + '">',
+ '<li class="page-first"><a href="javascript:void(0)">' + this.options.paginationFirstText + '</a></li>',
+ '<li class="page-pre"><a href="javascript:void(0)">' + this.options.paginationPreText + '</a></li>');
+
+ if (this.totalPages < 5) {
+ from = 1;
+ to = this.totalPages;
+ } else {
+ from = this.options.pageNumber - 2;
+ to = from + 4;
+ if (from < 1) {
+ from = 1;
+ to = 5;
+ }
+ if (to > this.totalPages) {
+ to = this.totalPages;
+ from = to - 4;
+ }
+ }
+ for (i = from; i <= to; i++) {
+ html.push('<li class="page-number' + (i === this.options.pageNumber ? ' active' : '') + '">',
+ '<a href="javascript:void(0)">', i, '</a>',
+ '</li>');
+ }
+
+ html.push(
+ '<li class="page-next"><a href="javascript:void(0)">' + this.options.paginationNextText + '</a></li>',
+ '<li class="page-last"><a href="javascript:void(0)">' + this.options.paginationLastText + '</a></li>',
+ '</ul>',
+ '</div>');
+
+ }
+ this.$pagination.html(html.join(''));
+
+ if (!this.options.onlyInfoPagination) {
+ $pageList = this.$pagination.find('.page-list a');
+ $first = this.$pagination.find('.page-first');
+ $pre = this.$pagination.find('.page-pre');
+ $next = this.$pagination.find('.page-next');
+ $last = this.$pagination.find('.page-last');
+ $number = this.$pagination.find('.page-number');
+
+ if (this.options.pageNumber <= 1) {
+ $first.addClass('disabled');
+ $pre.addClass('disabled');
+ }
+ if (this.options.pageNumber >= this.totalPages) {
+ $next.addClass('disabled');
+ $last.addClass('disabled');
+ }
+ if (this.options.smartDisplay) {
+ if (this.totalPages <= 1) {
+ this.$pagination.find('div.pagination').hide();
+ }
+ if (pageList.length < 2 || this.options.totalRows <= pageList[0]) {
+ this.$pagination.find('span.page-list').hide();
+ }
+
+ // when data is empty, hide the pagination
+ this.$pagination[this.getData().length ? 'show' : 'hide']();
+ }
+ if ($allSelected) {
+ this.options.pageSize = this.options.formatAllRows();
+ }
+ $pageList.off('click').on('click', $.proxy(this.onPageListChange, this));
+ $first.off('click').on('click', $.proxy(this.onPageFirst, this));
+ $pre.off('click').on('click', $.proxy(this.onPagePre, this));
+ $next.off('click').on('click', $.proxy(this.onPageNext, this));
+ $last.off('click').on('click', $.proxy(this.onPageLast, this));
+ $number.off('click').on('click', $.proxy(this.onPageNumber, this));
+ }
+ };
+
+ BootstrapTable.prototype.updatePagination = function (event) {
+ // Fix #171: IE disabled button can be clicked bug.
+ if (event && $(event.currentTarget).hasClass('disabled')) {
+ return;
+ }
+
+ if (!this.options.maintainSelected) {
+ this.resetRows();
+ }
+
+ this.initPagination();
+ if (this.options.sidePagination === 'server') {
+ this.initServer();
+ } else {
+ this.initBody();
+ }
+
+ this.trigger('page-change', this.options.pageNumber, this.options.pageSize);
+ };
+
+ BootstrapTable.prototype.onPageListChange = function (event) {
+ var $this = $(event.currentTarget);
+
+ $this.parent().addClass('active').siblings().removeClass('active');
+ this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ?
+ this.options.formatAllRows() : +$this.text();
+ this.$toolbar.find('.page-size').text(this.options.pageSize);
+
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.onPageFirst = function (event) {
+ this.options.pageNumber = 1;
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.onPagePre = function (event) {
+ this.options.pageNumber--;
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.onPageNext = function (event) {
+ this.options.pageNumber++;
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.onPageLast = function (event) {
+ this.options.pageNumber = this.totalPages;
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.onPageNumber = function (event) {
+ if (this.options.pageNumber === +$(event.currentTarget).text()) {
+ return;
+ }
+ this.options.pageNumber = +$(event.currentTarget).text();
+ this.updatePagination(event);
+ };
+
+ BootstrapTable.prototype.initBody = function (fixedScroll) {
+ var that = this,
+ html = [],
+ data = this.getData();
+
+ this.trigger('pre-body', data);
+
+ this.$body = this.$el.find('>tbody');
+ if (!this.$body.length) {
+ this.$body = $('<tbody></tbody>').appendTo(this.$el);
+ }
+
+ //Fix #389 Bootstrap-table-flatJSON is not working
+
+ if (!this.options.pagination || this.options.sidePagination === 'server') {
+ this.pageFrom = 1;
+ this.pageTo = data.length;
+ }
+
+ for (var i = this.pageFrom - 1; i < this.pageTo; i++) {
+ var key,
+ item = data[i],
+ style = {},
+ csses = [],
+ data_ = '',
+ attributes = {},
+ htmlAttributes = [];
+
+ style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);
+
+ if (style && style.css) {
+ for (key in style.css) {
+ csses.push(key + ': ' + style.css[key]);
+ }
+ }
+
+ attributes = calculateObjectValue(this.options,
+ this.options.rowAttributes, [item, i], attributes);
+
+ if (attributes) {
+ for (key in attributes) {
+ htmlAttributes.push(sprintf('%s="%s"', key, escapeHTML(attributes[key])));
+ }
+ }
+
+ if (item._data && !$.isEmptyObject(item._data)) {
+ $.each(item._data, function (k, v) {
+ // ignore data-index
+ if (k === 'index') {
+ return;
+ }
+ data_ += sprintf(' data-%s="%s"', k, v);
+ });
+ }
+
+ html.push('<tr',
+ sprintf(' %s', htmlAttributes.join(' ')),
+ sprintf(' id="%s"', $.isArray(item) ? undefined : item._id),
+ sprintf(' class="%s"', style.classes || ($.isArray(item) ? undefined : item._class)),
+ sprintf(' data-index="%s"', i),
+ sprintf(' data-uniqueid="%s"', item[this.options.uniqueId]),
+ sprintf('%s', data_),
+ '>'
+ );
+
+ if (this.options.cardView) {
+ html.push(sprintf('<td colspan="%s">', this.header.fields.length));
+ }
+
+ if (!this.options.cardView && this.options.detailView) {
+ html.push('<td>',
+ '<a class="detail-icon" href="javascript:">',
+ sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.detailOpen),
+ '</a>',
+ '</td>');
+ }
+
+ $.each(this.header.fields, function (j, field) {
+ var text = '',
+ value = getItemField(item, field),
+ type = '',
+ cellStyle = {},
+ id_ = '',
+ class_ = that.header.classes[j],
+ data_ = '',
+ rowspan_ = '',
+ title_ = '',
+ column = that.columns[getFieldIndex(that.columns, field)];
+
+ if (!column.visible) {
+ return;
+ }
+
+ style = sprintf('style="%s"', csses.concat(that.header.styles[j]).join('; '));
+
+ value = calculateObjectValue(column,
+ that.header.formatters[j], [value, item, i], value);
+
+ // handle td's id and class
+ if (item['_' + field + '_id']) {
+ id_ = sprintf(' id="%s"', item['_' + field + '_id']);
+ }
+ if (item['_' + field + '_class']) {
+ class_ = sprintf(' class="%s"', item['_' + field + '_class']);
+ }
+ if (item['_' + field + '_rowspan']) {
+ rowspan_ = sprintf(' rowspan="%s"', item['_' + field + '_rowspan']);
+ }
+ if (item['_' + field + '_title']) {
+ title_ = sprintf(' title="%s"', item['_' + field + '_title']);
+ }
+ cellStyle = calculateObjectValue(that.header,
+ that.header.cellStyles[j], [value, item, i], cellStyle);
+ if (cellStyle.classes) {
+ class_ = sprintf(' class="%s"', cellStyle.classes);
+ }
+ if (cellStyle.css) {
+ var csses_ = [];
+ for (var key in cellStyle.css) {
+ csses_.push(key + ': ' + cellStyle.css[key]);
+ }
+ style = sprintf('style="%s"', csses_.concat(that.header.styles[j]).join('; '));
+ }
+
+ if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) {
+ $.each(item['_' + field + '_data'], function (k, v) {
+ // ignore data-index
+ if (k === 'index') {
+ return;
+ }
+ data_ += sprintf(' data-%s="%s"', k, v);
+ });
+ }
+
+ if (column.checkbox || column.radio) {
+ type = column.checkbox ? 'checkbox' : type;
+ type = column.radio ? 'radio' : type;
+
+ text = [that.options.cardView ?
+ '<div class="card-view">' : '<td class="bs-checkbox">',
+ '<input' +
+ sprintf(' data-index="%s"', i) +
+ sprintf(' name="%s"', that.options.selectItemName) +
+ sprintf(' type="%s"', type) +
+ sprintf(' value="%s"', item[that.options.idField]) +
+ sprintf(' checked="%s"', value === true ||
+ (value && value.checked) ? 'checked' : undefined) +
+ sprintf(' disabled="%s"', !column.checkboxEnabled ||
+ (value && value.disabled) ? 'disabled' : undefined) +
+ ' />',
+ that.header.formatters[j] && typeof value === 'string' ? value : '',
+ that.options.cardView ? '</div>' : '</td>'
+ ].join('');
+
+ item[that.header.stateField] = value === true || (value && value.checked);
+ } else {
+ value = typeof value === 'undefined' || value === null ?
+ that.options.undefinedText : value;
+
+ text = that.options.cardView ? ['<div class="card-view">',
+ that.options.showHeader ? sprintf('<span class="title" %s>%s</span>', style,
+ getPropertyFromOther(that.columns, 'field', 'title', field)) : '',
+ sprintf('<span class="value">%s</span>', value),
+ '</div>'
+ ].join('') : [sprintf('<td%s %s %s %s %s %s>', id_, class_, style, data_, rowspan_, title_),
+ value,
+ '</td>'
+ ].join('');
+
+ // Hide empty data on Card view when smartDisplay is set to true.
+ if (that.options.cardView && that.options.smartDisplay && value === '') {
+ // Should set a placeholder for event binding correct fieldIndex
+ text = '<div class="card-view"></div>';
+ }
+ }
+
+ html.push(text);
+ });
+
+ if (this.options.cardView) {
+ html.push('</td>');
+ }
+
+ html.push('</tr>');
+ }
+
+ // show no records
+ if (!html.length) {
+ html.push('<tr class="no-records-found">',
+ sprintf('<td colspan="%s">%s</td>',
+ this.$header.find('th').length, this.options.formatNoMatches()),
+ '</tr>');
+ }
+
+ this.$body.html(html.join(''));
+
+ if (!fixedScroll) {
+ this.scrollTo(0);
+ }
+
+ // click to select by column
+ this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {
+ var $td = $(this),
+ $tr = $td.parent(),
+ item = that.data[$tr.data('index')],
+ index = $td[0].cellIndex,
+ field = that.header.fields[that.options.detailView && !that.options.cardView ? index - 1 : index],
+ column = that.columns[getFieldIndex(that.columns, field)],
+ value = getItemField(item, field);
+
+ if ($td.find('.detail-icon').length) {
+ return;
+ }
+
+ that.trigger(e.type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td);
+ that.trigger(e.type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr);
+
+ // if click to select - then trigger the checkbox/radio click
+ if (e.type === 'click' && that.options.clickToSelect && column.clickToSelect) {
+ var $selectItem = $tr.find(sprintf('[name="%s"]', that.options.selectItemName));
+ if ($selectItem.length) {
+ $selectItem[0].click(); // #144: .trigger('click') bug
+ }
+ }
+ });
+
+ this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function () {
+ var $this = $(this),
+ $tr = $this.parent().parent(),
+ index = $tr.data('index'),
+ row = data[index]; // Fix #980 Detail view, when searching, returns wrong row
+
+ // remove and update
+ if ($tr.next().is('tr.detail-view')) {
+ $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailOpen));
+ $tr.next().remove();
+ that.trigger('collapse-row', index, row);
+ } else {
+ $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailClose));
+ $tr.after(sprintf('<tr class="detail-view"><td colspan="%s">%s</td></tr>',
+ $tr.find('td').length, calculateObjectValue(that.options,
+ that.options.detailFormatter, [index, row], '')));
+ that.trigger('expand-row', index, row, $tr.next().find('td'));
+ }
+ that.resetView();
+ });
+
+ this.$selectItem = this.$body.find(sprintf('[name="%s"]', this.options.selectItemName));
+ this.$selectItem.off('click').on('click', function (event) {
+ event.stopImmediatePropagation();
+
+ var $this = $(this),
+ checked = $this.prop('checked'),
+ row = that.data[$this.data('index')];
+
+ if (that.options.maintainSelected && $(this).is(':radio')) {
+ $.each(that.options.data, function (i, row) {
+ row[that.header.stateField] = false;
+ });
+ }
+
+ row[that.header.stateField] = checked;
+
+ if (that.options.singleSelect) {
+ that.$selectItem.not(this).each(function () {
+ that.data[$(this).data('index')][that.header.stateField] = false;
+ });
+ that.$selectItem.filter(':checked').not(this).prop('checked', false);
+ }
+
+ that.updateSelected();
+ that.trigger(checked ? 'check' : 'uncheck', row, $this);
+ });
+
+ $.each(this.header.events, function (i, events) {
+ if (!events) {
+ return;
+ }
+ // fix bug, if events is defined with namespace
+ if (typeof events === 'string') {
+ events = calculateObjectValue(null, events);
+ }
+
+ var field = that.header.fields[i],
+ fieldIndex = $.inArray(field, that.getVisibleFields());
+
+ if (that.options.detailView && !that.options.cardView) {
+ fieldIndex += 1;
+ }
+
+ for (var key in events) {
+ that.$body.find('>tr:not(.no-records-found)').each(function () {
+ var $tr = $(this),
+ $td = $tr.find(that.options.cardView ? '.card-view' : 'td').eq(fieldIndex),
+ index = key.indexOf(' '),
+ name = key.substring(0, index),
+ el = key.substring(index + 1),
+ func = events[key];
+
+ $td.find(el).off(name).on(name, function (e) {
+ var index = $tr.data('index'),
+ row = that.data[index],
+ value = row[field];
+
+ func.apply(this, [e, value, row, index]);
+ });
+ });
+ }
+ });
+
+ this.updateSelected();
+ this.resetView();
+
+ this.trigger('post-body');
+ };
+
+ BootstrapTable.prototype.initServer = function (silent, query) {
+ var that = this,
+ data = {},
+ params = {
+ pageSize: this.options.pageSize === this.options.formatAllRows() ?
+ this.options.totalRows : this.options.pageSize,
+ pageNumber: this.options.pageNumber,
+ searchText: this.searchText,
+ sortName: this.options.sortName,
+ sortOrder: this.options.sortOrder
+ },
+ request;
+
+ if (!this.options.url && !this.options.ajax) {
+ return;
+ }
+
+ if (this.options.queryParamsType === 'limit') {
+ params = {
+ search: params.searchText,
+ sort: params.sortName,
+ order: params.sortOrder
+ };
+ if (this.options.pagination) {
+ params.limit = this.options.pageSize === this.options.formatAllRows() ?
+ this.options.totalRows : this.options.pageSize;
+ params.offset = this.options.pageSize === this.options.formatAllRows() ?
+ 0 : this.options.pageSize * (this.options.pageNumber - 1);
+ }
+ }
+
+ if (!($.isEmptyObject(this.filterColumnsPartial))) {
+ params['filter'] = JSON.stringify(this.filterColumnsPartial, null);
+ }
+
+ data = calculateObjectValue(this.options, this.options.queryParams, [params], data);
+
+ $.extend(data, query || {});
+
+ // false to stop request
+ if (data === false) {
+ return;
+ }
+
+ if (!silent) {
+ this.$tableLoading.show();
+ }
+ request = $.extend({}, calculateObjectValue(null, this.options.ajaxOptions), {
+ type: this.options.method,
+ url: this.options.url,
+ data: this.options.contentType === 'application/json' && this.options.method === 'post' ?
+ JSON.stringify(data) : data,
+ cache: this.options.cache,
+ contentType: this.options.contentType,
+ dataType: this.options.dataType,
+ success: function (res) {
+ res = calculateObjectValue(that.options, that.options.responseHandler, [res], res);
+
+ that.load(res);
+ that.trigger('load-success', res);
+ },
+ error: function (res) {
+ that.trigger('load-error', res.status, res);
+ },
+ complete: function () {
+ if (!silent) {
+ that.$tableLoading.hide();
+ }
+ }
+ });
+
+ if (this.options.ajax) {
+ calculateObjectValue(this, this.options.ajax, [request], null);
+ } else {
+ $.ajax(request);
+ }
+ };
+
+ BootstrapTable.prototype.initSearchText = function () {
+ if (this.options.search) {
+ if (this.options.searchText !== '') {
+ var $search = this.$toolbar.find('.search input');
+ $search.val(this.options.searchText);
+ this.onSearch({currentTarget: $search});
+ }
+ }
+ };
+
+ BootstrapTable.prototype.getCaret = function () {
+ var that = this;
+
+ $.each(this.$header.find('th'), function (i, th) {
+ $(th).find('.sortable').removeClass('desc asc').addClass($(th).data('field') === that.options.sortName ? that.options.sortOrder : 'both');
+ });
+ };
+
+ BootstrapTable.prototype.updateSelected = function () {
+ var checkAll = this.$selectItem.filter(':enabled').length &&
+ this.$selectItem.filter(':enabled').length ===
+ this.$selectItem.filter(':enabled').filter(':checked').length;
+
+ this.$selectAll.add(this.$selectAll_).prop('checked', checkAll);
+
+ this.$selectItem.each(function () {
+ $(this).closest('tr')[$(this).prop('checked') ? 'addClass' : 'removeClass']('selected');
+ });
+ };
+
+ BootstrapTable.prototype.updateRows = function () {
+ var that = this;
+
+ this.$selectItem.each(function () {
+ that.data[$(this).data('index')][that.header.stateField] = $(this).prop('checked');
+ });
+ };
+
+ BootstrapTable.prototype.resetRows = function () {
+ var that = this;
+
+ $.each(this.data, function (i, row) {
+ that.$selectAll.prop('checked', false);
+ that.$selectItem.prop('checked', false);
+ if (that.header.stateField) {
+ row[that.header.stateField] = false;
+ }
+ });
+ };
+
+ BootstrapTable.prototype.trigger = function (name) {
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ name += '.bs.table';
+ this.options[BootstrapTable.EVENTS[name]].apply(this.options, args);
+ this.$el.trigger($.Event(name), args);
+
+ this.options.onAll(name, args);
+ this.$el.trigger($.Event('all.bs.table'), [name, args]);
+ };
+
+ BootstrapTable.prototype.resetHeader = function () {
+ // fix #61: the hidden table reset header bug.
+ // fix bug: get $el.css('width') error sometime (height = 500)
+ clearTimeout(this.timeoutId_);
+ this.timeoutId_ = setTimeout($.proxy(this.fitHeader, this), this.$el.is(':hidden') ? 100 : 0);
+ };
+
+ BootstrapTable.prototype.fitHeader = function () {
+ var that = this,
+ fixedBody,
+ scrollWidth,
+ focused,
+ focusedTemp;
+
+ if (that.$el.is(':hidden')) {
+ that.timeoutId_ = setTimeout($.proxy(that.fitHeader, that), 100);
+ return;
+ }
+ fixedBody = this.$tableBody.get(0);
+
+ scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth &&
+ fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ?
+ getScrollBarWidth() : 0;
+
+ this.$el.css('margin-top', -this.$header.outerHeight());
+
+ focused = $(':focus');
+ if (focused.length > 0) {
+ var $th = focused.parents('th');
+ if ($th.length > 0) {
+ var dataField = $th.attr('data-field');
+ if (dataField !== undefined) {
+ var $headerTh = this.$header.find("[data-field='" + dataField + "']");
+ if ($headerTh.length > 0) {
+ $headerTh.find(":input").addClass("focus-temp");
+ }
+ }
+ }
+ }
+
+ this.$header_ = this.$header.clone(true, true);
+ this.$selectAll_ = this.$header_.find('[name="btSelectAll"]');
+ this.$tableHeader.css({
+ 'margin-right': scrollWidth
+ }).find('table').css('width', this.$el.outerWidth())
+ .html('').attr('class', this.$el.attr('class'))
+ .append(this.$header_);
+
+
+ focusedTemp = $('.focus-temp:visible:eq(0)');
+ if (focusedTemp.length > 0) {
+ focusedTemp.focus();
+ this.$header.find('.focus-temp').removeClass('focus-temp');
+ }
+
+ // fix bug: $.data() is not working as expected after $.append()
+ this.$header.find('th[data-field]').each(function (i) {
+ that.$header_.find(sprintf('th[data-field="%s"]', $(this).data('field'))).data($(this).data());
+ });
+
+ var visibleFields = this.getVisibleFields();
+
+ this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {
+ var $this = $(this),
+ index = i;
+
+ if (that.options.detailView && !that.options.cardView) {
+ if (i === 0) {
+ that.$header_.find('th.detail').find('.fht-cell').width($this.innerWidth());
+ }
+ index = i - 1;
+ }
+
+ that.$header_.find(sprintf('th[data-field="%s"]', visibleFields[index]))
+ .find('.fht-cell').width($this.innerWidth());
+ });
+ // horizontal scroll event
+ // TODO: it's probably better improving the layout than binding to scroll event
+ this.$tableBody.off('scroll').on('scroll', function () {
+ that.$tableHeader.scrollLeft($(this).scrollLeft());
+
+ if (that.options.showFooter && !that.options.cardView) {
+ that.$tableFooter.scrollLeft($(this).scrollLeft());
+ }
+ });
+ that.trigger('post-header');
+ };
+
+ BootstrapTable.prototype.resetFooter = function () {
+ var that = this,
+ data = that.getData(),
+ html = [];
+
+ if (!this.options.showFooter || this.options.cardView) { //do nothing
+ return;
+ }
+
+ if (!this.options.cardView && this.options.detailView) {
+ html.push('<td><div class="th-inner">&nbsp;</div><div class="fht-cell"></div></td>');
+ }
+
+ $.each(this.columns, function (i, column) {
+ var falign = '', // footer align style
+ style = '',
+ class_ = sprintf(' class="%s"', column['class']);
+
+ if (!column.visible) {
+ return;
+ }
+
+ if (that.options.cardView && (!column.cardVisible)) {
+ return;
+ }
+
+ falign = sprintf('text-align: %s; ', column.falign ? column.falign : column.align);
+ style = sprintf('vertical-align: %s; ', column.valign);
+
+ html.push('<td', class_, sprintf(' style="%s"', falign + style), '>');
+ html.push('<div class="th-inner">');
+
+ html.push(calculateObjectValue(column, column.footerFormatter, [data], '&nbsp;') || '&nbsp;');
+
+ html.push('</div>');
+ html.push('<div class="fht-cell"></div>');
+ html.push('</div>');
+ html.push('</td>');
+ });
+
+ this.$tableFooter.find('tr').html(html.join(''));
+ clearTimeout(this.timeoutFooter_);
+ this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this),
+ this.$el.is(':hidden') ? 100 : 0);
+ };
+
+ BootstrapTable.prototype.fitFooter = function () {
+ var that = this,
+ $footerTd,
+ elWidth,
+ scrollWidth;
+
+ clearTimeout(this.timeoutFooter_);
+ if (this.$el.is(':hidden')) {
+ this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), 100);
+ return;
+ }
+
+ elWidth = this.$el.css('width');
+ scrollWidth = elWidth > this.$tableBody.width() ? getScrollBarWidth() : 0;
+
+ this.$tableFooter.css({
+ 'margin-right': scrollWidth
+ }).find('table').css('width', elWidth)
+ .attr('class', this.$el.attr('class'));
+
+ $footerTd = this.$tableFooter.find('td');
+
+ this.$body.find('>tr:first-child:not(.no-records-found) > *').each(function (i) {
+ var $this = $(this);
+
+ $footerTd.eq(i).find('.fht-cell').width($this.innerWidth());
+ });
+ };
+
+ BootstrapTable.prototype.toggleColumn = function (index, checked, needUpdate) {
+ if (index === -1) {
+ return;
+ }
+ this.columns[index].visible = checked;
+ this.initHeader();
+ this.initSearch();
+ this.initPagination();
+ this.initBody();
+
+ if (this.options.showColumns) {
+ var $items = this.$toolbar.find('.keep-open input').prop('disabled', false);
+
+ if (needUpdate) {
+ $items.filter(sprintf('[value="%s"]', index)).prop('checked', checked);
+ }
+
+ if ($items.filter(':checked').length <= this.options.minimumCountColumns) {
+ $items.filter(':checked').prop('disabled', true);
+ }
+ }
+ };
+
+ BootstrapTable.prototype.toggleRow = function (index, uniqueId, visible) {
+ if (index === -1) {
+ return;
+ }
+
+ this.$body.find(typeof index !== 'undefined' ?
+ sprintf('tr[data-index="%s"]', index) :
+ sprintf('tr[data-uniqueid="%s"]', uniqueId))
+ [visible ? 'show' : 'hide']();
+ };
+
+ BootstrapTable.prototype.getVisibleFields = function () {
+ var that = this,
+ visibleFields = [];
+
+ $.each(this.header.fields, function (j, field) {
+ var column = that.columns[getFieldIndex(that.columns, field)];
+
+ if (!column.visible) {
+ return;
+ }
+ visibleFields.push(field);
+ });
+ return visibleFields;
+ };
+
+ // PUBLIC FUNCTION DEFINITION
+ // =======================
+
+ BootstrapTable.prototype.resetView = function (params) {
+ var padding = 0;
+
+ if (params && params.height) {
+ this.options.height = params.height;
+ }
+
+ this.$selectAll.prop('checked', this.$selectItem.length > 0 &&
+ this.$selectItem.length === this.$selectItem.filter(':checked').length);
+
+ if (this.options.height) {
+ var toolbarHeight = getRealHeight(this.$toolbar),
+ paginationHeight = getRealHeight(this.$pagination),
+ height = this.options.height - toolbarHeight - paginationHeight;
+
+ this.$tableContainer.css('height', height + 'px');
+ }
+
+ if (this.options.cardView) {
+ // remove the element css
+ this.$el.css('margin-top', '0');
+ this.$tableContainer.css('padding-bottom', '0');
+ return;
+ }
+
+ if (this.options.showHeader && this.options.height) {
+ this.$tableHeader.show();
+ this.resetHeader();
+ padding += this.$header.outerHeight();
+ } else {
+ this.$tableHeader.hide();
+ this.trigger('post-header');
+ }
+
+ if (this.options.showFooter) {
+ this.resetFooter();
+ if (this.options.height) {
+ padding += this.$tableFooter.outerHeight() + 1;
+ }
+ }
+
+ // Assign the correct sortable arrow
+ this.getCaret();
+ this.$tableContainer.css('padding-bottom', padding + 'px');
+ this.trigger('reset-view');
+ };
+
+ BootstrapTable.prototype.getData = function (useCurrentPage) {
+ return (this.searchText || !$.isEmptyObject(this.filterColumns) || !$.isEmptyObject(this.filterColumnsPartial)) ?
+ (useCurrentPage ? this.data.slice(this.pageFrom - 1, this.pageTo) : this.data) :
+ (useCurrentPage ? this.options.data.slice(this.pageFrom - 1, this.pageTo) : this.options.data);
+ };
+
+ BootstrapTable.prototype.load = function (data) {
+ var fixedScroll = false;
+
+ // #431: support pagination
+ if (this.options.sidePagination === 'server') {
+ this.options.totalRows = data.total;
+ fixedScroll = data.fixedScroll;
+ data = data[this.options.dataField];
+ } else if (!$.isArray(data)) { // support fixedScroll
+ fixedScroll = data.fixedScroll;
+ data = data.data;
+ }
+
+ this.initData(data);
+ this.initSearch();
+ this.initPagination();
+ this.initBody(fixedScroll);
+ };
+
+ BootstrapTable.prototype.append = function (data) {
+ this.initData(data, 'append');
+ this.initSearch();
+ this.initPagination();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.prepend = function (data) {
+ this.initData(data, 'prepend');
+ this.initSearch();
+ this.initPagination();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.remove = function (params) {
+ var len = this.options.data.length,
+ i, row;
+
+ if (!params.hasOwnProperty('field') || !params.hasOwnProperty('values')) {
+ return;
+ }
+
+ for (i = len - 1; i >= 0; i--) {
+ row = this.options.data[i];
+
+ if (!row.hasOwnProperty(params.field)) {
+ continue;
+ }
+ if ($.inArray(row[params.field], params.values) !== -1) {
+ this.options.data.splice(i, 1);
+ }
+ }
+
+ if (len === this.options.data.length) {
+ return;
+ }
+
+ this.initSearch();
+ this.initPagination();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.removeAll = function () {
+ if (this.options.data.length > 0) {
+ this.options.data.splice(0, this.options.data.length);
+ this.initSearch();
+ this.initPagination();
+ this.initBody(true);
+ }
+ };
+
+ BootstrapTable.prototype.getRowByUniqueId = function (id) {
+ var uniqueId = this.options.uniqueId,
+ len = this.options.data.length,
+ dataRow = null,
+ i, row, rowUniqueId;
+
+ for (i = len - 1; i >= 0; i--) {
+ row = this.options.data[i];
+
+ if (row.hasOwnProperty(uniqueId)) { // uniqueId is a column
+ rowUniqueId = row[uniqueId];
+ } else if(row._data.hasOwnProperty(uniqueId)) { // uniqueId is a row data property
+ rowUniqueId = row._data[uniqueId];
+ } else {
+ continue;
+ }
+
+ if (typeof rowUniqueId === 'string') {
+ id = id.toString();
+ } else if (typeof rowUniqueId === 'number') {
+ if ((Number(rowUniqueId) === rowUniqueId) && (rowUniqueId % 1 === 0)) {
+ id = parseInt(id);
+ } else if ((rowUniqueId === Number(rowUniqueId)) && (rowUniqueId !== 0)) {
+ id = parseFloat(id);
+ }
+ }
+
+ if (rowUniqueId === id) {
+ dataRow = row;
+ break;
+ }
+ }
+
+ return dataRow;
+ };
+
+ BootstrapTable.prototype.removeByUniqueId = function (id) {
+ var len = this.options.data.length,
+ row = this.getRowByUniqueId(id);
+
+ if (row) {
+ this.options.data.splice(this.options.data.indexOf(row), 1);
+ }
+
+ if (len === this.options.data.length) {
+ return;
+ }
+
+ this.initSearch();
+ this.initPagination();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.updateByUniqueId = function (params) {
+ var rowId;
+
+ if (!params.hasOwnProperty('id') || !params.hasOwnProperty('row')) {
+ return;
+ }
+
+ rowId = $.inArray(this.getRowByUniqueId(params.id), this.options.data);
+
+ if (rowId === -1) {
+ return;
+ }
+
+ $.extend(this.data[rowId], params.row);
+ this.initSort();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.insertRow = function (params) {
+ if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {
+ return;
+ }
+ this.data.splice(params.index, 0, params.row);
+ this.initSearch();
+ this.initPagination();
+ this.initSort();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.updateRow = function (params) {
+ if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {
+ return;
+ }
+ $.extend(this.data[params.index], params.row);
+ this.initSort();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.showRow = function (params) {
+ if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {
+ return;
+ }
+ this.toggleRow(params.index, params.uniqueId, true);
+ };
+
+ BootstrapTable.prototype.hideRow = function (params) {
+ if (!params.hasOwnProperty('index') || !params.hasOwnProperty('uniqueId')) {
+ return;
+ }
+ this.toggleRow(params.index, params.uniqueId, false);
+ };
+
+ BootstrapTable.prototype.getRowsHidden = function (show) {
+ var rows = $(this.$body[0]).children().filter(':hidden'),
+ i = 0;
+ if (show) {
+ for (; i < rows.length; i++) {
+ $(rows[i]).show();
+ }
+ }
+ return rows;
+ };
+
+ BootstrapTable.prototype.mergeCells = function (options) {
+ var row = options.index,
+ col = $.inArray(options.field, this.getVisibleFields()),
+ rowspan = options.rowspan || 1,
+ colspan = options.colspan || 1,
+ i, j,
+ $tr = this.$body.find('>tr'),
+ $td;
+
+ if (this.options.detailView && !this.options.cardView) {
+ col += 1;
+ }
+
+ $td = $tr.eq(row).find('>td').eq(col);
+
+ if (row < 0 || col < 0 || row >= this.data.length) {
+ return;
+ }
+
+ for (i = row; i < row + rowspan; i++) {
+ for (j = col; j < col + colspan; j++) {
+ $tr.eq(i).find('>td').eq(j).hide();
+ }
+ }
+
+ $td.attr('rowspan', rowspan).attr('colspan', colspan).show();
+ };
+
+ BootstrapTable.prototype.updateCell = function (params) {
+ if (!params.hasOwnProperty('index') ||
+ !params.hasOwnProperty('field') ||
+ !params.hasOwnProperty('value')) {
+ return;
+ }
+ this.data[params.index][params.field] = params.value;
+ this.initSort();
+ this.initBody(true);
+ };
+
+ BootstrapTable.prototype.getOptions = function () {
+ return this.options;
+ };
+
+ BootstrapTable.prototype.getSelections = function () {
+ var that = this;
+
+ return $.grep(this.data, function (row) {
+ return row[that.header.stateField];
+ });
+ };
+
+ BootstrapTable.prototype.getAllSelections = function () {
+ var that = this;
+
+ return $.grep(this.options.data, function (row) {
+ return row[that.header.stateField];
+ });
+ };
+
+ BootstrapTable.prototype.checkAll = function () {
+ this.checkAll_(true);
+ };
+
+ BootstrapTable.prototype.uncheckAll = function () {
+ this.checkAll_(false);
+ };
+
+ BootstrapTable.prototype.checkAll_ = function (checked) {
+ var rows;
+ if (!checked) {
+ rows = this.getSelections();
+ }
+ this.$selectAll.add(this.$selectAll_).prop('checked', checked);
+ this.$selectItem.filter(':enabled').prop('checked', checked);
+ this.updateRows();
+ if (checked) {
+ rows = this.getSelections();
+ }
+ this.trigger(checked ? 'check-all' : 'uncheck-all', rows);
+ };
+
+ BootstrapTable.prototype.check = function (index) {
+ this.check_(true, index);
+ };
+
+ BootstrapTable.prototype.uncheck = function (index) {
+ this.check_(false, index);
+ };
+
+ BootstrapTable.prototype.check_ = function (checked, index) {
+ var $el = this.$selectItem.filter(sprintf('[data-index="%s"]', index)).prop('checked', checked);
+ this.data[index][this.header.stateField] = checked;
+ this.updateSelected();
+ this.trigger(checked ? 'check' : 'uncheck', this.data[index], $el);
+ };
+
+ BootstrapTable.prototype.checkBy = function (obj) {
+ this.checkBy_(true, obj);
+ };
+
+ BootstrapTable.prototype.uncheckBy = function (obj) {
+ this.checkBy_(false, obj);
+ };
+
+ BootstrapTable.prototype.checkBy_ = function (checked, obj) {
+ if (!obj.hasOwnProperty('field') || !obj.hasOwnProperty('values')) {
+ return;
+ }
+
+ var that = this,
+ rows = [];
+ $.each(this.options.data, function (index, row) {
+ if (!row.hasOwnProperty(obj.field)) {
+ return false;
+ }
+ if ($.inArray(row[obj.field], obj.values) !== -1) {
+ var $el = that.$selectItem.filter(':enabled')
+ .filter(sprintf('[data-index="%s"]', index)).prop('checked', checked);
+ row[that.header.stateField] = checked;
+ rows.push(row);
+ that.trigger(checked ? 'check' : 'uncheck', row, $el);
+ }
+ });
+ this.updateSelected();
+ this.trigger(checked ? 'check-some' : 'uncheck-some', rows);
+ };
+
+ BootstrapTable.prototype.destroy = function () {
+ this.$el.insertBefore(this.$container);
+ $(this.options.toolbar).insertBefore(this.$el);
+ this.$container.next().remove();
+ this.$container.remove();
+ this.$el.html(this.$el_.html())
+ .css('margin-top', '0')
+ .attr('class', this.$el_.attr('class') || ''); // reset the class
+ };
+
+ BootstrapTable.prototype.showLoading = function () {
+ this.$tableLoading.show();
+ };
+
+ BootstrapTable.prototype.hideLoading = function () {
+ this.$tableLoading.hide();
+ };
+
+ BootstrapTable.prototype.togglePagination = function () {
+ this.options.pagination = !this.options.pagination;
+ var button = this.$toolbar.find('button[name="paginationSwitch"] i');
+ if (this.options.pagination) {
+ button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchDown);
+ } else {
+ button.attr("class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchUp);
+ }
+ this.updatePagination();
+ };
+
+ BootstrapTable.prototype.refresh = function (params) {
+ if (params && params.url) {
+ this.options.url = params.url;
+ this.options.pageNumber = 1;
+ }
+ this.initServer(params && params.silent, params && params.query);
+ };
+
+ BootstrapTable.prototype.resetWidth = function () {
+ if (this.options.showHeader && this.options.height) {
+ this.fitHeader();
+ }
+ if (this.options.showFooter) {
+ this.fitFooter();
+ }
+ };
+
+ BootstrapTable.prototype.showColumn = function (field) {
+ this.toggleColumn(getFieldIndex(this.columns, field), true, true);
+ };
+
+ BootstrapTable.prototype.hideColumn = function (field) {
+ this.toggleColumn(getFieldIndex(this.columns, field), false, true);
+ };
+
+ BootstrapTable.prototype.getHiddenColumns = function () {
+ return $.grep(this.columns, function (column) {
+ return !column.visible;
+ });
+ };
+
+ BootstrapTable.prototype.filterBy = function (columns) {
+ this.filterColumns = $.isEmptyObject(columns) ? {} : columns;
+ this.options.pageNumber = 1;
+ this.initSearch();
+ this.updatePagination();
+ };
+
+ BootstrapTable.prototype.scrollTo = function (value) {
+ if (typeof value === 'string') {
+ value = value === 'bottom' ? this.$tableBody[0].scrollHeight : 0;
+ }
+ if (typeof value === 'number') {
+ this.$tableBody.scrollTop(value);
+ }
+ if (typeof value === 'undefined') {
+ return this.$tableBody.scrollTop();
+ }
+ };
+
+ BootstrapTable.prototype.getScrollPosition = function () {
+ return this.scrollTo();
+ };
+
+ BootstrapTable.prototype.selectPage = function (page) {
+ if (page > 0 && page <= this.options.totalPages) {
+ this.options.pageNumber = page;
+ this.updatePagination();
+ }
+ };
+
+ BootstrapTable.prototype.prevPage = function () {
+ if (this.options.pageNumber > 1) {
+ this.options.pageNumber--;
+ this.updatePagination();
+ }
+ };
+
+ BootstrapTable.prototype.nextPage = function () {
+ if (this.options.pageNumber < this.options.totalPages) {
+ this.options.pageNumber++;
+ this.updatePagination();
+ }
+ };
+
+ BootstrapTable.prototype.toggleView = function () {
+ this.options.cardView = !this.options.cardView;
+ this.initHeader();
+ // Fixed remove toolbar when click cardView button.
+ //that.initToolbar();
+ this.initBody();
+ this.trigger('toggle', this.options.cardView);
+ };
+
+ BootstrapTable.prototype.refreshOptions = function (options) {
+ //If the objects are equivalent then avoid the call of destroy / init methods
+ if (compareObjects(this.options, options, false)) {
+ return;
+ }
+ this.options = $.extend(this.options, options);
+ this.trigger('refresh-options', this.options);
+ this.destroy();
+ this.init();
+ };
+
+ BootstrapTable.prototype.resetSearch = function (text) {
+ var $search = this.$toolbar.find('.search input');
+ $search.val(text || '');
+ this.onSearch({currentTarget: $search});
+ };
+
+ BootstrapTable.prototype.expandRow_ = function (expand, index) {
+ var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', index));
+ if ($tr.next().is('tr.detail-view') === (expand ? false : true)) {
+ $tr.find('> td > .detail-icon').click();
+ }
+ };
+
+ BootstrapTable.prototype.expandRow = function (index) {
+ this.expandRow_(true, index);
+ };
+
+ BootstrapTable.prototype.collapseRow = function (index) {
+ this.expandRow_(false, index);
+ };
+
+ BootstrapTable.prototype.expandAllRows = function (isSubTable) {
+ if (isSubTable) {
+ var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', 0)),
+ that = this,
+ detailIcon = null,
+ executeInterval = false,
+ idInterval = -1;
+
+ if (!$tr.next().is('tr.detail-view')) {
+ $tr.find('> td > .detail-icon').click();
+ executeInterval = true;
+ } else if (!$tr.next().next().is('tr.detail-view')) {
+ $tr.next().find(".detail-icon").click();
+ executeInterval = true;
+ }
+
+ if (executeInterval) {
+ try {
+ idInterval = setInterval(function () {
+ detailIcon = that.$body.find("tr.detail-view").last().find(".detail-icon");
+ if (detailIcon.length > 0) {
+ detailIcon.click();
+ } else {
+ clearInterval(idInterval);
+ }
+ }, 1);
+ } catch (ex) {
+ clearInterval(idInterval);
+ }
+ }
+ } else {
+ var trs = this.$body.children();
+ for (var i = 0; i < trs.length; i++) {
+ this.expandRow_(true, $(trs[i]).data("index"));
+ }
+ }
+ };
+
+ BootstrapTable.prototype.collapseAllRows = function (isSubTable) {
+ if (isSubTable) {
+ this.expandRow_(false, 0);
+ } else {
+ var trs = this.$body.children();
+ for (var i = 0; i < trs.length; i++) {
+ this.expandRow_(false, $(trs[i]).data("index"));
+ }
+ }
+ };
+
+ // BOOTSTRAP TABLE PLUGIN DEFINITION
+ // =======================
+
+ var allowedMethods = [
+ 'getOptions',
+ 'getSelections', 'getAllSelections', 'getData',
+ 'load', 'append', 'prepend', 'remove', 'removeAll',
+ 'insertRow', 'updateRow', 'updateCell', 'updateByUniqueId', 'removeByUniqueId',
+ 'getRowByUniqueId', 'showRow', 'hideRow', 'getRowsHidden',
+ 'mergeCells',
+ 'checkAll', 'uncheckAll',
+ 'check', 'uncheck',
+ 'checkBy', 'uncheckBy',
+ 'refresh',
+ 'resetView',
+ 'resetWidth',
+ 'destroy',
+ 'showLoading', 'hideLoading',
+ 'showColumn', 'hideColumn', 'getHiddenColumns',
+ 'filterBy',
+ 'scrollTo',
+ 'getScrollPosition',
+ 'selectPage', 'prevPage', 'nextPage',
+ 'togglePagination',
+ 'toggleView',
+ 'refreshOptions',
+ 'resetSearch',
+ 'expandRow', 'collapseRow', 'expandAllRows', 'collapseAllRows'
+ ];
+
+ $.fn.bootstrapTable = function (option) {
+ var value,
+ args = Array.prototype.slice.call(arguments, 1);
+
+ this.each(function () {
+ var $this = $(this),
+ data = $this.data('bootstrap.table'),
+ options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(),
+ typeof option === 'object' && option);
+
+ if (typeof option === 'string') {
+ if ($.inArray(option, allowedMethods) < 0) {
+ throw new Error("Unknown method: " + option);
+ }
+
+ if (!data) {
+ return;
+ }
+
+ value = data[option].apply(data, args);
+
+ if (option === 'destroy') {
+ $this.removeData('bootstrap.table');
+ }
+ }
+
+ if (!data) {
+ $this.data('bootstrap.table', (data = new BootstrapTable(this, options)));
+ }
+ });
+
+ return typeof value === 'undefined' ? this : value;
+ };
+
+ $.fn.bootstrapTable.Constructor = BootstrapTable;
+ $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS;
+ $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS;
+ $.fn.bootstrapTable.locales = BootstrapTable.LOCALES;
+ $.fn.bootstrapTable.methods = allowedMethods;
+ $.fn.bootstrapTable.utils = {
+ sprintf: sprintf,
+ getFieldIndex: getFieldIndex,
+ compareObjects: compareObjects,
+ calculateObjectValue: calculateObjectValue
+ };
+
+ // BOOTSTRAP TABLE INIT
+ // =======================
+
+ $(function () {
+ $('[data-toggle="table"]').bootstrapTable();
+ });
+
+}(jQuery);
diff --git a/admportal/public/javascripts/bootstrap.min.js b/admportal/public/javascripts/bootstrap.min.js
new file mode 100644
index 00000000..e79c0651
--- /dev/null
+++ b/admportal/public/javascripts/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");
+d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file
diff --git a/admportal/public/javascripts/dataTables.bootstrap.min.js b/admportal/public/javascripts/dataTables.bootstrap.min.js
new file mode 100644
index 00000000..7ae847b0
--- /dev/null
+++ b/admportal/public/javascripts/dataTables.bootstrap.min.js
@@ -0,0 +1,9 @@
+/*!
+ DataTables Bootstrap 3 integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,e){a||(a=window);if(!e||!e.fn.dataTable)e=require("datatables.net")(a,e).$;return b(e,a,a.document)}:b(jQuery,window,document)})(function(b,a,e){var d=b.fn.dataTable;b.extend(!0,d.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(d.ext.classes,
+{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});d.ext.renderer.pageButton.bootstrap=function(a,h,r,m,j,n){var o=new d.Api(a),s=a.oClasses,k=a.oLanguage.oPaginate,t=a.oLanguage.oAria.paginate||{},f,g,p=0,q=function(d,e){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};
+l=0;for(h=e.length;l<h;l++)if(c=e[l],b.isArray(c))q(d,c);else{g=f="";switch(c){case "ellipsis":f="&#x2026;";g="disabled";break;case "first":f=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":f=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":f=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":f=k.sLast;g=c+(j<n-1?"":" disabled");break;default:f=c+1,g=j===c?"active":""}f&&(i=b("<li>",{"class":s.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("<a>",{href:"#",
+"aria-controls":a.sTableId,"aria-label":t[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(f)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(e.activeElement).data("dt-idx")}catch(u){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),m);i&&b(h).find("[data-dt-idx="+i+"]").focus()};d.TableTools&&(b.extend(!0,d.TableTools.classes,{container:"DTTT btn-group",buttons:{normal:"btn btn-default",disabled:"disabled"},collection:{container:"DTTT_dropdown dropdown-menu",
+buttons:{normal:"",disabled:"disabled"}},print:{info:"DTTT_print_info"},select:{row:"active"}}),b.extend(!0,d.TableTools.DEFAULTS.oTags,{collection:{container:"ul",button:"li",liner:"a"}}));return d});
diff --git a/admportal/public/javascripts/jquery-2.2.0.min.js b/admportal/public/javascripts/jquery-2.2.0.min.js
new file mode 100644
index 00000000..06ac2631
--- /dev/null
+++ b/admportal/public/javascripts/jquery-2.2.0.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v2.2.0 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!k.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=R.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c}catch(e){}O.set(a,b,c);
+}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=N.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function W(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&T.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var X=/^(?:checkbox|radio)$/i,Y=/<([\w:-]+)/,Z=/^$|\/(?:java|ecma)script/i,$={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return this;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.rnamespace||a.rnamespace.test(g.namespace))&&(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||d,e=c.documentElement,f=c.body,a.pageX=b.clientX+(e&&e.scrollLeft||f&&f.scrollLeft||0)-(e&&e.clientLeft||f&&f.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||f&&f.scrollTop||0)-(e&&e.clientTop||f&&f.clientTop||0)),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ea.test(f)?this.mouseHooks:da.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=d),3===a.target.nodeType&&(a.target=a.target.parentNode),h.filter?h.filter(a,g):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==ia()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===ia()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ga:ha):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:ha,isPropagationStopped:ha,isImmediatePropagationStopped:ha,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ga,a&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ga,a&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ga,a&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),n.fn.extend({on:function(a,b,c,d){return ja(this,a,b,c,d)},one:function(a,b,c,d){return ja(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ha),this.each(function(){n.event.remove(this,a,c,b)})}});var ka=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,la=/<script|<style|<link/i,ma=/checked\s*(?:[^=]|=\s*.checked.)/i,na=/^true\/(.*)/,oa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=wa[0].contentDocument,b.write(),b.close(),c=ya(a,b),wa.detach()),xa[a]=c),c}var Aa=/^margin/,Ba=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ca=function(b){var c=b.ownerDocument.defaultView;return c.opener||(c=a),c.getComputedStyle(b)},Da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Ea=d.documentElement;!function(){var b,c,e,f,g=d.createElement("div"),h=d.createElement("div");if(h.style){h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,g.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",g.appendChild(h);function i(){h.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",h.innerHTML="",Ea.appendChild(g);var d=a.getComputedStyle(h);b="1%"!==d.top,f="2px"===d.marginLeft,c="4px"===d.width,h.style.marginRight="50%",e="4px"===d.marginRight,Ea.removeChild(g)}n.extend(l,{pixelPosition:function(){return i(),b},boxSizingReliable:function(){return null==c&&i(),c},pixelMarginRight:function(){return null==c&&i(),e},reliableMarginLeft:function(){return null==c&&i(),f},reliableMarginRight:function(){var b,c=h.appendChild(d.createElement("div"));return c.style.cssText=h.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",h.style.width="1px",Ea.appendChild(g),b=!parseFloat(a.getComputedStyle(c).marginRight),Ea.removeChild(g),h.removeChild(c),b}})}}();function Fa(a,b,c){var d,e,f,g,h=a.style;return c=c||Ca(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),!l.pixelMarginRight()&&Ba.test(g)&&Aa.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Ga(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Ha=/^(none|table(?!-c[ea]).+)/,Ia={position:"absolute",visibility:"hidden",display:"block"},Ja={letterSpacing:"0",fontWeight:"400"},Ka=["Webkit","O","Moz","ms"],La=d.createElement("div").style;function Ma(a){if(a in La)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ka.length;while(c--)if(a=Ka[c]+b,a in La)return a}function Na(a,b,c){var d=T.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Oa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Pa(b,c,e){var f=!0,g="width"===c?b.offsetWidth:b.offsetHeight,h=Ca(b),i="border-box"===n.css(b,"boxSizing",!1,h);if(d.msFullscreenElement&&a.top!==a&&b.getClientRects().length&&(g=Math.round(100*b.getBoundingClientRect()[c])),0>=g||null==g){if(g=Fa(b,c,h),(0>g||null==g)&&(g=b.style[c]),Ba.test(g))return g;f=i&&(l.boxSizingReliable()||g===b.style[c]),g=parseFloat(g)||0}return g+Oa(b,c,e||(i?"border":"content"),f,h)+"px"}function Qa(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=N.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=N.access(d,"olddisplay",za(d.nodeName)))):(e=V(d),"none"===c&&e||N.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Fa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=T.exec(c))&&e[1]&&(c=W(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Fa(a,b,d)),"normal"===e&&b in Ja&&(e=Ja[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Ha.test(n.css(a,"display"))&&0===a.offsetWidth?Da(a,Ia,function(){return Pa(a,b,d)}):Pa(a,b,d):void 0},set:function(a,c,d){var e,f=d&&Ca(a),g=d&&Oa(a,b,d,"border-box"===n.css(a,"boxSizing",!1,f),f);return g&&(e=T.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=n.css(a,b)),Na(a,c,g)}}}),n.cssHooks.marginLeft=Ga(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Fa(a,"marginLeft"))||a.getBoundingClientRect().left-Da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),n.cssHooks.marginRight=Ga(l.reliableMarginRight,function(a,b){return b?Da(a,{display:"inline-block"},Fa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Aa.test(a)||(n.cssHooks[a+b].set=Na)}),n.fn.extend({css:function(a,b){return K(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ca(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Qa(this,!0)},hide:function(){return Qa(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function Ra(a,b,c,d,e){return new Ra.prototype.init(a,b,c,d,e)}n.Tween=Ra,Ra.prototype={constructor:Ra,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ra.propHooks[this.prop];return a&&a.get?a.get(this):Ra.propHooks._default.get(this)},run:function(a){var b,c=Ra.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ra.propHooks._default.set(this),this}},Ra.prototype.init.prototype=Ra.prototype,Ra.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},Ra.propHooks.scrollTop=Ra.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=Ra.prototype.init,n.fx.step={};var Sa,Ta,Ua=/^(?:toggle|show|hide)$/,Va=/queueHooks$/;function Wa(){return a.setTimeout(function(){Sa=void 0}),Sa=n.now()}function Xa(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=U[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ya(a,b,c){for(var d,e=(_a.tweeners[b]||[]).concat(_a.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Za(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&V(a),q=N.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?N.get(a,"olddisplay")||za(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Ua.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?za(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=N.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;N.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ya(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function $a(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function _a(a,b,c){var d,e,f=0,g=_a.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Sa||Wa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:Sa||Wa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for($a(k,j.opts.specialEasing);g>f;f++)if(d=_a.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,Ya,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(_a,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return W(c.elem,a,T.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],_a.tweeners[c]=_a.tweeners[c]||[],_a.tweeners[c].unshift(b)},prefilters:[Za],prefilter:function(a,b){b?_a.prefilters.unshift(a):_a.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=_a(this,n.extend({},a),f);(e||N.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=N.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Va.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=N.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Xa(b,!0),a,d,e)}}),n.each({slideDown:Xa("show"),slideUp:Xa("hide"),slideToggle:Xa("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Sa=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Sa=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ta||(Ta=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(Ta),Ta=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",l.checkOn=""!==a.value,l.optSelected=c.selected,b.disabled=!0,l.optDisabled=!c.disabled,a=d.createElement("input"),a.value="t",a.type="radio",l.radioValue="t"===a.value}();var ab,bb=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return K(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ab:void 0)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)}}),ab={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=bb[b]||n.find.attr;bb[b]=function(a,b,d){var e,f;return d||(f=bb[b],bb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,bb[b]=f),e}});var cb=/^(?:input|select|textarea|button)$/i,db=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return K(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b];
+},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):cb.test(a.nodeName)||db.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var eb=/[\t\r\n\f]/g;function fb(a){return a.getAttribute&&a.getAttribute("class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,fb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,fb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,fb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(void 0===a||"boolean"===c)&&(b=fb(this),b&&N.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":N.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+fb(c)+" ").replace(eb," ").indexOf(b)>-1)return!0;return!1}});var gb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(gb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){return n.trim(a.value)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(n.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var hb=/^(?:focusinfocus|focusoutblur)$/;n.extend(n.event,{trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!hb.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),l=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},f||!o.trigger||o.trigger.apply(e,c)!==!1)){if(!f&&!o.noBubble&&!n.isWindow(e)){for(j=o.delegateType||q,hb.test(j+q)||(h=h.parentNode);h;h=h.parentNode)p.push(h),i=h;i===(e.ownerDocument||d)&&p.push(i.defaultView||i.parentWindow||a)}g=0;while((h=p[g++])&&!b.isPropagationStopped())b.type=g>1?j:o.bindType||q,m=(N.get(h,"events")||{})[b.type]&&N.get(h,"handle"),m&&m.apply(h,c),m=l&&h[l],m&&m.apply&&L(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=q,f||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!L(e)||l&&n.isFunction(e[q])&&!n.isWindow(e)&&(i=e[l],i&&(e[l]=null),n.event.triggered=q,e[q](),n.event.triggered=void 0,i&&(e[l]=i)),b.result}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}}),n.fn.extend({trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),l.focusin="onfocusin"in a,l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=N.access(d,b);e||d.addEventListener(a,c,!0),N.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=N.access(d,b)-1;e?N.access(d,b,e):(d.removeEventListener(a,c,!0),N.remove(d,b))}}});var ib=a.location,jb=n.now(),kb=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return(!c||c.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+b),c};var lb=/#.*$/,mb=/([?&])_=[^&]*/,nb=/^(.*?):[ \t]*([^\r\n]*)$/gm,ob=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,pb=/^(?:GET|HEAD)$/,qb=/^\/\//,rb={},sb={},tb="*/".concat("*"),ub=d.createElement("a");ub.href=ib.href;function vb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function wb(a,b,c,d){var e={},f=a===sb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function xb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function yb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function zb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ib.href,type:"GET",isLocal:ob.test(ib.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":tb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?xb(xb(a,n.ajaxSettings),b):xb(n.ajaxSettings,a)},ajaxPrefilter:vb(rb),ajaxTransport:vb(sb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m=n.ajaxSetup({},c),o=m.context||m,p=m.context&&(o.nodeType||o.jquery)?n(o):n.event,q=n.Deferred(),r=n.Callbacks("once memory"),s=m.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,getResponseHeader:function(a){var b;if(2===v){if(!h){h={};while(b=nb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===v?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return v||(a=u[c]=u[c]||a,t[a]=b),this},overrideMimeType:function(a){return v||(m.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>v)for(b in a)s[b]=[s[b],a[b]];else x.always(a[x.status]);return this},abort:function(a){var b=a||w;return e&&e.abort(b),z(0,b),this}};if(q.promise(x).complete=r.add,x.success=x.done,x.error=x.fail,m.url=((b||m.url||ib.href)+"").replace(lb,"").replace(qb,ib.protocol+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=n.trim(m.dataType||"*").toLowerCase().match(G)||[""],null==m.crossDomain){j=d.createElement("a");try{j.href=m.url,j.href=j.href,m.crossDomain=ub.protocol+"//"+ub.host!=j.protocol+"//"+j.host}catch(y){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=n.param(m.data,m.traditional)),wb(rb,m,c,x),2===v)return x;k=n.event&&m.global,k&&0===n.active++&&n.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!pb.test(m.type),f=m.url,m.hasContent||(m.data&&(f=m.url+=(kb.test(f)?"&":"?")+m.data,delete m.data),m.cache===!1&&(m.url=mb.test(f)?f.replace(mb,"$1_="+jb++):f+(kb.test(f)?"&":"?")+"_="+jb++)),m.ifModified&&(n.lastModified[f]&&x.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&x.setRequestHeader("If-None-Match",n.etag[f])),(m.data&&m.hasContent&&m.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",m.contentType),x.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+tb+"; q=0.01":""):m.accepts["*"]);for(l in m.headers)x.setRequestHeader(l,m.headers[l]);if(m.beforeSend&&(m.beforeSend.call(o,x,m)===!1||2===v))return x.abort();w="abort";for(l in{success:1,error:1,complete:1})x[l](m[l]);if(e=wb(sb,m,c,x)){if(x.readyState=1,k&&p.trigger("ajaxSend",[x,m]),2===v)return x;m.async&&m.timeout>0&&(i=a.setTimeout(function(){x.abort("timeout")},m.timeout));try{v=1,e.send(t,z)}catch(y){if(!(2>v))throw y;z(-1,y)}}else z(-1,"No Transport");function z(b,c,d,h){var j,l,t,u,w,y=c;2!==v&&(v=2,i&&a.clearTimeout(i),e=void 0,g=h||"",x.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(u=yb(m,x,d)),u=zb(m,u,x,j),j?(m.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(n.lastModified[f]=w),w=x.getResponseHeader("etag"),w&&(n.etag[f]=w)),204===b||"HEAD"===m.type?y="nocontent":304===b?y="notmodified":(y=u.state,l=u.data,t=u.error,j=!t)):(t=y,(b||!y)&&(y="error",0>b&&(b=0))),x.status=b,x.statusText=(c||y)+"",j?q.resolveWith(o,[l,y,x]):q.rejectWith(o,[x,y,t]),x.statusCode(s),s=void 0,k&&p.trigger(j?"ajaxSuccess":"ajaxError",[x,m,j?l:t]),r.fireWith(o,[x,y]),k&&(p.trigger("ajaxComplete",[x,m]),--n.active||n.event.trigger("ajaxStop")))}return x},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return!n.expr.filters.visible(a)},n.expr.filters.visible=function(a){return a.offsetWidth>0||a.offsetHeight>0||a.getClientRects().length>0};var Ab=/%20/g,Bb=/\[\]$/,Cb=/\r?\n/g,Db=/^(?:submit|button|image|reset|file)$/i,Eb=/^(?:input|select|textarea|keygen)/i;function Fb(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Bb.test(a)?d(a,e):Fb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Fb(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Fb(c,a[c],b,e);return d.join("&").replace(Ab,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Eb.test(this.nodeName)&&!Db.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Cb,"\r\n")}}):{name:b.name,value:c.replace(Cb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Gb={0:200,1223:204},Hb=n.ajaxSettings.xhr();l.cors=!!Hb&&"withCredentials"in Hb,l.ajax=Hb=!!Hb,n.ajaxTransport(function(b){var c,d;return l.cors||Hb&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Gb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=n("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Ib=[],Jb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Ib.pop()||n.expando+"_"+jb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Jb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Jb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Jb,"$1"+e):b.jsonp!==!1&&(b.url+=(kb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Ib.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),l.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||(l.createHTMLDocument?d.implementation.createHTMLDocument(""):d);var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ca([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var Kb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Kb)return Kb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(g,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function Lb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(e=d.getBoundingClientRect(),c=Lb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0)-a.scrollTop(),d.left+=n.css(a[0],"borderLeftWidth",!0)-a.scrollLeft()),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ea})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;n.fn[a]=function(d){return K(this,function(a,d,e){var f=Lb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ga(l.pixelPosition,function(a,c){return c?(c=Fa(a,b),Ba.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return K(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)},size:function(){return this.length}}),n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Mb=a.jQuery,Nb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Nb),b&&a.jQuery===n&&(a.jQuery=Mb),n},b||(a.jQuery=a.$=n),n});
diff --git a/admportal/public/javascripts/jquery.dataTables.min.js b/admportal/public/javascripts/jquery.dataTables.min.js
new file mode 100644
index 00000000..d8778045
--- /dev/null
+++ b/admportal/public/javascripts/jquery.dataTables.min.js
@@ -0,0 +1,164 @@
+/*!
+ DataTables 1.10.10
+ ©2008-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(h){"function"===typeof define&&define.amd?define(["jquery"],function(E){return h(E,window,document)}):"object"===typeof exports?module.exports=function(E,H){E||(E=window);H||(H="undefined"!==typeof window?require("jquery"):require("jquery")(E));return h(H,E,E.document)}:h(jQuery,window,document)})(function(h,E,H,k){function Y(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),
+d[c]=e,"o"===b[1]&&Y(a[e])});a._hungarianMap=d}function J(a,b,c){a._hungarianMap||Y(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),J(a[d],b[d],c)):b[d]=b[e]})}function Fa(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&F(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&F(a,a,"sZeroRecords","sLoadingRecords");
+a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&db(a)}function eb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");"boolean"===typeof a.scrollX&&(a.scrollX=
+a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&J(m.models.oSearch,a[b])}function fb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;b&&!h.isArray(b)&&(a.aDataSort=[b])}function gb(a){if(!m.__browser){var b={};m.__browser=b;var c=h("<div/>").css({position:"fixed",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",top:1,left:1,
+width:100,overflow:"scroll"}).append(h("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function hb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==e;)a.hasOwnProperty(d)&&
+(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Ga(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:H.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]);la(a,d,h(b).data())}function la(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f=
+(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),J(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),F(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),F(b,c,"aDataSort"));var g=b.mData,j=Q(g),i=b.mRender?Q(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&
+(c(g.sort)||c(g.type)||c(g.filter));b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return R(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=
+d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function U(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ha(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&Z(a);v(a,null,"column-sizing",[a])}function $(a,b){var c=aa(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function ba(a,b){var c=aa(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}function ca(a){return aa(a,
+"bVisible").length}function aa(a,b){var c=[];h.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Ia(a){var b=a.aoColumns,c=a.aoData,d=m.ext.type.detect,e,f,g,j,i,h,l,q,u;e=0;for(f=b.length;e<f;e++)if(l=b[e],u=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=d.length;g<j;g++){i=0;for(h=c.length;i<h;i++){u[i]===k&&(u[i]=B(a,i,e,"type"));q=d[g](u[i],a);if(!q&&g!==d.length-1)break;if("html"===q)break}if(q){l.sType=q;break}}l.sType||(l.sType="string")}}function ib(a,
+b,c,d){var e,f,g,j,i,o,l=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){o=b[e];var q=o.targets!==k?o.targets:o.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Ga(a);d(q[f],o)}else if("number"===typeof q[f]&&0>q[f])d(l.length+q[f],o);else if("string"===typeof q[f]){j=0;for(i=l.length;j<i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&d(j,o)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}function N(a,b,c,d){var e=a.aoData.length,f=h.extend(!0,
+{},m.models.oRow,{src:c?"dom":"data",idx:e});f._aData=b;a.aoData.push(f);for(var g=a.aoColumns,j=0,i=g.length;j<i;j++)g[j].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==k&&(a.aIds[b]=f);(c||!a.oFeatures.bDeferRender)&&Ja(a,e,c,d);return e}function ma(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,e){c=Ka(a,e);return N(a,c.data,e,c.cells)})}function B(a,b,c,d){var e=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,i=f.fnGetData(g,d,{settings:a,row:b,col:c});
+if(i===k)return a.iDrawError!=e&&null===j&&(K(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),j;if((i===g||null===i)&&null!==j)i=j;else if("function"===typeof i)return i.call(g);return null===i&&"display"==d?"":i}function jb(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a,row:b,col:c})}function La(a){return h.map(a.match(/(\\.|[^\.])+/g)||[""],function(a){return a.replace(/\\./g,".")})}function Q(a){if(h.isPlainObject(a)){var b=
+{};h.each(a,function(a,c){c&&(b[a]=Q(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var g,j;if(""!==f){j=La(f);for(var i=0,o=j.length;i<o;i++){f=j[i].match(da);g=j[i].match(V);if(f){j[i]=j[i].replace(da,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=
+j.join(".");if(h.isArray(a)){i=0;for(o=a.length;i<o;i++)g.push(c(a[i],b,j))}a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(V,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===k)return k;a=a[j[i]]}}return a};return function(b,e){return c(b,e,a)}}return function(b){return b[a]}}function R(a){if(h.isPlainObject(a))return R(a._);if(null===a)return function(){};if("function"===typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"===typeof a&&(-1!==a.indexOf(".")||
+-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,d,e){var e=La(e),f;f=e[e.length-1];for(var g,j,i=0,o=e.length-1;i<o;i++){g=e[i].match(da);j=e[i].match(V);if(g){e[i]=e[i].replace(da,"");a[e[i]]=[];f=e.slice();f.splice(0,i+1);g=f.join(".");if(h.isArray(d)){j=0;for(o=d.length;j<o;j++)f={},b(f,d[j],g),a[e[i]].push(f)}else a[e[i]]=d;return}j&&(e[i]=e[i].replace(V,""),a=a[e[i]](d));if(null===a[e[i]]||a[e[i]]===k)a[e[i]]={};a=a[e[i]]}if(f.match(V))a[f.replace(V,"")](d);else a[f.replace(da,"")]=
+d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Ma(a){return D(a.aoData,"_aData")}function na(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function oa(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===k&&a.splice(d,1)}function ea(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=
+Ka(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==k)g[d].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;Na(a,e)}}function Ka(a,b,c,d){var e=[],f=b.firstChild,g,j,i=0,o,l=a.aoColumns,q=a._rowReadObject,d=d!==k?d:q?{}:[],u=function(a,b){if("string"===typeof a){var c=a.indexOf("@");-1!==c&&(c=a.substring(c+1),R(a)(d,b.getAttribute(c)))}},S=function(a){if(c===k||
+c===i)j=l[i],o=h.trim(a.innerHTML),j&&j._bAttrSrc?(R(j.mData._)(d,o),u(j.mData.sort,a),u(j.mData.type,a),u(j.mData.filter,a)):q?(j._setter||(j._setter=R(j.mData)),j._setter(d,o)):d[i]=o;i++};if(f)for(;f;){g=f.nodeName.toUpperCase();if("TD"==g||"TH"==g)S(f),e.push(f);f=f.nextSibling}else{e=b.anCells;f=0;for(g=e.length;f<g;f++)S(e[f])}if(b=b.firstChild?b:b.nTr)(b=b.getAttribute("id"))&&R(a.rowId)(d,b);return{data:d,cells:e}}function Ja(a,b,c,d){var e=a.aoData[b],f=e._aData,g=[],j,i,h,l,q;if(null===
+e.nTr){j=c||H.createElement("tr");e.nTr=j;e.anCells=g;j._DT_RowIndex=b;Na(a,e);l=0;for(q=a.aoColumns.length;l<q;l++){h=a.aoColumns[l];i=c?d[l]:H.createElement(h.sCellType);i._DT_CellIndex={row:b,column:l};g.push(i);if(!c||h.mRender||h.mData!==l)i.innerHTML=B(a,b,l,"display");h.sClass&&(i.className+=" "+h.sClass);h.bVisible&&!c?j.appendChild(i):!h.bVisible&&c&&i.parentNode.removeChild(i);h.fnCreatedCell&&h.fnCreatedCell.call(a.oInstance,i,B(a,b,l),f,b,l)}v(a,"aoRowCreatedCallback",null,[j,f,b])}e.nTr.setAttribute("role",
+"row")}function Na(a,b){var c=b.nTr,d=b._aData;if(c){var e=a.rowIdFn(d);e&&(c.id=e);d.DT_RowClass&&(e=d.DT_RowClass.split(" "),b.__rowc=b.__rowc?pa(b.__rowc.concat(e)):e,h(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&h(c).attr(d.DT_RowAttr);d.DT_RowData&&h(c).data(d.DT_RowData)}}function kb(a){var b,c,d,e,f,g=a.nTHead,j=a.nTFoot,i=0===h("th, td",g).length,o=a.oClasses,l=a.aoColumns;i&&(e=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],d=h(f.nTh).addClass(f.sClass),
+i&&d.appendTo(e),a.oFeatures.bSort&&(d.addClass(f.sSortingClass),!1!==f.bSortable&&(d.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Oa(a,f.nTh,b))),f.sTitle!=d[0].innerHTML&&d.html(f.sTitle),Pa(a,"header")(a,d,f,o);i&&fa(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(o.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(o.sFooterTH);if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}
+function ga(a,b,c){var d,e,f,g=[],j=[],i=a.aoColumns.length,o;if(b){c===k&&(c=!1);d=0;for(e=b.length;d<e;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d<e;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++)if(o=i=1,j[d][f]===k){a.appendChild(g[d][f].cell);for(j[d][f]=1;g[d+i]!==k&&g[d][f].cell==g[d+i][f].cell;)j[d+i][f]=1,i++;for(;g[d][f+o]!==k&&g[d][f].cell==g[d][f+o].cell;){for(c=
+0;c<i;c++)j[d+c][f+o]=1;o++}h(g[d][f].cell).attr("rowspan",i).attr("colspan",o)}}}}function O(a){var b=v(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==y(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart=j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);var g=a._iDisplayStart,o=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&
+!lb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:o;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ja(a,l);l=q.nTr;if(0!==e){var u=d[c%e];q._sRowStripe!=u&&(h(l).removeClass(q._sRowStripe).addClass(u),q._sRowStripe=u)}v(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==y(a)?c=f.sLoadingRecords:f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":e?d[0]:""}).append(h("<td />",{valign:"top",colSpan:ca(a),
+"class":a.oClasses.sRowEmpty}).html(c))[0];v(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ma(a),g,o,i]);v(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ma(a),g,o,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));v(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function T(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&mb(a);d?ha(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;O(a);a._drawHold=
+!1}function nb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),d=a.oFeatures,e=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,o,l,q,u=0;u<f.length;u++){g=null;j=f[u];if("<"==j){i=h("<div/>")[0];o=f[u+1];if("'"==o||'"'==o){l="";for(q=2;f[u+q]!=o;)l+=f[u+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(o=l.split("."),
+i.id=o[0].substr(1,o[0].length-1),i.className=o[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;u+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=ob(a);else if("f"==j&&d.bFilter)g=pb(a);else if("r"==j&&d.bProcessing)g=qb(a);else if("t"==j)g=rb(a);else if("i"==j&&d.bInfo)g=sb(a);else if("p"==j&&d.bPaginate)g=tb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(o=i.length;q<o;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&&
+(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),e.append(g))}c.replaceWith(e);a.nHolding=null}function fa(a,b){var c=h(b).children("tr"),d,e,f,g,j,i,o,l,q,u;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){d=c[f];for(e=d.firstChild;e;){if("TD"==e.nodeName.toUpperCase()||"TH"==e.nodeName.toUpperCase()){l=1*e.getAttribute("colspan");q=1*e.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;o=g;u=1===l?!0:!1;for(j=0;j<l;j++)for(g=
+0;g<q;g++)a[f+g][o+j]={cell:e,unique:u},a[f+g].nTr=d}e=e.nextSibling}}}function qa(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],fa(c,b)));for(var b=0,e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function ra(a,b,c){v(a,"aoServerParams","serverParams",[b]);if(b&&h.isArray(b)){var d={},e=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(e);c?(c=c[0],d[c]||(d[c]=[]),d[c].push(b.value)):d[b.name]=b.value});b=d}var f,g=a.ajax,
+j=a.oInstance,i=function(b){v(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var o=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&o?o:h.extend(!0,b,o);delete g.data}o={data:b,success:function(b){var c=b.error||b.sError;c&&K(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var d=v(a,null,"xhr",[a,null,a.jqXHR]);-1===h.inArray(!0,d)&&("parsererror"==c?K(a,0,"Invalid JSON response",1):4===b.readyState&&K(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData=
+b;v(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(o,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(o,g)),g.data=f)}function lb(a){return a.bAjaxDataGet?(a.iDraw++,C(a,!0),ra(a,ub(a),function(b){vb(a,b)}),!1):!0}function ub(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,o,
+l,q=W(a);g=a._iDisplayStart;i=!1!==d.bPaginate?a._iDisplayLength:-1;var k=function(a,b){j.push({name:a,value:b})};k("sEcho",a.iDraw);k("iColumns",c);k("sColumns",D(b,"sName").join(","));k("iDisplayStart",g);k("iDisplayLength",i);var S={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:e.sSearch,regex:e.bRegex}};for(g=0;g<c;g++)o=b[g],l=f[g],i="function"==typeof o.mData?"function":o.mData,S.columns.push({data:i,name:o.sName,searchable:o.bSearchable,orderable:o.bSortable,search:{value:l.sSearch,
+regex:l.bRegex}}),k("mDataProp_"+g,i),d.bFilter&&(k("sSearch_"+g,l.sSearch),k("bRegex_"+g,l.bRegex),k("bSearchable_"+g,o.bSearchable)),d.bSort&&k("bSortable_"+g,o.bSortable);d.bFilter&&(k("sSearch",e.sSearch),k("bRegex",e.bRegex));d.bSort&&(h.each(q,function(a,b){S.order.push({column:b.col,dir:b.dir});k("iSortCol_"+a,b.col);k("sSortDir_"+a,b.dir)}),k("iSortingCols",q.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:S:b?j:S}function vb(a,b){var c=sa(a,b),d=b.sEcho!==k?b.sEcho:b.draw,e=
+b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(d){if(1*d<a.iDraw)return;a.iDraw=1*d}na(a);a._iRecordsTotal=parseInt(e,10);a._iRecordsDisplay=parseInt(f,10);d=0;for(e=c.length;d<e;d++)N(a,c[d]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;O(a);a._bInitComplete||ta(a,b);a.bAjaxDataGet=!0;C(a,!1)}function sa(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||
+b[c]:""!==c?Q(c)(b):b}function pb(a){var b=a.oClasses,c=a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),f=function(){var b=!this.value?"":this.value;b!=e.sSearch&&(ha(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,O(a))},g=null!==
+a.searchDelay?a.searchDelay:"ssp"===y(a)?400:0,i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT",g?ua(f,g):f).bind("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==H.activeElement&&i.val(e.sSearch)}catch(d){}});return b[0]}function ha(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;
+d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Ia(a);if("ssp"!=y(a)){wb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)xb(a,e[b].sSearch,b,e[b].bEscapeRegex!==k?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);yb(a)}else f(b);a.bFiltered=!0;v(a,null,"search",[a])}function yb(a){for(var b=m.ext.search,c=a.aiDisplay,d,e,f=0,g=b.length;f<g;f++){for(var j=[],i=0,o=c.length;i<o;i++)e=c[i],d=a.aoData[e],b[f](a,
+d._aFilterData,e,d._aData,i)&&j.push(e);c.length=0;h.merge(c,j)}}function xb(a,b,c,d,e,f){if(""!==b)for(var g=a.aiDisplay,d=Qa(b,d,e,f),e=g.length-1;0<=e;e--)b=a.aoData[g[e]]._aFilterData[c],d.test(b)||g.splice(e,1)}function wb(a,b,c,d,e,f){var d=Qa(b,d,e,f),e=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,g;0!==m.ext.search.length&&(c=!0);g=zb(a);if(0>=b.length)a.aiDisplay=f.slice();else{if(g||c||e.length>b.length||0!==b.indexOf(e)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<=
+c;c--)d.test(a.aoData[b[c]]._sFilterRow)||b.splice(c,1)}}function Qa(a,b,c,d){a=b?a:va(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,d?"i":"")}function va(a){return a.replace(Yb,"\\$1")}function zb(a){var b=a.aoColumns,c,d,e,f,g,j,i,h,l=m.ext.type.search;c=!1;d=0;for(f=a.aoData.length;d<f;d++)if(h=a.aoData[d],!h._aFilterData){j=[];e=0;for(g=b.length;e<
+g;e++)c=b[e],c.bSearchable?(i=B(a,d,e,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(wa.innerHTML=i,i=Zb?wa.textContent:wa.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join(" ");c=!0}return c}function Ab(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Bb(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,
+bCaseInsensitive:a.caseInsensitive}}function sb(a){var b=a.sTableId,c=a.aanFeatures.i,d=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Cb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Cb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&
+(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Db(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Db(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/
+e)))}function ia(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){nb(a);kb(a);ga(a,a.aoHeader);ga(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ha(a);b=0;for(c=e.length;b<c;b++)f=e[b],f.sWidth&&(f.nTh.style.width=w(f.sWidth));v(a,null,"preInit",[a]);T(a);e=y(a);if("ssp"!=e||g)"ajax"==e?ra(a,[],function(c){var f=sa(a,c);for(b=0;b<f.length;b++)N(a,f[b]);a.iInitDisplayStart=d;T(a);C(a,!1);ta(a,c)},a):(C(a,!1),ta(a))}else setTimeout(function(){ia(a)},200)}
+function ta(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&U(a);v(a,null,"plugin-init",[a,b]);v(a,"aoInitComplete","init",[a,b])}function Ra(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Sa(a);v(a,null,"length",[a,c])}function ob(a){for(var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=h.isArray(d[0]),f=e?d[0]:d,d=e?d[1]:d,e=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g<j;g++)e[0][g]=new Option(d[g],f[g]);var i=h("<div><label/></div>").addClass(b.sLength);
+a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).bind("change.DT",function(){Ra(a,h(this).val());O(a)});h(a.nTable).bind("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function tb(a){var b=a.sPaginationType,c=m.ext.pager[b],d="function"===typeof c,e=function(a){O(a)},b=h("<div/>").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+
+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;l<k;l++)Pa(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Ta(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===e?d=0:"number"===typeof b?(d=b*e,d>f&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==
+b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:K(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(v(a,null,"page",[a]),c&&O(a));return b}function qb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");v(a,null,"processing",[a,b])}function rb(a){var b=h(a.nTable);b.attr("role",
+"grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),o=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:w(d):"100%"}).append(h("<div/>",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||
+"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:w(d)}).append(b));l&&i.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:w(d):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(o.removeAttr("id").css("margin-left",0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=i.children(),
+k=b[0],f=b[1],u=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(u.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=u;a.aoDrawCallback.push({fn:Z,sName:"scrolling"});return i[0]}function Z(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,o=j.children("table"),j=a.nScrollBody,l=h(j),q=j.style,u=h(a.nScrollFoot).children("div"),
+m=u.children("table"),n=h(a.nTHead),p=h(a.nTable),t=p[0],v=t.style,r=a.nTFoot?h(a.nTFoot):null,Eb=a.oBrowser,Ua=Eb.bScrollOversize,s,L,P,x,y=[],z=[],A=[],B,C=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};L=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!==L&&a.scrollBarVis!==k)a.scrollBarVis=L,U(a);else{a.scrollBarVis=L;p.children("thead, tfoot").remove();x=n.clone().prependTo(p);n=n.find("tr");L=x.find("tr");x.find("th, td").removeAttr("tabindex");
+r&&(P=r.clone().prependTo(p),s=r.find("tr"),P=P.find("tr"));c||(q.width="100%",f[0].style.width="100%");h.each(qa(a,x),function(b,c){B=$(a,b);c.style.width=a.aoColumns[B].sWidth});r&&I(function(a){a.style.width=""},P);f=p.outerWidth();if(""===c){v.width="100%";if(Ua&&(p.find("tbody").height()>j.offsetHeight||"scroll"==l.css("overflow-y")))v.width=w(p.outerWidth()-b);f=p.outerWidth()}else""!==d&&(v.width=w(d),f=p.outerWidth());I(C,L);I(function(a){A.push(a.innerHTML);y.push(w(h(a).css("width")))},
+L);I(function(a,b){a.style.width=y[b]},n);h(L).height(0);r&&(I(C,P),I(function(a){z.push(w(h(a).css("width")))},P),I(function(a,b){a.style.width=z[b]},s),h(P).height(0));I(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+A[b]+"</div>";a.style.width=y[b]},L);r&&I(function(a,b){a.innerHTML="";a.style.width=z[b]},P);if(p.outerWidth()<f){s=j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(Ua&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))v.width=
+w(s-b);(""===c||""!==d)&&K(a,1,"Possible column misalignment",6)}else s="100%";q.width=w(s);g.width=w(s);r&&(a.nScrollFoot.style.width=w(s));!e&&Ua&&(q.height=w(t.offsetHeight+b));c=p.outerWidth();o[0].style.width=w(c);i.width=w(c);d=p.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+(Eb.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";r&&(m[0].style.width=w(c),u[0].style.width=w(c),u[0].style[e]=d?b+"px":"0px");l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=
+0}}function I(a,b,c){for(var d=0,e=0,f=b.length,g,j;e<f;){g=b[e].firstChild;for(j=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,d):a(g,d),d++),g=g.nextSibling,j=c?j.nextSibling:null;e++}}function Ha(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,e=d.sY,f=d.sX,g=d.sXInner,j=c.length,i=aa(a,"bVisible"),o=h("th",a.nTHead),l=b.getAttribute("width"),k=b.parentNode,u=!1,m,n,p=a.oBrowser,d=p.bScrollOversize;(m=b.style.width)&&-1!==m.indexOf("%")&&(l=m);for(m=0;m<i.length;m++)n=c[i[m]],null!==n.sWidth&&
+(n.sWidth=Fb(n.sWidthOrig,k),u=!0);if(d||!u&&!f&&!e&&j==ca(a)&&j==o.length)for(m=0;m<j;m++)i=$(a,m),null!==i&&(c[i].sWidth=w(o.eq(m).width()));else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var t=h("<tr/>").appendTo(j.find("tbody"));j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");o=qa(a,j.find("thead")[0]);for(m=0;m<i.length;m++)n=c[i[m]],o[m].style.width=null!==n.sWidthOrig&&
+""!==n.sWidthOrig?w(n.sWidthOrig):"",n.sWidthOrig&&f&&h(o[m]).append(h("<div/>").css({width:n.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m<i.length;m++)u=i[m],n=c[u],h(Gb(a,u)).clone(!1).append(n.sContentPadding).appendTo(t);n=h("<div/>").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()<k.clientWidth&&l&&j.width(k.clientWidth)):e?j.width(k.clientWidth):
+l&&j.width(l);for(m=e=0;m<i.length;m++)k=h(o[m]),g=k.outerWidth()-k.width(),k=p.bBounding?Math.ceil(o[m].getBoundingClientRect().width):k.outerWidth(),e+=k,c[i[m]].sWidth=w(k-g);b.style.width=w(e);n.remove()}l&&(b.style.width=w(l));if((l||f)&&!a._reszEvt)b=function(){h(E).bind("resize.DT-"+a.sInstance,ua(function(){U(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0}function ua(a,b){var c=b!==k?b:200,d,e;return function(){var b=this,g=+new Date,j=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=
+k;a.apply(b,j)},c)):(d=g,a.apply(b,j))}}function Fb(a,b){if(!a)return 0;var c=h("<div/>").css("width",w(a)).appendTo(b||H.body),d=c[0].offsetWidth;c.remove();return d}function Gb(a,b){var c=Hb(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h("<td/>").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Hb(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;f<g;f++)c=B(a,f,b,"display")+"",c=c.replace($b,""),c=c.replace(/&nbsp;/g," "),c.length>d&&(d=c.length,e=f);return e}function w(a){return null===
+a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function W(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var o=[];f=function(a){a.length&&!h.isArray(a[0])?o.push(a):h.merge(o,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<o.length;a++){i=o[a][0];f=e[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=e[g].sType||"string",o[a]._idx===k&&(o[a]._idx=h.inArray(o[a][1],e[g].asSorting)),d.push({src:i,col:g,dir:o[a][1],
+index:o[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return d}function mb(a){var b,c,d=[],e=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;Ia(a);h=W(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Ib(a,j.col);if("ssp"!=y(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)d[i[b]]=b;g===h.length?i.sort(function(a,b){var c,e,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortData;for(g=0;g<i;g++)if(j=h[g],c=k[j.col],e=m[j.col],c=c<e?-1:c>e?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];
+return c<e?-1:c>e?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,p=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=p[i.col],i=e[i.type+"-"+i.dir]||e["string-"+i.dir],c=i(c,g),0!==c)return c;c=d[a];g=d[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Jb(a){for(var b,c,d=a.aoColumns,e=W(a),a=a.oLanguage.oAria,f=0,g=d.length;f<g;f++){c=d[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<e.length&&e[0].col==f?(i.setAttribute("aria-sort",
+"asc"==e[0].dir?"ascending":"descending"),c=j[e[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",b)}}function Va(a,b,c,d){var e=a.aaSorting,f=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,D(e,"0")),-1!==c?(b=g(e[c],!0),null===b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=f[b],e[c]._idx=
+b)):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);T(a);"function"==typeof d&&d(a)}function Oa(a,b,c,d){var e=a.aoColumns[c];Wa(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Va(a,c,b.shiftKey,d);"ssp"!==y(a)&&C(a,!1)},0)):Va(a,c,b.shiftKey,d))})}function xa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=W(a),e=a.oFeatures,f,g;if(e.bSort&&e.bSortClasses){e=
+0;for(f=b.length;e<f;e++)g=b[e].src,h(D(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3));e=0;for(f=d.length;e<f;e++)g=d[e].src,h(D(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Ib(a,b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ba(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function ya(a){if(a.oFeatures.bStateSave&&
+!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:Ab(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:Ab(a.aoPreSearchCols[d])}})};v(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Kb(a){var b,c,d=a.aoColumns;if(a.oFeatures.bStateSave){var e=a.fnStateLoadCallback.call(a.oInstance,a);if(e&&e.time&&(b=v(a,"aoStateLoadParams",
+"stateLoadParams",[a,e]),-1===h.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&e.time<+new Date-1E3*b)&&d.length===e.columns.length))){a.oLoadedState=h.extend(!0,{},e);e.start!==k&&(a._iDisplayStart=e.start,a.iInitDisplayStart=e.start);e.length!==k&&(a._iDisplayLength=e.length);e.order!==k&&(a.aaSorting=[],h.each(e.order,function(b,c){a.aaSorting.push(c[0]>=d.length?[0,c[1]]:c)}));e.search!==k&&h.extend(a.oPreviousSearch,Bb(e.search));b=0;for(c=e.columns.length;b<c;b++){var f=e.columns[b];f.visible!==
+k&&(d[b].bVisible=f.visible);f.search!==k&&h.extend(a.aoPreSearchCols[b],Bb(f.search))}v(a,"aoStateLoaded","stateLoaded",[a,e])}}}function za(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function K(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)E.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&v(a,null,"error",[a,d,c]),"alert"==
+b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function F(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?F(a,b,d[0],d[1]):F(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Lb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Wa(a,b,c){h(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT",
+b,function(a){13===a.which&&(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function v(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Sa(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c=
+a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Aa(a,b){var c=[],c=Mb.numbers_length,d=Math.floor(c/2);b<=c?c=X(0,b):a<=d?(c=X(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=X(b-(c-2),b):(c=X(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function db(a){h.each({num:function(b){return Ba(b,
+a)},"num-fmt":function(b){return Ba(b,a,Xa)},"html-num":function(b){return Ba(b,a,Ca)},"html-num-fmt":function(b){return Ba(b,a,Ca,Xa)}},function(b,c){s.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(s.type.search[b+a]=s.type.search.html)})}function Nb(a){return function(){var b=[za(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m,s,t,p,r,Ya={},Ob=/[\r\n]/g,Ca=/<.*?>/g,ac=/^[\w\+\-]/,bc=/[\w\+\-]$/,Yb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)",
+"g"),Xa=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,M=function(a){return!a||!0===a||"-"===a?!0:!1},Pb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Qb=function(a,b){Ya[b]||(Ya[b]=RegExp(va(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Ya[b],"."):a},Za=function(a,b,c){var d="string"===typeof a;if(M(a))return!0;b&&d&&(a=Qb(a,b));c&&d&&(a=a.replace(Xa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Rb=function(a,b,c){return M(a)?!0:!(M(a)||"string"===
+typeof a)?null:Za(a.replace(Ca,""),b,c)?!0:null},D=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;e<f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<f;e++)a[e]&&d.push(a[e][b]);return d},ja=function(a,b,c,d){var e=[],f=0,g=b.length;if(d!==k)for(;f<g;f++)a[b[f]][c]&&e.push(a[b[f]][c][d]);else for(;f<g;f++)e.push(a[b[f]][c]);return e},X=function(a,b){var c=[],d;b===k?(b=0,d=a):(d=b,b=a);for(var e=b;e<d;e++)c.push(e);return c},Sb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);
+return b},pa=function(a){var b=[],c,d,e=a.length,f,g=0;d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b},A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},da=/\[.*?\]$/,V=/\(\)$/,wa=h("<div>")[0],Zb=wa.textContent!==k,$b=/<.*?>/g;m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new t(za(this[s.iApiIndex])):new t(this)};this.fnAddData=function(a,b){var c=this.api(!0),
+d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&Z(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],
+h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};
+this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);
+(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return za(this[s.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();(d===k||d)&&h.draw();return 0};this.fnVersionCheck=
+s.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=s.internal;for(var e in m.ext.internal)e&&(this[e]=Nb(e));this.each(function(){var e={},e=1<d?Lb(e,a,!0):a,g=0,j,i=this.getAttribute("id"),o=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())K(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{eb(l);fb(l.column);J(l,l,!0);J(l.column,l.column,!0);J(l,h.extend(e,q.data()));var u=m.settings,g=0;for(j=u.length;g<j;g++){var p=u[g];if(p.nTable==
+this||p.nTHead.parentNode==this||p.nTFoot&&p.nTFoot.parentNode==this){g=e.bRetrieve!==k?e.bRetrieve:l.bRetrieve;if(c||g)return p.oInstance;if(e.bDestroy!==k?e.bDestroy:l.bDestroy){p.oInstance.fnDestroy();break}else{K(p,0,"Cannot reinitialise DataTable",3);return}}if(p.sTableId==this.id){u.splice(g,1);break}}if(null===i||""===i)this.id=i="DataTables_Table_"+m.ext._unique++;var n=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:i,sTableId:i});n.nTable=this;n.oApi=b.internal;
+n.oInit=e;u.push(n);n.oInstance=1===b.length?b:q.dataTable();eb(e);e.oLanguage&&Fa(e.oLanguage);e.aLengthMenu&&!e.iDisplayLength&&(e.iDisplayLength=h.isArray(e.aLengthMenu[0])?e.aLengthMenu[0][0]:e.aLengthMenu[0]);e=Lb(h.extend(!0,{},l),e);F(n.oFeatures,e,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));F(n,e,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu",
+"sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);F(n.oScroll,e,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);F(n.oLanguage,e,"fnInfoCallback");z(n,"aoDrawCallback",
+e.fnDrawCallback,"user");z(n,"aoServerParams",e.fnServerParams,"user");z(n,"aoStateSaveParams",e.fnStateSaveParams,"user");z(n,"aoStateLoadParams",e.fnStateLoadParams,"user");z(n,"aoStateLoaded",e.fnStateLoaded,"user");z(n,"aoRowCallback",e.fnRowCallback,"user");z(n,"aoRowCreatedCallback",e.fnCreatedRow,"user");z(n,"aoHeaderCallback",e.fnHeaderCallback,"user");z(n,"aoFooterCallback",e.fnFooterCallback,"user");z(n,"aoInitComplete",e.fnInitComplete,"user");z(n,"aoPreDrawCallback",e.fnPreDrawCallback,
+"user");n.rowIdFn=Q(e.rowId);gb(n);i=n.oClasses;e.bJQueryUI?(h.extend(i,m.ext.oJUIClasses,e.oClasses),e.sDom===l.sDom&&"lfrtip"===l.sDom&&(n.sDom='<"H"lfr>t<"F"ip>'),n.renderer)?h.isPlainObject(n.renderer)&&!n.renderer.header&&(n.renderer.header="jqueryui"):n.renderer="jqueryui":h.extend(i,m.ext.classes,e.oClasses);q.addClass(i.sTable);n.iInitDisplayStart===k&&(n.iInitDisplayStart=e.iDisplayStart,n._iDisplayStart=e.iDisplayStart);null!==e.iDeferLoading&&(n.bDeferLoading=!0,g=h.isArray(e.iDeferLoading),
+n._iRecordsDisplay=g?e.iDeferLoading[0]:e.iDeferLoading,n._iRecordsTotal=g?e.iDeferLoading[1]:e.iDeferLoading);var t=n.oLanguage;h.extend(!0,t,e.oLanguage);""!==t.sUrl&&(h.ajax({dataType:"json",url:t.sUrl,success:function(a){Fa(a);J(l.oLanguage,a);h.extend(true,t,a);ia(n)},error:function(){ia(n)}}),o=!0);null===e.asStripeClasses&&(n.asStripeClasses=[i.sStripeOdd,i.sStripeEven]);var g=n.asStripeClasses,r=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(g,function(a){return r.hasClass(a)}))&&
+(h("tbody tr",this).removeClass(g.join(" ")),n.asDestroyStripes=g.slice());u=[];g=this.getElementsByTagName("thead");0!==g.length&&(fa(n.aoHeader,g[0]),u=qa(n));if(null===e.aoColumns){p=[];g=0;for(j=u.length;g<j;g++)p.push(null)}else p=e.aoColumns;g=0;for(j=p.length;g<j;g++)Ga(n,u?u[g]:null);ib(n,e.aoColumnDefs,p,function(a,b){la(n,a,b)});if(r.length){var s=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h(r[0]).children("th, td").each(function(a,b){var c=n.aoColumns[a];if(c.mData===
+a){var d=s(b,"sort")||s(b,"order"),e=s(b,"filter")||s(b,"search");if(d!==null||e!==null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:k,type:d!==null?a+".@data-"+d:k,filter:e!==null?a+".@data-"+e:k};la(n,a)}}})}var w=n.oFeatures;e.bStateSave&&(w.bStateSave=!0,Kb(n,e),z(n,"aoDrawCallback",ya,"state_save"));if(e.aaSorting===k){u=n.aaSorting;g=0;for(j=u.length;g<j;g++)u[g][1]=n.aoColumns[g].asSorting[0]}xa(n);w.bSort&&z(n,"aoDrawCallback",function(){if(n.bSorted){var a=W(n),b={};h.each(a,function(a,
+c){b[c.src]=c.dir});v(n,null,"order",[n,a,b]);Jb(n)}});z(n,"aoDrawCallback",function(){(n.bSorted||y(n)==="ssp"||w.bDeferRender)&&xa(n)},"sc");g=q.children("caption").each(function(){this._captionSide=q.css("caption-side")});j=q.children("thead");0===j.length&&(j=h("<thead/>").appendTo(this));n.nTHead=j[0];j=q.children("tbody");0===j.length&&(j=h("<tbody/>").appendTo(this));n.nTBody=j[0];j=q.children("tfoot");if(0===j.length&&0<g.length&&(""!==n.oScroll.sX||""!==n.oScroll.sY))j=h("<tfoot/>").appendTo(this);
+0===j.length||0===j.children().length?q.addClass(i.sNoFooter):0<j.length&&(n.nTFoot=j[0],fa(n.aoFooter,n.nTFoot));if(e.aaData)for(g=0;g<e.aaData.length;g++)N(n,e.aaData[g]);else(n.bDeferLoading||"dom"==y(n))&&ma(n,h(n.nTBody).children("tr"));n.aiDisplay=n.aiDisplayMaster.slice();n.bInitialised=!0;!1===o&&ia(n)}});b=null;return this};var Tb=[],x=Array.prototype,cc=function(a){var b,c,d=m.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=
+h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};t=function(a,b){if(!(this instanceof t))return new t(a,b);var c=[],d=function(a){(a=cc(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=pa(c);b&&h.merge(this,b);this.selector={rows:null,cols:null,opts:null};
+t.extend(this,this,Tb)};m.Api=t;h.extend(t.prototype,{any:function(){return 0!==this.count()},concat:x.concat,context:[],count:function(){return this.flatten().length},each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new t(b[a],this[a]):null},filter:function(a){var b=[];if(x.filter)b=x.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new t(this.context,
+b)},flatten:function(){var a=[];return new t(this.context,a.concat.apply(a,this.toArray()))},join:x.join,indexOf:x.indexOf||function(a,b){for(var c=b||0,d=this.length;c<d;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,d){var e=[],f,g,h,i,o,l=this.context,m,p,r=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);g=0;for(h=l.length;g<h;g++){var n=new t(l[g]);if("table"===b)f=c.call(n,l[g],g),f!==k&&e.push(f);else if("columns"===b||"rows"===b)f=c.call(n,l[g],this[g],g),f!==k&&e.push(f);
+else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){p=this[g];"column-rows"===b&&(m=Da(l[g],r.opts));i=0;for(o=p.length;i<o;i++)f=p[i],f="cell"===b?c.call(n,l[g],f.row,f.column,g,i):c.call(n,l[g],f,g,i,m),f!==k&&e.push(f)}}return e.length||d?(a=new t(l,a?e.concat.apply([],e):e),b=a.selector,b.rows=r.rows,b.cols=r.cols,b.opts=r.opts,a):this},lastIndexOf:x.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(x.map)b=
+x.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new t(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:x.pop,push:x.push,reduce:x.reduce||function(a,b){return hb(this,a,b,0,this.length,1)},reduceRight:x.reduceRight||function(a,b){return hb(this,a,b,this.length-1,-1,-1)},reverse:x.reverse,selector:null,shift:x.shift,sort:x.sort,splice:x.splice,toArray:function(){return x.slice.call(this)},to$:function(){return h(this)},
+toJQuery:function(){return h(this)},unique:function(){return new t(this.context,pa(this))},unshift:x.unshift});t.extend=function(a,b,c){if(c.length&&b&&(b instanceof t||b.__dt_wrapper)){var d,e,f,g=function(a,b,c){return function(){var d=b.apply(a,arguments);t.extend(d,d,c.methodExt);return d}};d=0;for(e=c.length;d<e;d++)f=c[d],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,t.extend(a,b[f.name],f.propExt)}};t.register=p=function(a,b){if(h.isArray(a))for(var c=
+0,d=a.length;c<d;c++)t.register(a[c],b);else for(var e=a.split("."),f=Tb,g,j,c=0,d=e.length;c<d;c++){g=(j=-1!==e[c].indexOf("()"))?e[c].replace("()",""):e[c];var i;a:{i=0;for(var k=f.length;i<k;i++)if(f[i].name===g){i=f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===d-1?i.val=b:f=j?i.methodExt:i.propExt}};t.registerPlural=r=function(a,b,c){t.register(a,c);t.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof t?a.length?h.isArray(a[0])?
+new t(a.context,a[0]):a[0]:k:a})};p("tables()",function(a){var b;if(a){b=t;var c=this.context;if("number"===typeof a)a=[c[a]];else var d=h.map(c,function(a){return a.nTable}),a=h(d).filter(a).map(function(){var a=h.inArray(this,d);return c[a]}).toArray();b=new b(a)}else b=this;return b});p("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new t(b[0]):a});r("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});r("tables().body()",
+"table().body()",function(){return this.iterator("table",function(a){return a.nTBody},1)});r("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});r("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});r("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});p("draw()",function(a){return this.iterator("table",
+function(b){"page"===a?O(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),T(b,!1===a))})});p("page()",function(a){return a===k?this.page.info().page:this.iterator("table",function(b){Ta(b,a)})});p("page.info()",function(){if(0===this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),
+recordsDisplay:d,serverSide:"ssp"===y(a)}});p("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength:k:this.iterator("table",function(b){Ra(b,a)})});var Ub=function(a,b,c){if(c){var d=new t(a);d.one("draw",function(){c(d.ajax.json())})}if("ssp"==y(a))T(a,b);else{C(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();ra(a,[],function(c){na(a);for(var c=sa(a,c),d=0,e=c.length;d<e;d++)N(a,c[d]);T(a,b);C(a,!1)})}};p("ajax.json()",function(){var a=this.context;if(0<
+a.length)return a[0].json});p("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});p("ajax.reload()",function(a,b){return this.iterator("table",function(c){Ub(c,!1===b,a)})});p("ajax.url()",function(a){var b=this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});p("ajax.url().load()",function(a,b){return this.iterator("table",
+function(c){Ub(c,!1===b,a)})});var $a=function(a,b,c,d,e){var f=[],g,j,i,o,l,m;i=typeof b;if(!b||"string"===i||"function"===i||b.length===k)b=[b];i=0;for(o=b.length;i<o;i++){j=b[i]&&b[i].split?b[i].split(","):[b[i]];l=0;for(m=j.length;l<m;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&(f=f.concat(g))}a=s.selector[a];if(a.length){i=0;for(o=a.length;i<o;i++)f=a[i](d,e,f)}return pa(f)},ab=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",
+order:"current",page:"all"},a)},bb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Da=function(a,b){var c,d,e,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;d=b.order;e=b.page;if("ssp"==y(a))return"removed"===j?[]:X(0,c.length);if("current"==e){c=a._iDisplayStart;for(d=a.fnDisplayEnd();c<d;c++)f.push(g[c])}else if("current"==d||"applied"==d)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,
+function(a){return-1===h.inArray(a,g)?a:null});else if("index"==d||"original"==d){c=0;for(d=a.aoData.length;c<d;c++)"none"==j?f.push(c):(e=h.inArray(c,g),(-1===e&&"removed"==j||0<=e&&"applied"==j)&&f.push(c))}return f};p("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var e=b;return $a("row",a,function(a){var b=Pb(a);if(b!==null&&!e)return[b];var j=Da(c,e);if(b!==null&&h.inArray(b,j)!==-1)return[b];if(!a)return j;if(typeof a==="function")return h.map(j,
+function(b){var e=c.aoData[b];return a(b,e._aData,e.nTr)?b:null});b=Sb(ja(c.aoData,j,"nTr"));if(a.nodeName&&h.inArray(a,b)!==-1)return[a._DT_RowIndex];if(typeof a==="string"&&a.charAt(0)==="#"){j=c.aIds[a.replace(/^#/,"")];if(j!==k)return[j.idx]}return h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()},c,e)},1);c.selector.rows=a;c.selector.opts=b;return c});p("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||k},1)});p("rows().data()",function(){return this.iterator(!0,
+"rows",function(a,b){return ja(a.aoData,b,"_aData")},1)});r("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var d=b.aoData[c];return"search"===a?d._aFilterData:d._aSortData},1)});r("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ea(b,c,a)})});r("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});r("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,
+d=0,e=c.length;d<e;d++)for(var f=0,g=this[d].length;f<g;f++){var h=c[d].rowIdFn(c[d].aoData[this[d][f]]._aData);b.push((!0===a?"#":"")+h)}return new t(c,b)});r("rows().remove()","row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,f=e[c],g,h,i,o,l;e.splice(c,1);g=0;for(h=e.length;g<h;g++)if(i=e[g],l=i.anCells,null!==i.nTr&&(i.nTr._DT_RowIndex=g),null!==l){i=0;for(o=l.length;i<o;i++)l[i]._DT_CellIndex.row=g}oa(b.aiDisplayMaster,c);oa(b.aiDisplay,c);oa(a[d],c,!1);
+Sa(b);c=b.rowIdFn(f._aData);c!==k&&delete b.aIds[c]});this.iterator("table",function(a){for(var c=0,d=a.aoData.length;c<d;c++)a.aoData[c].idx=c});return this});p("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(ma(b,c)[0]):h.push(N(b,c));return h},1),c=this.rows(-1);c.pop();h.merge(c,b);return c});p("row()",function(a,b){return bb(this.rows(a,b))});p("row().data()",function(a){var b=
+this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:k;b[0].aoData[this[0]]._aData=a;ea(b[0],this[0],"data");return this});p("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});p("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?ma(b,a)[0]:N(b,a)});return this.row(b[0])});var cb=function(a,b){var c=a.context;if(c.length&&
+(c=c[0].aoData[b!==k?b:a[0]])&&c._details)c._details.remove(),c._detailsShow=k,c._details=k},Vb=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];if(d._details){(d._detailsShow=b)?d._details.insertAfter(d.nTr):d._details.detach();var e=c[0],f=new t(e),g=e.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<D(g,"_details").length&&(f.on("draw.dt.DT_details",function(a,b){e===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];
+a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(e===b)for(var c,d=ca(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",d)}),f.on("destroy.dt.DT_details",function(a,b){if(e===b)for(var c=0,d=g.length;c<d;c++)g[c]._details&&cb(f,c)}))}}};p("row().child()",function(a,b){var c=this.context;if(a===k)return c.length&&this.length?c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1===
+a)cb(this);else if(c.length&&this.length){var d=c[0],c=c[0].aoData[this[0]],e=[],f=function(a,b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?e.push(a):(c=h("<tr><td/></tr>").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=ca(d),e.push(c[0]))};f(a,b);c._details&&c._details.remove();c._details=h(e);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});p(["row().child.show()","row().child().show()"],function(){Vb(this,
+!0);return this});p(["row().child.hide()","row().child().hide()"],function(){Vb(this,!1);return this});p(["row().child.remove()","row().child().remove()"],function(){cb(this);return this});p("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var dc=/^(.+):(name|visIdx|visible)$/,Wb=function(a,b,c,d,e){for(var c=[],d=0,f=e.length;d<f;d++)c.push(B(a,e[d],b));return c};p("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&&
+(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var e=a,f=b,g=c.aoColumns,j=D(g,"sName"),i=D(g,"nTh");return $a("column",e,function(a){var b=Pb(a);if(a==="")return X(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var e=Da(c,f);return h.map(g,function(b,f){return a(f,Wb(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(dc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});
+return[m[m.length+b]]}return[$(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null})}else return h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray()},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});r("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});r("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});r("columns().data()",
+"column().data()",function(){return this.iterator("column-rows",Wb,1)});r("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});r("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return ja(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});r("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ja(a.aoData,
+e,"anCells",b)},1)});r("columns().visible()","column().visible()",function(a,b){return this.iterator("column",function(c,d){if(a===k)return c.aoColumns[d].bVisible;var e=c.aoColumns,f=e[d],g=c.aoData,j,i,m;if(a!==k&&f.bVisible!==a){if(a){var l=h.inArray(!0,D(e,"bVisible"),d+1);j=0;for(i=g.length;j<i;j++)m=g[j].nTr,e=g[j].anCells,m&&m.insertBefore(e[d],e[l]||null)}else h(D(c.aoData,"anCells",d)).detach();f.bVisible=a;ga(c,c.aoHeader);ga(c,c.aoFooter);if(b===k||b)U(c),(c.oScroll.sX||c.oScroll.sY)&&
+Z(c);v(c,null,"column-visibility",[c,d,a,b]);ya(c)}})});r("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?ba(b,c):c},1)});p("columns.adjust()",function(){return this.iterator("table",function(a){U(a)},1)});p("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return $(c,b);if("fromData"===a||"toVisible"===a)return ba(c,b)}});p("column()",function(a,b){return bb(this.columns(a,
+b))});p("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a,e=ab(c),f=b.aoData,g=Da(b,e),j=Sb(ja(f,g,"anCells")),i=h([].concat.apply([],j)),l,m=b.aoColumns.length,o,p,t,r,s,v;return $a("cell",d,function(a){var c=typeof a==="function";if(a===null||a===k||c){o=[];p=0;for(t=g.length;p<t;p++){l=g[p];for(r=0;r<m;r++){s={row:l,column:r};if(c){v=f[l];a(s,B(b,l,r),v.anCells?
+v.anCells[r]:null)&&o.push(s)}else o.push(s)}}return o}return h.isPlainObject(a)?[a]:i.filter(a).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray()},b,e)});var d=this.columns(b,c),e=this.rows(a,c),f,g,j,i,m,l=this.iterator("table",function(a,b){f=[];g=0;for(j=e[b].length;g<j;g++){i=0;for(m=d[b].length;i<m;i++)f.push({row:e[b][g],column:d[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});r("cells().nodes()","cell().node()",function(){return this.iterator("cell",
+function(a,b,c){return(a=a.aoData[b].anCells)?a[c]:k},1)});p("cells().data()",function(){return this.iterator("cell",function(a,b,c){return B(a,b,c)},1)});r("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});r("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return B(b,c,d,a)},1)});r("cells().indexes()","cell().index()",function(){return this.iterator("cell",
+function(a,b,c){return{row:b,column:c,columnVisible:ba(a,c)}},1)});r("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,d){ea(b,c,a,d)})});p("cell()",function(a,b,c){return bb(this.cells(a,b,c))});p("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?B(b[0],c[0].row,c[0].column):k;jb(b[0],c[0].row,c[0].column,a);ea(b[0],c[0].row,"data",c[0].column);return this});p("order()",function(a,b){var c=this.context;if(a===
+k)return 0!==c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:h.isArray(a[0])||(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});p("order.listener()",function(a,b,c){return this.iterator("table",function(d){Oa(d,a,b,c)})});p("order.fixed()",function(a){if(!a){var b=this.context,b=b.length?b[0].aaSortingFixed:k;return h.isArray(b)?{pre:b}:b}return this.iterator("table",function(b){b.aaSortingFixed=h.extend(!0,{},a)})});p(["columns().order()",
+"column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];h.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});p("search()",function(a,b,c,d){var e=this.context;return a===k?0!==e.length?e[0].oPreviousSearch.sSearch:k:this.iterator("table",function(e){e.oFeatures.bFilter&&ha(e,h.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});r("columns().search()","column().search()",function(a,
+b,c,d){return this.iterator("column",function(e,f){var g=e.aoPreSearchCols;if(a===k)return g[f].sSearch;e.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),ha(e,e.oPreviousSearch,1))})});p("state()",function(){return this.context.length?this.context[0].oSavedState:null});p("state.clear()",function(){return this.iterator("table",function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});p("state.loaded()",function(){return this.context.length?
+this.context[0].oLoadedState:null});p("state.save()",function(){return this.iterator("table",function(a){ya(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=m.version.split("."),a=a.split("."),c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;h.each(m.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?h("table",e.nScrollFoot)[0]:
+null;if(e.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(m.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable});return b?new t(c):c};m.util={throttle:ua,escapeRegex:va};m.camelToHungarian=J;p("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){p(b+"()",function(){var a=Array.prototype.slice.call(arguments);
+a[0].match(/\.dt\b/)||(a[0]+=".dt");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});p("clear()",function(){return this.iterator("table",function(a){na(a)})});p("settings()",function(){return new t(this.context,this.context)});p("init()",function(){var a=this.context;return a.length?a[0].oInit:null});p("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});p("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=
+b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),p;b.bDestroying=!0;v(b,"aoDestroyCallback","destroy",[b]);a||(new t(b)).columns().visible(!0);k.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(E).unbind(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));b.aaSorting=[];b.aaSortingFixed=[];xa(b);
+h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);b.bJUI&&(h("th span."+d.sSortIcon+", td span."+d.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+d.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=
+b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%p])}));c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column","row","cell"],function(a,b){p(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,m){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,m)})})});p("i18n()",function(a,b,c){var d=this.context[0],a=Q(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);
+return a.replace("%d",c)});m.version="1.10.10";m.settings=[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,
+sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,
+bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+
+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},
+oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},
+m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};Y(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};
+Y(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],
+aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",
+iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?
+1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};
+m.ext=s={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(s,{afnFiltering:s.search,aTypes:s.type.detect,ofnSearch:s.type.search,oSort:s.type.order,afnSortData:s.order,aoFeatures:s.feature,oApi:s.internal,oStdClasses:s.classes,
+oPagination:s.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",
+sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",
+sJUIHeader:"",sJUIFooter:""});var Ea="",Ea="",G=Ea+"ui-state-default",ka=Ea+"css_right ui-icon ui-icon-",Xb=Ea+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses,m.ext.classes,{sPageButton:"fg-button ui-button "+G,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:G+" sorting_asc",sSortDesc:G+" sorting_desc",sSortable:G+" sorting",
+sSortableAsc:G+" sorting_asc_disabled",sSortableDesc:G+" sorting_desc_disabled",sSortableNone:G+" sorting_disabled",sSortJUIAsc:ka+"triangle-1-n",sSortJUIDesc:ka+"triangle-1-s",sSortJUI:ka+"carat-2-n-s",sSortJUIAscAllowed:ka+"carat-1-n",sSortJUIDescAllowed:ka+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+G,sScrollFoot:"dataTables_scrollFoot "+G,sHeaderTH:G,sFooterTH:G,sJUIHeader:Xb+" ui-corner-tl ui-corner-tr",sJUIFooter:Xb+
+" ui-corner-bl ui-corner-br"});var Mb=m.ext.pager;h.extend(Mb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[Aa(a,b)]},simple_numbers:function(a,b){return["previous",Aa(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Aa(a,b),"next","last"]},_numbers:Aa,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate||
+{},k,l,m=0,p=function(b,d){var n,r,t,s,v=function(b){Ta(a,b.data.action,true)};n=0;for(r=d.length;n<r;n++){s=d[n];if(h.isArray(s)){t=h("<"+(s.DT_el||"div")+"/>").appendTo(b);p(t,s)}else{k=null;l="";switch(s){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break;case "first":k=j.sFirst;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":k=j.sPrevious;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":k=j.sNext;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;case "last":k=
+j.sLast;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;default:k=s+1;l=e===s?g.sPageButtonActive:""}if(k!==null){t=h("<a>",{"class":g.sPageButton+" "+l,"aria-controls":a.sTableId,"aria-label":i[s],"data-dt-idx":m,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(k).appendTo(b);Wa(t,{action:s},v);m++}}}},r;try{r=h(b).find(H.activeElement).data("dt-idx")}catch(n){}p(h(b).empty(),d);r&&h(b).find("[data-dt-idx="+r+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=
+b.oLanguage.sDecimal;return Za(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!ac.test(a)||!bc.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||M(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c,!0)?"html-num-fmt"+c:null},function(a){return M(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":
+null}]);h.extend(m.ext.type.search,{html:function(a){return M(a)?a:"string"===typeof a?a.replace(Ob," ").replace(Ca,""):""},string:function(a){return M(a)?a:"string"===typeof a?a.replace(Ob," "):a}});var Ba=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Qb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(s.type.order,{"date-pre":function(a){return Date.parse(a)||0},"html-pre":function(a){return M(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():
+a+""},"string-pre":function(a){return M(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});db("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,
+b,c,d){h("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]=="asc"?d.sSortJUIAsc:
+h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});m.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return f;f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:function(a){return"string"===typeof a?a.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):
+a}}}};h.extend(m.ext.internal,{_fnExternApiFunc:Nb,_fnBuildAjax:ra,_fnAjaxUpdate:lb,_fnAjaxParameters:ub,_fnAjaxUpdateDraw:vb,_fnAjaxDataSrc:sa,_fnAddColumn:Ga,_fnColumnOptions:la,_fnAdjustColumnSizing:U,_fnVisibleToColumnIndex:$,_fnColumnIndexToVisible:ba,_fnVisbleColumns:ca,_fnGetColumns:aa,_fnColumnTypes:Ia,_fnApplyColumnDefs:ib,_fnHungarianMap:Y,_fnCamelToHungarian:J,_fnLanguageCompat:Fa,_fnBrowserDetect:gb,_fnAddData:N,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:
+null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:jb,_fnSplitObjNotation:La,_fnGetObjectDataFn:Q,_fnSetObjectDataFn:R,_fnGetDataMaster:Ma,_fnClearTable:na,_fnDeleteIndex:oa,_fnInvalidate:ea,_fnGetRowElements:Ka,_fnCreateTr:Ja,_fnBuildHead:kb,_fnDrawHead:ga,_fnDraw:O,_fnReDraw:T,_fnAddOptionsHtml:nb,_fnDetectHeader:fa,_fnGetUniqueThs:qa,_fnFeatureHtmlFilter:pb,_fnFilterComplete:ha,_fnFilterCustom:yb,_fnFilterColumn:xb,_fnFilter:wb,_fnFilterCreateSearch:Qa,
+_fnEscapeRegex:va,_fnFilterData:zb,_fnFeatureHtmlInfo:sb,_fnUpdateInfo:Cb,_fnInfoMacros:Db,_fnInitialise:ia,_fnInitComplete:ta,_fnLengthChange:Ra,_fnFeatureHtmlLength:ob,_fnFeatureHtmlPaginate:tb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:qb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:rb,_fnScrollDraw:Z,_fnApplyToChildren:I,_fnCalculateColumnWidths:Ha,_fnThrottle:ua,_fnConvertToWidth:Fb,_fnGetWidestNode:Gb,_fnGetMaxLenString:Hb,_fnStringToCss:w,_fnSortFlatten:W,_fnSort:mb,_fnSortAria:Jb,_fnSortListener:Va,
+_fnSortAttachListener:Oa,_fnSortingClasses:xa,_fnSortData:Ib,_fnSaveState:ya,_fnLoadState:Kb,_fnSettingsFromNode:za,_fnLog:K,_fnMap:F,_fnBindAction:Wa,_fnCallbackReg:z,_fnCallbackFire:v,_fnLengthOverflow:Sa,_fnRenderer:Pa,_fnDataSource:y,_fnRowAttributes:Na,_fnCalculateEnd:function(){}});h.fn.dataTable=m;m.$=h;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable});
diff --git a/admportal/public/javascripts/jquery.min.js b/admportal/public/javascripts/jquery.min.js
new file mode 100644
index 00000000..ab28a247
--- /dev/null
+++ b/admportal/public/javascripts/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
+if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")
+},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/admportal/public/javascripts/jquery.treegrid.bootstrap3.js b/admportal/public/javascripts/jquery.treegrid.bootstrap3.js
new file mode 100644
index 00000000..1118697f
--- /dev/null
+++ b/admportal/public/javascripts/jquery.treegrid.bootstrap3.js
@@ -0,0 +1,4 @@
+$.extend($.fn.treegrid.defaults, {
+ expanderExpandedClass: 'glyphicon glyphicon-chevron-down',
+ expanderCollapsedClass: 'glyphicon glyphicon-chevron-right'
+});
diff --git a/admportal/public/javascripts/jquery.treegrid.js b/admportal/public/javascripts/jquery.treegrid.js
new file mode 100644
index 00000000..8579d8e7
--- /dev/null
+++ b/admportal/public/javascripts/jquery.treegrid.js
@@ -0,0 +1,626 @@
+/*
+ * jQuery treegrid Plugin 0.2.0
+ * https://github.com/maxazan/jquery-treegrid
+ *
+ * Copyright 2013, Pomazan Max
+ * Licensed under the MIT licenses.
+ */
+(function($) {
+
+ var methods = {
+ /**
+ * Initialize tree
+ *
+ * @param {Object} options
+ * @returns {Object[]}
+ */
+ initTree: function(options) {
+ var settings = $.extend({}, this.treegrid.defaults, options);
+ return this.each(function() {
+ var $this = $(this);
+ $this.treegrid('setTreeContainer', $(this));
+ $this.treegrid('setSettings', settings);
+ settings.getRootNodes.apply(this, [$(this)]).treegrid('initNode', settings);
+ $this.treegrid('getRootNodes').treegrid('render');
+ });
+ },
+ /**
+ * Initialize node
+ *
+ * @param {Object} settings
+ * @returns {Object[]}
+ */
+ initNode: function(settings) {
+ return this.each(function() {
+ var $this = $(this);
+ $this.treegrid('setTreeContainer', settings.getTreeGridContainer.apply(this));
+ $this.treegrid('getChildNodes').treegrid('initNode', settings);
+ $this.treegrid('initExpander').treegrid('initIndent').treegrid('initEvents').treegrid('initState').treegrid('initChangeEvent').treegrid("initSettingsEvents");
+ });
+ },
+ initChangeEvent: function() {
+ var $this = $(this);
+ //Save state on change
+ $this.on("change", function() {
+ var $this = $(this);
+ $this.treegrid('render');
+ if ($this.treegrid('getSetting', 'saveState')) {
+ $this.treegrid('saveState');
+ }
+ });
+ return $this;
+ },
+ /**
+ * Initialize node events
+ *
+ * @returns {Node}
+ */
+ initEvents: function() {
+ var $this = $(this);
+ //Default behavior on collapse
+ $this.on("collapse", function() {
+ var $this = $(this);
+ $this.removeClass('treegrid-expanded');
+ $this.addClass('treegrid-collapsed');
+ });
+ //Default behavior on expand
+ $this.on("expand", function() {
+ var $this = $(this);
+ $this.removeClass('treegrid-collapsed');
+ $this.addClass('treegrid-expanded');
+ });
+
+ return $this;
+ },
+ /**
+ * Initialize events from settings
+ *
+ * @returns {Node}
+ */
+ initSettingsEvents: function() {
+ var $this = $(this);
+ //Save state on change
+ $this.on("change", function() {
+ var $this = $(this);
+ if (typeof($this.treegrid('getSetting', 'onChange')) === "function") {
+ $this.treegrid('getSetting', 'onChange').apply($this);
+ }
+ });
+ //Default behavior on collapse
+ $this.on("collapse", function() {
+ var $this = $(this);
+ if (typeof($this.treegrid('getSetting', 'onCollapse')) === "function") {
+ $this.treegrid('getSetting', 'onCollapse').apply($this);
+ }
+ });
+ //Default behavior on expand
+ $this.on("expand", function() {
+ var $this = $(this);
+ if (typeof($this.treegrid('getSetting', 'onExpand')) === "function") {
+ $this.treegrid('getSetting', 'onExpand').apply($this);
+ }
+
+ });
+
+ return $this;
+ },
+ /**
+ * Initialize expander for node
+ *
+ * @returns {Node}
+ */
+ initExpander: function() {
+ var $this = $(this);
+ var cell = $this.find('td').get($this.treegrid('getSetting', 'treeColumn'));
+ var tpl = $this.treegrid('getSetting', 'expanderTemplate');
+ var expander = $this.treegrid('getSetting', 'getExpander').apply(this);
+ if (expander) {
+ expander.remove();
+ }
+ $(tpl).prependTo(cell).click(function() {
+ $($(this).closest('tr')).treegrid('toggle');
+ });
+ return $this;
+ },
+ /**
+ * Initialize indent for node
+ *
+ * @returns {Node}
+ */
+ initIndent: function() {
+ var $this = $(this);
+ $this.find('.treegrid-indent').remove();
+ var tpl = $this.treegrid('getSetting', 'indentTemplate');
+ var expander = $this.find('.treegrid-expander');
+ var depth = $this.treegrid('getDepth');
+ for (var i = 0; i < depth; i++) {
+ $(tpl).insertBefore(expander);
+ }
+ return $this;
+ },
+ /**
+ * Initialise state of node
+ *
+ * @returns {Node}
+ */
+ initState: function() {
+ var $this = $(this);
+ if ($this.treegrid('getSetting', 'saveState') && !$this.treegrid('isFirstInit')) {
+ $this.treegrid('restoreState');
+ } else {
+ if ($this.treegrid('getSetting', 'initialState') === "expanded") {
+ $this.treegrid('expand');
+ } else {
+ $this.treegrid('collapse');
+ }
+ }
+ return $this;
+ },
+ /**
+ * Return true if this tree was never been initialised
+ *
+ * @returns {Boolean}
+ */
+ isFirstInit: function() {
+ var tree = $(this).treegrid('getTreeContainer');
+ if (tree.data('first_init') === undefined) {
+ tree.data('first_init', $.cookie(tree.treegrid('getSetting', 'saveStateName')) === undefined);
+ }
+ return tree.data('first_init');
+ },
+ /**
+ * Save state of current node
+ *
+ * @returns {Node}
+ */
+ saveState: function() {
+ var $this = $(this);
+ if ($this.treegrid('getSetting', 'saveStateMethod') === 'cookie') {
+
+ var stateArrayString = $.cookie($this.treegrid('getSetting', 'saveStateName')) || '';
+ var stateArray = (stateArrayString === '' ? [] : stateArrayString.split(','));
+ var nodeId = $this.treegrid('getNodeId');
+
+ if ($this.treegrid('isExpanded')) {
+ if ($.inArray(nodeId, stateArray) === -1) {
+ stateArray.push(nodeId);
+ }
+ } else if ($this.treegrid('isCollapsed')) {
+ if ($.inArray(nodeId, stateArray) !== -1) {
+ stateArray.splice($.inArray(nodeId, stateArray), 1);
+ }
+ }
+ $.cookie($this.treegrid('getSetting', 'saveStateName'), stateArray.join(','));
+ }
+ return $this;
+ },
+ /**
+ * Restore state of current node.
+ *
+ * @returns {Node}
+ */
+ restoreState: function() {
+ var $this = $(this);
+ if ($this.treegrid('getSetting', 'saveStateMethod') === 'cookie') {
+ var stateArray = $.cookie($this.treegrid('getSetting', 'saveStateName')).split(',');
+ if ($.inArray($this.treegrid('getNodeId'), stateArray) !== -1) {
+ $this.treegrid('expand');
+ } else {
+ $this.treegrid('collapse');
+ }
+
+ }
+ return $this;
+ },
+ /**
+ * Method return setting by name
+ *
+ * @param {type} name
+ * @returns {unresolved}
+ */
+ getSetting: function(name) {
+ if (!$(this).treegrid('getTreeContainer')) {
+ return null;
+ }
+ return $(this).treegrid('getTreeContainer').data('settings')[name];
+ },
+ /**
+ * Add new settings
+ *
+ * @param {Object} settings
+ */
+ setSettings: function(settings) {
+ $(this).treegrid('getTreeContainer').data('settings', settings);
+ },
+ /**
+ * Return tree container
+ *
+ * @returns {HtmlElement}
+ */
+ getTreeContainer: function() {
+ return $(this).data('treegrid');
+ },
+ /**
+ * Set tree container
+ *
+ * @param {HtmlE;ement} container
+ */
+ setTreeContainer: function(container) {
+ return $(this).data('treegrid', container);
+ },
+ /**
+ * Method return all root nodes of tree.
+ *
+ * Start init all child nodes from it.
+ *
+ * @returns {Array}
+ */
+ getRootNodes: function() {
+ return $(this).treegrid('getSetting', 'getRootNodes').apply(this, [$(this).treegrid('getTreeContainer')]);
+ },
+ /**
+ * Method return all nodes of tree.
+ *
+ * @returns {Array}
+ */
+ getAllNodes: function() {
+ return $(this).treegrid('getSetting', 'getAllNodes').apply(this, [$(this).treegrid('getTreeContainer')]);
+ },
+ /**
+ * Mthod return true if element is Node
+ *
+ * @returns {String}
+ */
+ isNode: function() {
+ return $(this).treegrid('getNodeId') !== null;
+ },
+ /**
+ * Mthod return id of node
+ *
+ * @returns {String}
+ */
+ getNodeId: function() {
+ if ($(this).treegrid('getSetting', 'getNodeId') === null) {
+ return null;
+ } else {
+ return $(this).treegrid('getSetting', 'getNodeId').apply(this);
+ }
+ },
+ /**
+ * Method return parent id of node or null if root node
+ *
+ * @returns {String}
+ */
+ getParentNodeId: function() {
+ return $(this).treegrid('getSetting', 'getParentNodeId').apply(this);
+ },
+ /**
+ * Method return parent node or null if root node
+ *
+ * @returns {Object[]}
+ */
+ getParentNode: function() {
+ if ($(this).treegrid('getParentNodeId') === null) {
+ return null;
+ } else {
+ return $(this).treegrid('getSetting', 'getNodeById').apply(this, [$(this).treegrid('getParentNodeId'), $(this).treegrid('getTreeContainer')]);
+ }
+ },
+ /**
+ * Method return array of child nodes or null if node is leaf
+ *
+ * @returns {Object[]}
+ */
+ getChildNodes: function() {
+ return $(this).treegrid('getSetting', 'getChildNodes').apply(this, [$(this).treegrid('getNodeId'), $(this).treegrid('getTreeContainer')]);
+ },
+ /**
+ * Method return depth of tree.
+ *
+ * This method is needs for calculate indent
+ *
+ * @returns {Number}
+ */
+ getDepth: function() {
+ if ($(this).treegrid('getParentNode') === null) {
+ return 0;
+ }
+ return $(this).treegrid('getParentNode').treegrid('getDepth') + 1;
+ },
+ /**
+ * Method return true if node is root
+ *
+ * @returns {Boolean}
+ */
+ isRoot: function() {
+ return $(this).treegrid('getDepth') === 0;
+ },
+ /**
+ * Method return true if node has no child nodes
+ *
+ * @returns {Boolean}
+ */
+ isLeaf: function() {
+ return $(this).treegrid('getChildNodes').length === 0;
+ },
+ /**
+ * Method return true if node last in branch
+ *
+ * @returns {Boolean}
+ */
+ isLast: function() {
+ if ($(this).treegrid('isNode')) {
+ var parentNode = $(this).treegrid('getParentNode');
+ if (parentNode === null) {
+ if ($(this).treegrid('getNodeId') === $(this).treegrid('getRootNodes').last().treegrid('getNodeId')) {
+ return true;
+ }
+ } else {
+ if ($(this).treegrid('getNodeId') === parentNode.treegrid('getChildNodes').last().treegrid('getNodeId')) {
+ return true;
+ }
+ }
+ }
+ return false;
+ },
+ /**
+ * Method return true if node first in branch
+ *
+ * @returns {Boolean}
+ */
+ isFirst: function() {
+ if ($(this).treegrid('isNode')) {
+ var parentNode = $(this).treegrid('getParentNode');
+ if (parentNode === null) {
+ if ($(this).treegrid('getNodeId') === $(this).treegrid('getRootNodes').first().treegrid('getNodeId')) {
+ return true;
+ }
+ } else {
+ if ($(this).treegrid('getNodeId') === parentNode.treegrid('getChildNodes').first().treegrid('getNodeId')) {
+ return true;
+ }
+ }
+ }
+ return false;
+ },
+ /**
+ * Return true if node expanded
+ *
+ * @returns {Boolean}
+ */
+ isExpanded: function() {
+ return $(this).hasClass('treegrid-expanded');
+ },
+ /**
+ * Return true if node collapsed
+ *
+ * @returns {Boolean}
+ */
+ isCollapsed: function() {
+ return $(this).hasClass('treegrid-collapsed');
+ },
+ /**
+ * Return true if at least one of parent node is collapsed
+ *
+ * @returns {Boolean}
+ */
+ isOneOfParentsCollapsed: function() {
+ var $this = $(this);
+ if ($this.treegrid('isRoot')) {
+ return false;
+ } else {
+ if ($this.treegrid('getParentNode').treegrid('isCollapsed')) {
+ return true;
+ } else {
+ return $this.treegrid('getParentNode').treegrid('isOneOfParentsCollapsed');
+ }
+ }
+ },
+ /**
+ * Expand node
+ *
+ * @returns {Node}
+ */
+ expand: function() {
+ if (!this.treegrid('isLeaf') && !this.treegrid("isExpanded")) {
+ this.trigger("expand");
+ this.trigger("change");
+ return this;
+ }
+ return this;
+ },
+ /**
+ * Expand all nodes
+ *
+ * @returns {Node}
+ */
+ expandAll: function() {
+ var $this = $(this);
+ $this.treegrid('getRootNodes').treegrid('expandRecursive');
+ return $this;
+ },
+ /**
+ * Expand current node and all child nodes begin from current
+ *
+ * @returns {Node}
+ */
+ expandRecursive: function() {
+ return $(this).each(function() {
+ var $this = $(this);
+ $this.treegrid('expand');
+ if (!$this.treegrid('isLeaf')) {
+ $this.treegrid('getChildNodes').treegrid('expandRecursive');
+ }
+ });
+ },
+ /**
+ * Collapse node
+ *
+ * @returns {Node}
+ */
+ collapse: function() {
+ return $(this).each(function() {
+ var $this = $(this);
+ if (!$this.treegrid('isLeaf') && !$this.treegrid("isCollapsed")) {
+ $this.trigger("collapse");
+ $this.trigger("change");
+ }
+ });
+ },
+ /**
+ * Collapse all nodes
+ *
+ * @returns {Node}
+ */
+ collapseAll: function() {
+ var $this = $(this);
+ $this.treegrid('getRootNodes').treegrid('collapseRecursive');
+ return $this;
+ },
+ /**
+ * Collapse current node and all child nodes begin from current
+ *
+ * @returns {Node}
+ */
+ collapseRecursive: function() {
+ return $(this).each(function() {
+ var $this = $(this);
+ $this.treegrid('collapse');
+ if (!$this.treegrid('isLeaf')) {
+ $this.treegrid('getChildNodes').treegrid('collapseRecursive');
+ }
+ });
+ },
+ /**
+ * Expand if collapsed, Collapse if expanded
+ *
+ * @returns {Node}
+ */
+ toggle: function() {
+ var $this = $(this);
+ if ($this.treegrid('isExpanded')) {
+ $this.treegrid('collapse');
+ } else {
+ $this.treegrid('expand');
+ }
+ return $this;
+ },
+ /**
+ * Rendering node
+ *
+ * @returns {Node}
+ */
+ render: function() {
+ return $(this).each(function() {
+ var $this = $(this);
+ //if parent colapsed we hidden
+ if ($this.treegrid('isOneOfParentsCollapsed')) {
+ $this.hide();
+ } else {
+ $this.show();
+ }
+ if (!$this.treegrid('isLeaf')) {
+ $this.treegrid('renderExpander');
+ $this.treegrid('getChildNodes').treegrid('render');
+ }
+ });
+ },
+ /**
+ * Rendering expander depends on node state
+ *
+ * @returns {Node}
+ */
+ renderExpander: function() {
+ return $(this).each(function() {
+ var $this = $(this);
+ var expander = $this.treegrid('getSetting', 'getExpander').apply(this);
+ if (expander) {
+
+ if (!$this.treegrid('isCollapsed')) {
+ expander.removeClass($this.treegrid('getSetting', 'expanderCollapsedClass'));
+ expander.addClass($this.treegrid('getSetting', 'expanderExpandedClass'));
+ } else {
+ expander.removeClass($this.treegrid('getSetting', 'expanderExpandedClass'));
+ expander.addClass($this.treegrid('getSetting', 'expanderCollapsedClass'));
+ }
+ } else {
+ $this.treegrid('initExpander');
+ $this.treegrid('renderExpander');
+ }
+ });
+ }
+ };
+ $.fn.treegrid = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ } else if (typeof method === 'object' || !method) {
+ return methods.initTree.apply(this, arguments);
+ } else {
+ $.error('Method with name ' + method + ' does not exists for jQuery.treegrid');
+ }
+ };
+ /**
+ * Plugin's default options
+ */
+ $.fn.treegrid.defaults = {
+ initialState: 'expanded',
+ saveState: false,
+ saveStateMethod: 'cookie',
+ saveStateName: 'tree-grid-state',
+ expanderTemplate: '<span class="treegrid-expander"></span>',
+ indentTemplate: '<span class="treegrid-indent"></span>',
+ expanderExpandedClass: 'treegrid-expander-expanded',
+ expanderCollapsedClass: 'treegrid-expander-collapsed',
+ treeColumn: 0,
+ getExpander: function() {
+ return $(this).find('.treegrid-expander');
+ },
+ getNodeId: function() {
+ var template = /treegrid-([A-Za-z0-9_-]+)/;
+ if (template.test($(this).attr('class'))) {
+ return template.exec($(this).attr('class'))[1];
+ }
+ return null;
+ },
+ getParentNodeId: function() {
+ var template = /treegrid-parent-([A-Za-z0-9_-]+)/;
+ if (template.test($(this).attr('class'))) {
+ return template.exec($(this).attr('class'))[1];
+ }
+ return null;
+ },
+ getNodeById: function(id, treegridContainer) {
+ var templateClass = "treegrid-" + id;
+ return treegridContainer.find('tr.' + templateClass);
+ },
+ getChildNodes: function(id, treegridContainer) {
+ var templateClass = "treegrid-parent-" + id;
+ return treegridContainer.find('tr.' + templateClass);
+ },
+ getTreeGridContainer: function() {
+ return $(this).closest('table');
+ },
+ getRootNodes: function(treegridContainer) {
+ var result = $.grep(treegridContainer.find('tr'), function(element) {
+ var classNames = $(element).attr('class');
+ var templateClass = /treegrid-([A-Za-z0-9_-]+)/;
+ var templateParentClass = /treegrid-parent-([A-Za-z0-9_-]+)/;
+ return templateClass.test(classNames) && !templateParentClass.test(classNames);
+ });
+ return $(result);
+ },
+ getAllNodes: function(treegridContainer) {
+ var result = $.grep(treegridContainer.find('tr'), function(element) {
+ var classNames = $(element).attr('class');
+ var templateClass = /treegrid-([A-Za-z0-9_-]+)/;
+ return templateClass.test(classNames);
+ });
+ return $(result);
+ },
+ //Events
+ onCollapse: null,
+ onExpand: null,
+ onChange: null
+
+ };
+})(jQuery);
diff --git a/admportal/public/javascripts/sla.js b/admportal/public/javascripts/sla.js
new file mode 100644
index 00000000..53c49316
--- /dev/null
+++ b/admportal/public/javascripts/sla.js
@@ -0,0 +1,9 @@
+function uploadDG(form)
+{
+ if ( form.filename.value.length == 0)
+ {
+ alert('Must select a file.');
+ return false;
+ }
+ else { form.submit(); return; }
+}
diff --git a/admportal/public/stylesheets/bootstrap-submenu.css b/admportal/public/stylesheets/bootstrap-submenu.css
new file mode 100644
index 00000000..91e88db3
--- /dev/null
+++ b/admportal/public/stylesheets/bootstrap-submenu.css
@@ -0,0 +1,125 @@
+/*!
+ * Bootstrap-submenu v2.0.3 (https://vsn4ik.github.io/bootstrap-submenu/)
+ * Copyright 2015 Vasily A. (https://github.com/vsn4ik)
+ * Licensed under the MIT license
+ */
+
+.dropdown-submenu > a:after {
+ content: "";
+}
+@media (min-width: 768px) {
+ .dropdown-submenu {
+ position: relative;
+ }
+ .dropdown-submenu .dropdown-menu {
+ top: 0;
+ left: 100%;
+ margin-top: -6px;
+ border-top-left-radius: 0;
+ }
+ .dropup .dropdown-submenu .dropdown-menu,
+ .navbar-fixed-bottom .dropdown-submenu .dropdown-menu {
+ top: auto;
+ bottom: 0;
+ margin-top: 0;
+ margin-bottom: -6px;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 0;
+ }
+ .dropdown-menu-right .dropdown-submenu .dropdown-menu,
+ .navbar-right .dropdown-submenu .dropdown-menu {
+ left: auto;
+ right: 100%;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 0;
+ }
+ .dropup .dropdown-menu-right .dropdown-submenu .dropdown-menu,
+ .dropup .navbar-right .dropdown-submenu .dropdown-menu,
+ .navbar-fixed-bottom .dropdown-menu-right .dropdown-submenu .dropdown-menu,
+ .navbar-fixed-bottom .navbar-right .dropdown-submenu .dropdown-menu {
+ border-radius: 4px 4px 0;
+ }
+ .dropdown-submenu > a:after {
+ float: right;
+ margin-top: 6px;
+ margin-right: -10px;
+ border-left: 4px dashed;
+ border-top: 4px solid transparent;
+ border-bottom: 4px solid transparent;
+ }
+ .dropdown-menu-right .dropdown-submenu > a:after,
+ .navbar-right .dropdown-submenu > a:after {
+ float: left;
+ border-left: none;
+ margin-left: -10px;
+ margin-right: 0;
+ border-right: 4px dashed;
+ border-top: 4px solid transparent;
+ border-bottom: 4px solid transparent;
+ }
+}
+@media (max-width: 767px) {
+ .dropdown-submenu .dropdown-menu {
+ position: static;
+ margin-top: 0;
+ border: 0;
+ box-shadow: none;
+ }
+ .dropdown-submenu > a:after {
+ margin-left: 6px;
+ display: inline-block;
+ vertical-align: middle;
+ border-top: 4px dashed;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ }
+ .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li.dropdown-header,
+ .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li.dropdown-header,
+ .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li.dropdown-header,
+ .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > a,
+ .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > a,
+ .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > a {
+ padding-left: 30px;
+ }
+ .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > a,
+ .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > a,
+ .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > a {
+ padding-left: 40px;
+ }
+ .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a,
+ .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a,
+ .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a {
+ padding-left: 50px;
+ }
+ .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a,
+ .dropup > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a,
+ .btn-group > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a {
+ padding-left: 60px;
+ }
+ .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li.dropdown-header,
+ .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > a {
+ padding-left: 35px;
+ }
+ .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > a {
+ padding-left: 45px;
+ }
+ .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a {
+ padding-left: 55px;
+ }
+ .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li.dropdown-header,
+ .navbar-nav > .dropdown > .dropdown-menu > .dropdown-submenu > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > .dropdown-menu > li > a {
+ padding-left: 65px;
+ }
+}
+/*# sourceMappingURL=bootstrap-submenu.css.map */ \ No newline at end of file
diff --git a/admportal/public/stylesheets/bootstrap-submenu.css.map b/admportal/public/stylesheets/bootstrap-submenu.css.map
new file mode 100644
index 00000000..4ab4300a
--- /dev/null
+++ b/admportal/public/stylesheets/bootstrap-submenu.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["less/bootstrap-submenu.less","less/mixins.less"],"names":[],"mappings":"AAYA,iBAAkB,IAAG;EACnB,SAAS,EAAT;;AA2DF,QAxD2C;EACzC;IACE,kBAAA;;EADF,iBAGE;IACE,MAAA;IACA,UAAA;IACA,gBAAA;IACA,yBAAA;;EAGA,OAAQ,kBAPV;EAQE,oBAAqB,kBARvB;IASI,SAAA;IACA,SAAA;IACA,aAAA;IACA,mBAAA;IACA,2BAAA;IACA,4BAAA;;EAGF,oBAAqB,kBAjBvB;EAkBE,aAAc,kBAlBhB;IAmBI,UAAA;IACA,WAAA;IAEA,2BAAA;IACA,0BAAA;;EAEA,OAAQ,qBARW,kBAjBvB;EAyBI,OAAQ,cAPI,kBAlBhB;EA0BI,oBAAqB,qBATF,kBAjBvB;EA0BI,oBAAqB,cART,kBAlBhB;IA2BM,wBAAA;;EA9BR,iBAmCE,IAAG;IACD,YAAA;IACA,eAAA;IACA,mBAAA;ICrDJ,uBAAA;IAEA,iCAAA;IACA,oCAAA;;EDsDI,oBAAqB,kBAPvB,IAAG;EAQD,aAAc,kBARhB,IAAG;IASC,WAAA;IACA,iBAAA;IACA,kBAAA;IACA,eAAA;IC9DN,wBAAA;IAEA,iCAAA;IACA,oCAAA;;;ADiGF,QA9B+C;EAC7C,iBACE;IACE,gBAAA;IACA,aAAA;IACA,SAAA;IACA,gBAAA;;EALJ,iBAQE,IAAG;IACD,gBAAA;IACA,qBAAA;IACA,sBAAA;IClFJ,sBAAA;IAEA,kCAAA;IACA,mCAAA;;EAKE,SDiFU,iBADG,oBCjFf,iBAAiB,KACd;EAAD,ODkFQ,iBAFK,oBCjFf,iBAAiB,KACd;EAAD,UDmFW,iBAHE,oBCjFf,iBAAiB,KACd;EDiFD,SAAU,iBADG,oBCjFf,iBAAiB,KAEf;EDiFA,OAAQ,iBAFK,oBCjFf,iBAAiB,KAEf;EDkFA,UAAW,iBAHE,oBCjFf,iBAAiB,KAEf;IACE,kBAAA;;EAFF,SDiFU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,ODkFQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,UDmFW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KACd;EDiFD,SAAU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAEf;EDiFA,OAAQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAEf;EDkFA,UAAW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA;;EAFF,SDiFU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,ODkFQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,UDmFW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EDiFD,SAAU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;EDiFA,OAAQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;EDkFA,UAAW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA;;EAFF,SDiFU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,ODkFQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EAAD,UDmFW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EDiFD,SAAU,iBADG,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;EDiFA,OAAQ,iBAFK,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;EDkFA,UAAW,iBAHE,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA;;EAFF,WDuFY,YAAY,iBAPX,oBCjFf,iBAAiB,KACd;EDuFD,WAAY,YAAY,iBAPX,oBCjFf,iBAAiB,KAEf;IACE,kBAAA;;EAFF,WDuFY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KACd;EDuFD,WAAY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA;;EAFF,WDuFY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EDuFD,WAAY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA;;EAFF,WDuFY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KACd;EDuFD,WAAY,YAAY,iBAPX,oBCjFf,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAAjB,iBAAiB,KAEf;IACE,kBAAA","sourcesContent":["// :after: friends with IE8. Use ::after in future.\n\n@import \"../node_modules/bootstrap/less/variables.less\";\n@import \"mixins.less\";\n\n// Variables\n@caret-margin: -@caret-width-base * 2 - 2;\n\n//\n// Sub-Menus\n// --------------------------------------------------\n\n.dropdown-submenu > a:after {\n content: \"\";\n}\n\n@media (min-width: @grid-float-breakpoint) {\n .dropdown-submenu {\n position: relative;\n\n .dropdown-menu {\n top: 0;\n left: 100%;\n margin-top: -6px;\n border-top-left-radius: 0;\n\n // Strictly before .dropdown-menu-right\n .dropup &,\n .navbar-fixed-bottom & {\n top: auto;\n bottom: 0;\n margin-top: 0;\n margin-bottom: -6px;\n border-top-left-radius: @border-radius-base;\n border-bottom-left-radius: 0;\n }\n\n .dropdown-menu-right &,\n .navbar-right & {\n left: auto;\n right: 100%;\n\n border-top-left-radius: @border-radius-base;\n border-top-right-radius: 0;\n\n .dropup &,\n .navbar-fixed-bottom & {\n border-radius: @border-radius-base @border-radius-base 0;\n }\n }\n }\n\n > a:after {\n float: right;\n margin-top: @line-height-computed / 2 - @caret-width-base;\n margin-right: @caret-margin;\n\n .make-caret(left, top, bottom);\n\n .dropdown-menu-right &,\n .navbar-right & {\n float: left;\n border-left: none;\n margin-left: @caret-margin;\n margin-right: 0;\n\n .make-caret(right, top, bottom);\n }\n }\n }\n}\n\n@media (max-width: @grid-float-breakpoint-max) {\n .dropdown-submenu {\n .dropdown-menu {\n position: static;\n margin-top: 0;\n border: 0;\n box-shadow: none;\n }\n\n > a:after {\n margin-left: 6px;\n display: inline-block;\n vertical-align: middle;\n\n .make-caret(top, left, right);\n }\n }\n\n .dropdown-menu > .dropdown-submenu {\n .dropdown > &,\n .dropup > &,\n .btn-group > & {\n .make-nested-list(30px, 0, 4);\n }\n\n .navbar-nav > .dropdown > & {\n .make-nested-list(35px, 0, 4);\n }\n }\n}\n",".make-caret(@base, @left, @right) {\n // dashed: fix caret size for Mozilla Firefox\n border-@{base}: @caret-width-base dashed;\n\n border-@{left}: @caret-width-base solid transparent;\n border-@{right}: @caret-width-base solid transparent;\n}\n\n.make-nested-list(@offset, @i, @n) when (@i < @n) {\n > .dropdown-menu > li {\n &.dropdown-header,\n > a {\n padding-left: @offset + (10 * @i);\n }\n\n .make-nested-list(@offset, @i + 1, @n);\n }\n}\n"]} \ No newline at end of file
diff --git a/admportal/public/stylesheets/bootstrap-submenu.min.css b/admportal/public/stylesheets/bootstrap-submenu.min.css
new file mode 100644
index 00000000..7199e0d8
--- /dev/null
+++ b/admportal/public/stylesheets/bootstrap-submenu.min.css
@@ -0,0 +1,8 @@
+/*!
+ * Bootstrap-submenu v2.0.3 (https://vsn4ik.github.io/bootstrap-submenu/)
+ * Copyright 2015 Vasily A. (https://github.com/vsn4ik)
+ * Licensed under the MIT license
+ */
+
+.dropdown-submenu>a:after{content:""}@media (min-width:768px){.dropdown-submenu{position:relative}.dropdown-submenu .dropdown-menu{top:0;left:100%;margin-top:-6px;border-top-left-radius:0}.dropup .dropdown-submenu .dropdown-menu,.navbar-fixed-bottom .dropdown-submenu .dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-6px;border-top-left-radius:4px;border-bottom-left-radius:0}.dropdown-menu-right .dropdown-submenu .dropdown-menu,.navbar-right .dropdown-submenu .dropdown-menu{left:auto;right:100%;border-top-left-radius:4px;border-top-right-radius:0}.dropup .dropdown-menu-right .dropdown-submenu .dropdown-menu,.dropup .navbar-right .dropdown-submenu .dropdown-menu,.navbar-fixed-bottom .dropdown-menu-right .dropdown-submenu .dropdown-menu,.navbar-fixed-bottom .navbar-right .dropdown-submenu .dropdown-menu{border-radius:4px 4px 0}.dropdown-submenu>a:after{float:right;margin-top:6px;margin-right:-10px;border-left:4px dashed;border-top:4px solid transparent;border-bottom:4px solid transparent}.dropdown-menu-right .dropdown-submenu>a:after,.navbar-right .dropdown-submenu>a:after{float:left;border-left:none;margin-left:-10px;margin-right:0;border-right:4px dashed;border-top:4px solid transparent;border-bottom:4px solid transparent}}@media (max-width:767px){.dropdown-submenu .dropdown-menu{position:static;margin-top:0;border:0;box-shadow:none}.dropdown-submenu>a:after{margin-left:6px;display:inline-block;vertical-align:middle;border-top:4px dashed;border-left:4px solid transparent;border-right:4px solid transparent}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a{padding-left:30px}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:40px}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:50px}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:60px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a{padding-left:35px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:45px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:55px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:65px}}
+/*# sourceMappingURL=bootstrap-submenu.min.css.map */ \ No newline at end of file
diff --git a/admportal/public/stylesheets/bootstrap-submenu.min.css.map b/admportal/public/stylesheets/bootstrap-submenu.min.css.map
new file mode 100644
index 00000000..6eab8c7c
--- /dev/null
+++ b/admportal/public/stylesheets/bootstrap-submenu.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["less/bootstrap-submenu.less","less/mixins.less"],"names":[],"mappings":"AAYqB,0BACnB,QAAA,GAGyC,yBACzC,kBACE,SAAA,SAEA,iCACE,IAAA,EACA,KAAA,KACA,WAAA,KACA,uBAAA,EAJF,yCAAA,sDASI,IAAA,KACA,OAAA,EACA,WAAA,EACA,cAAA,KACA,uBAAA,IACA,0BAAA,EAdJ,sDAAA,+CAmBI,KAAA,KACA,MAAA,KAEA,uBAAA,IACA,wBAAA,EAvBJ,8DAAA,uDAAA,2EAAA,oEA2BM,cAAA,IAAA,IAAA,EAKH,0BACD,MAAA,MACA,WAAA,IACA,aAAA,MCrDJ,YAAA,IAAA,OAEA,WAAA,IAAA,MAAA,YACA,cAAA,IAAA,MAAA,YD+CK,+CAAA,wCASC,MAAA,KACA,YAAA,KACA,YAAA,MACA,aAAA,EC9DN,aAAA,IAAA,OAEA,WAAA,IAAA,MAAA,YACA,cAAA,IAAA,MAAA,aDmE6C,yBAE3C,iCACE,SAAA,OACA,WAAA,EACA,OAAA,EACA,WAAA,KAGC,0BACD,YAAA,IACA,QAAA,aACA,eAAA,OClFJ,WAAA,IAAA,OAEA,YAAA,IAAA,MAAA,YACA,aAAA,IAAA,MAAA,YAKG,8EACD,gEADC,6EACD,+DADC,2EACD,6DACE,aAAA,KAFD,gGACD,kFADC,+FACD,iFADC,6FACD,+EACE,aAAA,KAFD,kHACD,oGADC,iHACD,mGADC,+GACD,iGACE,aAAA,KAFD,oIACD,sHADC,mIACD,qHADC,iIACD,mHACE,aAAA,KAFD,yFACD,2EACE,aAAA,KAFD,2GACD,6FACE,aAAA,KAFD,6HACD,+GACE,aAAA,KAFD,+IACD,iIACE,aAAA"} \ No newline at end of file
diff --git a/admportal/public/stylesheets/bootstrap-table.css b/admportal/public/stylesheets/bootstrap-table.css
new file mode 100644
index 00000000..66d56318
--- /dev/null
+++ b/admportal/public/stylesheets/bootstrap-table.css
@@ -0,0 +1,297 @@
+/**
+ * @author zhixin wen <wenzhixin2010@gmail.com>
+ * version: 1.8.1
+ * https://github.com/wenzhixin/bootstrap-table/
+ */
+
+.bootstrap-table .table {
+ margin-bottom: 0 !important;
+ border-bottom: 1px solid #dddddd;
+ border-collapse: collapse !important;
+ border-radius: 1px;
+}
+
+.bootstrap-table .table:not(.table-condensed),
+.bootstrap-table .table:not(.table-condensed) > tbody > tr > th,
+.bootstrap-table .table:not(.table-condensed) > tfoot > tr > th,
+.bootstrap-table .table:not(.table-condensed) > thead > tr > td,
+.bootstrap-table .table:not(.table-condensed) > tbody > tr > td,
+.bootstrap-table .table:not(.table-condensed) > tfoot > tr > td {
+ padding: 8px !important;
+}
+
+.bootstrap-table .table.table-no-bordered > thead > tr > th,
+.bootstrap-table .table.table-no-bordered > tbody > tr > td {
+ border-right: 2px solid transparent;
+}
+
+.fixed-table-container {
+ position: relative;
+ clear: both;
+ border: 1px solid #dddddd;
+ border-radius: 4px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+}
+
+.fixed-table-container.table-no-bordered {
+ border: 1px solid transparent;
+}
+
+.fixed-table-footer,
+.fixed-table-header {
+ overflow: hidden;
+}
+
+.fixed-table-footer {
+ border-top: 1px solid #dddddd;
+}
+
+.fixed-table-body {
+ overflow-x: auto;
+ overflow-y: auto;
+ height: 100%;
+}
+
+.fixed-table-container table {
+ width: 100%;
+}
+
+.fixed-table-container thead th {
+ height: 0;
+ padding: 0;
+ margin: 0;
+ border-left: 1px solid #dddddd;
+}
+
+.fixed-table-container thead th:first-child {
+ border-left: none;
+ border-top-left-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+}
+
+.fixed-table-container thead th .th-inner,
+.fixed-table-container tbody td .th-inner {
+ padding: 8px;
+ line-height: 24px;
+ vertical-align: top;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.fixed-table-container thead th .sortable {
+ cursor: pointer;
+ background-position: right;
+ background-repeat: no-repeat;
+ padding-right: 30px;
+}
+
+.fixed-table-container thead th .both {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC');
+}
+
+.fixed-table-container thead th .asc {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==');
+}
+
+.fixed-table-container thead th .desc {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= ');
+}
+
+.fixed-table-container th.detail {
+ width: 30px;
+}
+
+.fixed-table-container tbody td {
+ border-left: 1px solid #dddddd;
+}
+
+.fixed-table-container tbody tr:first-child td {
+ border-top: none;
+}
+
+.fixed-table-container tbody td:first-child {
+ border-left: none;
+}
+
+/* the same color with .active */
+.fixed-table-container tbody .selected td {
+ background-color: #f5f5f5;
+}
+
+.fixed-table-container .bs-checkbox {
+ text-align: center;
+}
+
+.fixed-table-container .bs-checkbox .th-inner {
+ padding: 8px 0;
+}
+
+.fixed-table-container input[type="radio"],
+.fixed-table-container input[type="checkbox"] {
+ margin: 0 auto !important;
+}
+
+.fixed-table-container .no-records-found {
+ text-align: center;
+}
+
+.fixed-table-pagination div.pagination,
+.fixed-table-pagination .pagination-detail {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.fixed-table-pagination div.pagination .pagination {
+ margin: 0;
+}
+
+.fixed-table-pagination .pagination a {
+ padding: 6px 12px;
+ line-height: 1.428571429;
+}
+
+.fixed-table-pagination .pagination-info {
+ line-height: 34px;
+ margin-right: 5px;
+}
+
+.fixed-table-pagination .btn-group {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.fixed-table-pagination .dropup .dropdown-menu {
+ margin-bottom: 0;
+}
+
+.fixed-table-pagination .page-list {
+ display: inline-block;
+}
+
+.fixed-table-toolbar .columns-left {
+ margin-right: 5px;
+}
+
+.fixed-table-toolbar .columns-right {
+ margin-left: 5px;
+}
+
+.fixed-table-toolbar .columns label {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 1.428571429;
+}
+
+.fixed-table-toolbar .bars,
+.fixed-table-toolbar .search,
+.fixed-table-toolbar .columns {
+ position: relative;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ line-height: 34px;
+}
+
+.fixed-table-pagination li.disabled a {
+ pointer-events: none;
+ cursor: default;
+}
+
+.fixed-table-loading {
+ display: none;
+ position: absolute;
+ top: 42px;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 99;
+ background-color: #fff;
+ text-align: center;
+}
+
+.fixed-table-body .card-view .title {
+ font-weight: bold;
+ display: inline-block;
+ min-width: 30%;
+ text-align: left !important;
+}
+
+/* support bootstrap 2 */
+.fixed-table-body thead th .th-inner {
+ box-sizing: border-box;
+}
+
+.table th, .table td {
+ vertical-align: middle;
+ box-sizing: border-box;
+}
+
+.fixed-table-toolbar .dropdown-menu {
+ text-align: left;
+ max-height: 300px;
+ overflow: auto;
+}
+
+.fixed-table-toolbar .btn-group > .btn-group {
+ display: inline-block;
+ margin-left: -1px !important;
+}
+
+.fixed-table-toolbar .btn-group > .btn-group > .btn {
+ border-radius: 0;
+}
+
+.fixed-table-toolbar .btn-group > .btn-group:first-child > .btn {
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+
+.fixed-table-toolbar .btn-group > .btn-group:last-child > .btn {
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+
+.bootstrap-table .table > thead > tr > th {
+ vertical-align: bottom;
+ border-bottom: 1px solid #ddd;
+}
+
+/* support bootstrap 3 */
+.bootstrap-table .table thead > tr > th {
+ padding: 0;
+ margin: 0;
+}
+
+.bootstrap-table .fixed-table-footer tbody > tr > td {
+ padding: 0 !important;
+}
+
+.bootstrap-table .fixed-table-footer .table {
+ border-bottom: none;
+ border-radius: 0;
+}
+
+.pull-right .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+/* calculate scrollbar width */
+p.fixed-table-scroll-inner {
+ width: 100%;
+ height: 200px;
+}
+
+div.fixed-table-scroll-outer {
+ top: 0;
+ left: 0;
+ visibility: hidden;
+ width: 200px;
+ height: 150px;
+ overflow: hidden;
+}
diff --git a/admportal/public/stylesheets/bootstrap-theme.min.css b/admportal/public/stylesheets/bootstrap-theme.min.css
new file mode 100644
index 00000000..dc95d8e4
--- /dev/null
+++ b/admportal/public/stylesheets/bootstrap-theme.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
+/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file
diff --git a/admportal/public/stylesheets/bootstrap.min.css b/admportal/public/stylesheets/bootstrap.min.css
new file mode 100644
index 00000000..4cf729e4
--- /dev/null
+++ b/admportal/public/stylesheets/bootstrap.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
+/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
diff --git a/admportal/public/stylesheets/dataTables.bootstrap.min.css b/admportal/public/stylesheets/dataTables.bootstrap.min.css
new file mode 100644
index 00000000..745f2996
--- /dev/null
+++ b/admportal/public/stylesheets/dataTables.bootstrap.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable{border-collapse:separate !important}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0}
diff --git a/admportal/public/stylesheets/jquery.treegrid.css b/admportal/public/stylesheets/jquery.treegrid.css
new file mode 100644
index 00000000..b5bf0de7
--- /dev/null
+++ b/admportal/public/stylesheets/jquery.treegrid.css
@@ -0,0 +1,6 @@
+.treegrid-indent {width:16px; height: 16px; display: inline-block; position: relative;}
+
+.treegrid-expander {width:16px; height: 16px; display: inline-block; position: relative; cursor: pointer;}
+
+.treegrid-expander-expanded{background-image: url(../img/collapse.png); }
+.treegrid-expander-collapsed{background-image: url(../img/expand.png);}
diff --git a/admportal/public/stylesheets/signin.css b/admportal/public/stylesheets/signin.css
new file mode 100644
index 00000000..995df48e
--- /dev/null
+++ b/admportal/public/stylesheets/signin.css
@@ -0,0 +1,40 @@
+body {
+ padding-top: 40px;
+ padding-bottom: 40px;
+ background-color: #eee;
+}
+
+.form-signin {
+ max-width: 330px;
+ padding: 15px;
+ margin: 0 auto;
+}
+.form-signin .form-signin-heading,
+.form-signin .checkbox {
+ margin-bottom: 10px;
+}
+.form-signin .checkbox {
+ font-weight: normal;
+}
+.form-signin .form-control {
+ position: relative;
+ height: auto;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 10px;
+ font-size: 16px;
+}
+.form-signin .form-control:focus {
+ z-index: 2;
+}
+.form-signin input[type="email"] {
+ margin-bottom: -1px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.form-signin input[type="password"] {
+ margin-bottom: 10px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
diff --git a/admportal/public/stylesheets/style.css b/admportal/public/stylesheets/style.css
new file mode 100644
index 00000000..30e047da
--- /dev/null
+++ b/admportal/public/stylesheets/style.css
@@ -0,0 +1,8 @@
+body {
+ padding: 50px;
+ font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
+}
+
+a {
+ color: #00B7FF;
+} \ No newline at end of file
diff --git a/admportal/routes/index.js b/admportal/routes/index.js
new file mode 100644
index 00000000..896c9482
--- /dev/null
+++ b/admportal/routes/index.js
@@ -0,0 +1,9 @@
+var express = require('express');
+var router = express.Router();
+
+/* GET home page. */
+router.get('/', function(req, res) {
+ res.render('index', { title: 'Express' });
+});
+
+module.exports = router;
diff --git a/admportal/routes/users.js b/admportal/routes/users.js
new file mode 100644
index 00000000..c00d7de1
--- /dev/null
+++ b/admportal/routes/users.js
@@ -0,0 +1,9 @@
+var express = require('express');
+var router = express.Router();
+
+/* GET users listing. */
+router.get('/', function(req, res) {
+ res.send('respond with a resource');
+});
+
+module.exports = router;
diff --git a/admportal/server/adminPortal.db b/admportal/server/adminPortal.db
new file mode 100644
index 00000000..18429e46
--- /dev/null
+++ b/admportal/server/adminPortal.db
Binary files differ
diff --git a/admportal/server/app.js b/admportal/server/app.js
new file mode 100644
index 00000000..33cdb64f
--- /dev/null
+++ b/admportal/server/app.js
@@ -0,0 +1,69 @@
+var express = require('express');
+var app = express();
+var path = require('path');
+var session = require('express-session');
+var cookieParser = require('cookie-parser');
+var bodyParser = require('body-parser');
+var PropertiesReader = require('properties-reader');
+var properties = PropertiesReader(process.argv[2]); //property file passed
+var morgan = require('morgan');
+var _ = require('lodash');
+//var multer = require('multer');
+//var done=false;
+
+// Check to make sure SDNC_CONFIG_DIR is set
+var sdnc_config_dir = process.env.SDNC_CONFIG_DIR;
+if ( typeof sdnc_config_dir == 'undefined' )
+{
+ console.log('ERROR the SDNC_CONFIG_DIR environmental variable is not set.');
+ return;
+}
+
+
+var moptions = { "stream":
+{
+ write: function(str)
+ {
+ if ( str.indexOf("/javascript") == -1 && str.indexOf("/stylesheets") == -1)
+ {
+ console.log(str);
+ }
+ }
+}
+};
+var accesslog = morgan( "|:method|HTTP/:http-version|:status|:url - requestIP-:remote-addr", moptions);
+
+//var favicon = require('serve-favicon');
+
+// initialize session objects
+app.use(session({
+ secret:'SDN7C',
+ resave: false,
+ saveUninitialized: false
+}));
+
+app.use(cookieParser());
+app.use(bodyParser.urlencoded({
+ extended: true
+}));
+
+app.use(accesslog); // http access log
+app.use(express.static(process.cwd() + '/public')); // static files
+
+
+//app.use('trust proxy', true);
+app.enable('trust proxy');
+
+// view engine setup
+app.set('views', path.join(__dirname, '../views'));
+app.set('view engine', 'ejs');
+
+
+var router = require('./router')(app);
+
+// Error Handling
+app.use(function(err,req,res,next) {
+ res.status(err.status || 500);
+});
+
+module.exports = app;
diff --git a/admportal/server/netdb_updater.js b/admportal/server/netdb_updater.js
new file mode 100644
index 00000000..6dde27b9
--- /dev/null
+++ b/admportal/server/netdb_updater.js
@@ -0,0 +1,749 @@
+var log4js = require('log4js');
+var http = require('http');
+var async = require('async');
+var properties = require(process.env.SDNC_CONFIG_DIR + '/netdb-updater.json');
+var admProperties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json');
+var csvtojson = require('csvtojson');
+var mysql = require('mysql');
+var moment = require('moment');
+var os = require('os');
+var fs = require('fs.extra');
+
+// Check to make sure SDNC_CONFIG_DIR is set
+var sdnc_config_dir = process.env.SDNC_CONFIG_DIR;
+if ( typeof sdnc_config_dir == 'undefined' )
+{
+ console.log('ERROR the SDNC_CONFIG_DIR environmental variable is not set.');
+ return;
+}
+
+// SETUP LOGGER
+log4js.configure(process.env.SDNC_CONFIG_DIR + '/netdb.log4js.json');
+var logger = log4js.getLogger('netdb');
+logger.setLevel(properties.netdbLogLevel);
+
+var yargs = require('yargs')
+ .usage("\nUsage: node netdb_updater -t link_master|router_master")
+ .demand('t')
+ .alias('t', 'table')
+ .example("Example: node netdb_updater -t link_master","Update SDNC LINK_MASTER table from NetDB.")
+ .argv;
+
+var dbTable = yargs.table;
+var debug = properties.netdbDebug;
+var env = properties.netdbEnv;
+var retSuccess = false;
+
+// DB Setup
+var currentDB = '';
+var dbConnection = '';
+var db01 = '';
+var db02 = '';
+var count = 0;
+var errorMsg = [];
+
+var dbtasks = [];
+dbtasks.push( function(callback) { checkParams(callback); } );
+dbtasks.push( function(callback) { dbConnect(callback); } );
+//dbtasks.push( function(callback) { netdb(callback); } );
+
+logger.debug('\n\n********** START PROCESSING - Env=' + env + ' Debug=' + debug + ' **********');
+
+async.series(dbtasks, function(err,result){
+ if(err) {
+ logger.error(err + ' COUNT: ' + count);
+ }
+ else {
+ if ( errorMsg.length > 0 ){
+ logger.error(errorMsg);
+ }
+ }
+});
+
+
+function checkParams(scb){
+ if ( dbTable != 'link_master' && dbTable != 'router_master' ){
+ scb("Invalid parameter passed in '" + dbTable + " ' exiting.'");
+ }
+ else{
+ scb(null);
+ }
+}
+
+
+async.whilst(
+ function () { return count < properties.netdbRetryInterval },
+ function (callback) {
+ if ( dbTable == 'link_master' ){
+ getLinkMaster(callback);
+ }
+ else if (dbTable == 'router_master'){
+ getRouterMaster(callback);
+ }
+ else{ // should never hit this condition
+ logger.debug("Invalid parameter passed in '" + dbTable + " ' exiting.'");
+ }
+ },
+ function (err) {
+logger.debug('whilst err function errorMsg = ' + errorMsg);
+ // report error
+ if ( errorMsg.length > 0 ){
+ logger.debug(errorMsg + ' COUNT: ' + count);
+ process.exit(1);
+ }
+ else{
+ logger.debug('success');
+ process.exit(0);
+ }
+ }
+);
+
+
+function returnError(emsg, cb){
+ retSuccess=false;
+ errorMsg.push(emsg);
+ if ( count == properties.netdbRetryInterval ) { logger.error(errorMsg); }
+ setTimeout( function(){
+ cb(null);
+ }, properties.netdbWaitTime);
+}
+
+function returnSuccess(cb){
+logger.debug('inside returnSuccess');
+ errorMsg = '';
+ //var cnt = properties.netdbRetryInterval;
+ //logger.debug('b4 inc returnSuccess count=' + count);
+ //count = ++cnt;
+ //logger.debug('after inc returnSuccess count=' + count);
+ //cb(null);
+ retSuccess=true;
+process.exit(0);
+}
+
+function getRouterMaster(cb){
+
+ logger.info('getRouterMaster debug=' + debug + ' count=' + count);
+
+ // setup connection
+ var netdbEnv = properties.netdbEnv;
+ var auth_param = '';
+ if ( netdbEnv == 'e2e' || netdbEnv == 'prod' ){
+ // conexus network
+ auth_param = '?auth=' + admProperties['ip-addresses']['eth2'] + ';'
+ }else{
+ // app network
+ auth_param = '?auth=' + admProperties['ip-addresses']['eth1:0'] + ';'
+ }
+ var username = properties.netdbUser;;
+ var password = properties.netdbPassword;
+ var date = moment().format('YYYYMMDD');
+ var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
+ var host = properties.netdbHost;
+ var port = properties.netdbPort;
+ var path = '/' + properties.netdbPath
+ + '/' + properties.netdbNetwork
+ + '/' + properties.netdbApiName
+ + auth_param
+ + 'client=' + properties.netdbClientName + ';'
+ + 'date=' + date + ';'
+ + 'reportName=' + dbTable + ';'
+ + 'type=' + properties.netdbType;
+
+ var header = { 'Content-Type': 'text/csv' };
+ //var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'text/csv' };
+ var options = {
+ method : "GET",
+ path : path,
+ host : host,
+ port : port,
+ headers : header
+ };
+
+ logger.debug('options:\n' + JSON.stringify(options,null,2));
+
+ var request = http.request(options, function(response) {
+
+ var response_str = '';
+ if ( retSuccess == true ){
+ var cnt = properties.netdbRetryInterval;
+ count = ++cnt;
+ }
+ else{
+ count++;
+ }
+
+ logger.debug('STATUS: ' + response.statusCode + ' content-type=' + response.headers['content-type']);
+
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+ response.on('end', function() {
+
+ logger.debug('HEADERS:' + JSON.stringify(response.headers));
+
+ if(response.statusCode == 200){
+
+ if(response_str.length > 0){
+
+ // save the upload
+ try{
+ fs.writeFileSync('/sdncvar/sdnc/files/netdb-updater/' + moment().unix() + ".netdb." + dbTable + '.csv', response_str);
+ }
+ catch(e){
+ // this is not in reqs, if it fails keep on going.
+ logger.error('Error writing NetDB file:' + e);
+ }
+
+ if (response.headers['content-type'].indexOf('html') > 0){
+ returnError('Error:Unexpected content-type:' + response.headers['content-type'] + ' returned.\n', cb);
+ return;
+ }
+ // need to parse csv file
+ var Converter=csvtojson.Converter;
+ var csvConverter = new Converter({
+ noheader:true
+ });
+ var routerMasterSQL = '';
+
+ // end_parsed will be emitted once parsing is finished
+ csvConverter.on("end_parsed", function(respObj){
+
+ routerMasterSQL = routerMasterSQL.concat("INSERT INTO ROUTER_MASTER (crs_name, loopback_ip)");
+ for ( var x=0; x < respObj.length; x++ ){
+
+ if ( respObj[x].field1.length == 0 ){
+ returnError('Required field [crs_name] is null.', cb);
+ }
+
+ if (x!=0){
+ routerMasterSQL = routerMasterSQL.concat(' union ');
+ }
+ routerMasterSQL = routerMasterSQL.concat(" SELECT "
+ + "'" + respObj[x].field1 + "',"
+ + "'" + respObj[x].field2 + "' FROM DUAL ");
+ }
+ //logger.debug('SQL: ' + routerMasterSQL);
+
+ if (debug != 'debug' && env != 'dev'){
+
+ var tasks = [];
+ tasks.push( function(callback) { updateRouterMaster(routerMasterSQL,callback); } );
+ async.series(tasks, function(err,result){
+ if(err) {
+ returnError(err,cb);
+ return;
+ }
+ else {
+ logger.info('*** Router Master Table Replaced ***');
+ returnSuccess(cb);
+ return;
+ }
+ });
+ }
+ else{
+logger.debug('*** debug ***');
+ returnSuccess(cb);
+ return;
+ }
+
+ });
+ csvConverter.on("error",function(errMsg,errData){
+ returnError(errMsg,cb);
+ return;
+ });
+ csvConverter.fromString(response_str, function(err,result){
+ if(err){
+ returnError(err,cb);
+ return;
+ }
+ });
+ }
+ else{
+ //logger.debug("no data");
+ returnError('no data',cb);
+ return;
+ }
+ }
+ else if(response.statusCode == 404){
+ returnError('Router Master Table for ' + date + ' is not Available.',cb);
+ return;
+ }
+ else {
+ returnError('Status Code:' + response.statudCode + ' returned for Router Master Table query.',cb);
+ return;
+ }
+ });
+ });
+ request.on('error', function(e) {
+ if ( retSuccess == true ){
+ var cnt = properties.netdbRetryInterval;
+ count = ++cnt;
+ }
+ else{
+ count++;
+ }
+ returnError(e,cb);
+ return;
+ });
+ request.end();
+}
+
+function getLinkMaster(cb){
+
+ logger.info('getLinkMaster debug=' + debug + ' count=' + count);
+
+ // setup connection
+ var netdbEnv = properties.netdbEnv;
+ var auth_param = '';
+ if ( netdbEnv == 'e2e' || netdbEnv == 'prod' ){
+ // conexus network
+ auth_param = '?auth=' + admProperties['ip-addresses']['eth2'] + ';'
+ }else{
+ // app network
+ auth_param = '?auth=' + admProperties['ip-addresses']['eth1:0'] + ';'
+ }
+ var username = properties.netdbUser;;
+ var password = properties.netdbPassword;
+ var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
+ var host = properties.netdbHost;
+ var port = properties.netdbPort;
+ var date = moment().format('YYYYMMDD');
+ var path = '/' + properties.netdbPath
+ + '/' + properties.netdbNetwork
+ + '/' + properties.netdbApiName
+ + auth_param
+ + 'client=' + properties.netdbClientName + ';'
+ + 'date=' + date + ';'
+ + 'reportName=' + dbTable + ';'
+ + 'type=' + properties.netdbType;
+
+ var header = { 'Content-Type': 'text/csv' };
+ //var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'text/csv' };
+ var options = {
+ method : "GET",
+ path : path,
+ host : host,
+ port : port,
+ headers : header
+ };
+
+ logger.debug('options:\n' + JSON.stringify(options,null,2));
+
+ var request = http.request(options, function(response) {
+
+ logger.debug('STATUS: ' + response.statusCode + ' content-type=' + response.headers['content-type']);
+
+ if ( retSuccess == true ){
+ var cnt = properties.netdbRetryInterval;
+ count = ++cnt;
+ }
+ else{
+ count++
+ }
+
+ var response_str = '';
+
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+ response.on('end', function() {
+
+ logger.debug('HEADERS:' + JSON.stringify(response.headers));
+
+ if(response.statusCode == 200){
+
+ if(response_str.length > 0){
+
+ //logger.debug('response_str=' + response_str);
+ // save the upload
+ try{
+ fs.writeFileSync('/sdncvar/sdnc/files/netdb-updater/' + moment().unix() + ".netdb." + dbTable + '.csv', response_str);
+ }
+ catch(e){
+ // this is not in reqs, if it fails keep on going.
+ logger.error('Error writing NetDB file:' + e);
+ }
+
+ if (response.headers['content-type'].indexOf('html') > 0){
+ returnError('Error:Unexpected content-type:' + response.headers['content-type'] + ' returned.\n', cb);
+ return;
+ }
+ // need to parse csv file
+ var Converter=csvtojson.Converter;
+ var csvConverter = new Converter({
+ noheader:true
+ });
+
+ var linkMasterSQL = '';
+
+ // end_parsed will be emitted once parsing is finished
+ csvConverter.on("end_parsed", function(jsonObj){
+
+ linkMasterSQL = linkMasterSQL.concat("INSERT INTO LINK_MASTER (link_interface_ip, source_crs_name, destination_crs_name, link_speed, default_cost, bundle_name, shutdown)");
+ for ( var x=0; x < jsonObj.length; x++ ){
+ if ( jsonObj[x].field1.length == 0 ){
+ returnError('Required field [link_interface_ip] is null.', cb);
+ return;
+ }
+ if ( jsonObj[x].field2.length == 0 ){
+ returnError('Required field [source_crs_name] is null.', cb);
+ return;
+ }
+ if ( jsonObj[x].field3.length == 0 ){
+ returnError('Required field [destination_crs_name] is null.', cb);
+ return;
+ }
+ if (x!=0){
+ linkMasterSQL = linkMasterSQL.concat(' union ');
+ }
+
+ linkMasterSQL = linkMasterSQL.concat(" SELECT "
+ + "'" + jsonObj[x].field1 + "',"
+ + "'" + jsonObj[x].field2 + "',"
+ + "'" + jsonObj[x].field3 + "',"
+ + jsonObj[x].field4 + ","
+ + jsonObj[x].field5 + ","
+ + "'" + jsonObj[x].field6 + "',"
+ + "'" + jsonObj[x].field7 + "' FROM DUAL");
+ }
+ //logger.debug('SQL: ' + linkMasterSQL);
+
+ if (debug != 'debug' && env != 'dev'){
+ // update db
+ var tasks = [];
+ tasks.push( function(callback) { updateLinkMaster(linkMasterSQL,callback); } );
+ async.series(tasks, function(err,result){
+ if(err)
+ {
+ returnError(err,cb);
+ return;
+ }
+ else
+ {
+ logger.info('*** Link Master Table Replaced ***');
+ returnSuccess(cb);
+ return;
+ }
+ });
+ }
+ else{
+ returnSuccess(cb);
+ return;
+ }
+ });
+ csvConverter.on("error",function(errMsg,errData){
+ returnError(errMsg,cb);
+ return;
+ });
+ csvConverter.fromString(response_str, function(err,result){
+ if(err){
+ returnError(errMsg,cb);
+ return;
+ }
+ });
+ }
+ else{
+ returnError('no data',cb);
+ return;
+ }
+ }
+ else if(response.statusCode == 404){
+ returnError('Link Master Table for ' + date + ' is not Available.',cb);
+ return;
+ }
+ else {
+ returnError('Status Code:' + response.statudCode + ' returned for Link Master Table query.',cb);
+ return;
+ }
+ });
+ });
+ request.on('error', function(e) {
+ if ( retSuccess == true ){
+ var cnt = properties.netdbRetryInterval;
+ count = ++cnt;
+ }
+ else{
+ count++
+ }
+ returnError(e,cb);
+ return;
+ });
+ request.end();
+}
+
+
+function dbConnect(callback){
+
+ var l_db01 = admProperties['databases']['0'];
+ var db01Array = l_db01.split("|");
+ db01 = db01Array[0];
+
+ var l_db02 = admProperties['databases']['1'];
+ var db02Array = l_db02.split("|");
+ db02 = db02Array[0];
+
+ if ( admProperties.dbFabric == 'true' )
+ {
+ logger.debug('connectFabric()');
+
+ // testing
+ var fabric_connection = mysql.createConnection({
+ host : admProperties.dbFabricServer,
+ user : admProperties.dbFabricUser,
+ password : admProperties.dbFabricPassword,
+ database : admProperties.dbFabricDB,
+ port : admProperties.dbFabricPort
+ });
+
+
+ fabric_connection.connect( function(err) {
+
+ if (err) {
+ callback(err);
+ return;
+ }
+ fabric_connection.query('CALL dump.servers()', function(err,rows) {
+
+ var masterDB = '';
+
+ if (err) {
+ callback(err);
+ return;
+ }
+ fabric_connection.end();
+ logger.debug('rows: ' + JSON.stringify(rows,null,2));
+
+ // fabric servers
+ for ( var x=0; x<rows.length; x++)
+ {
+ // database servers
+ for ( var y=0; y<rows[x].length; y++)
+ {
+ var row = rows[x][y];
+ if (row.group_id == admProperties.dbFabricGroupId)
+ {
+ if (row.status == '3' && row.mode == '3'){
+ masterDB = row.host;
+ }
+ }
+ }
+ }
+ logger.debug('currentDB: ' + currentDB);
+ logger.debug('masterDB: ' + masterDB);
+
+ if (masterDB.length <=0)
+ {
+ logger.debug('no writable master db');
+ callback('no writable master db');
+ return;
+ }
+
+ if ( currentDB != masterDB )
+ {
+ currentDB = masterDB;
+ dbConnection = mysql.createConnection({
+ connectionLimit : admProperties.dbConnLimit,
+ host : currentDB,
+ user : admProperties.dbUser,
+ password : admProperties.dbPassword,
+ database : admProperties.dbName,
+ multipleStatements: true,
+ debug : false
+ });
+ }
+ logger.debug('new currentDB: ' + currentDB);
+ logger.debug('new masterDB: ' + masterDB);
+ callback(null);
+ return;
+ });
+ fabric_connection.on('error', function(err){
+ logger.debug(err.code);
+ callback(err);
+ return;
+ });
+ });
+ }
+ else
+ {
+ currentDB = db01;
+
+ var dbConn = mysql.createConnection({
+ connectionLimit : admProperties.dbConnLimit,
+ host : currentDB,
+ user : admProperties.dbUser,
+ password : admProperties.dbPassword,
+ database : admProperties.dbName,
+ multipleStatements: true,
+ debug : false
+ });
+ logger.debug('initDB currentDB=' + currentDB);
+
+ dbConn.connect(function(err,connection){
+
+ if(err){
+ logger.debug( String(err) ); // ALARM
+ callback(err);
+ return;
+ }
+ var sql = 'select @@read_only';
+ dbConn.query(sql, function(err,result){
+ dbConn.end();
+
+ // @@read_only=0 means db is writable
+ logger.debug('@@read_only=' + result[0]['@@read_only']);
+ if ( result[0]['@@read_only'] != '0' )
+ {
+ if (currentDB == db01)
+ {
+ currentDB = db02;
+ }
+ else
+ {
+ currentDB = db01;
+ }
+logger.debug('initDB reconnect to currentDB '+ currentDB);
+ var newConnection = mysql.createConnection({
+ connectionLimit : admProperties.dbConnLimit,
+ host : currentDB,
+ user : admProperties.dbUser,
+ password : admProperties.dbPassword,
+ database : admProperties.dbName,
+ multipleStatements: true,
+ debug : false
+ }); // end create
+ dbConnection = newConnection;
+ callback(null);
+ return;
+ }
+ dbConnection = dbConn;
+ callback(null);
+ return;
+ });
+ });
+ }
+}
+
+function updateLinkMaster(linkMasterSQL,callback){
+
+logger.debug('updateLinkMaster');
+
+ dbConnection.connect(function(err,connection)
+ {
+ if(err){
+ logger.debug( String(err) ); // ALARM
+ callback(err, 'Unable to get database connection.');
+ return;
+ }
+ }); // end connection
+ dbConnection.beginTransaction(function(err) {
+ if(err){
+ //dbConnection.release();
+ callback(err,String(err));
+ return;
+ }
+ var sql = "DELETE FROM LINK_MASTER";
+ dbConnection.query(sql,function(err,result)
+ {
+ if(err){
+ //dbConnection.release();
+ dbConnection.rollback( {rollback: 'NO RELEASE'},function(){
+ callback(err,String(err));
+ return;
+ });
+ }
+ dbConnection.query(linkMasterSQL,function(err,result)
+ {
+ if(err){
+ //dbConnection.release();
+ dbConnection.rollback( {rollback: 'NO RELEASE'},function(){
+ callback(err,String(err));
+ return;
+ });
+ }
+ dbConnection.commit(function(err){
+ if(err){
+ //dbConnection.release();
+ dbConnection.rollback( {rollback: 'NO RELEASE'},function(){
+ callback(err,String(err));
+ return;
+ });
+ }
+ //dbConnection.release();
+ callback(null);
+ });
+ })
+ });
+ }); // end transaction
+}
+
+function updateRouterMaster(routerMasterSQL,callback){
+
+logger.debug('updateRouterMaster');
+
+ dbConnection.connect(function(err,connection)
+ {
+ if(err){
+ logger.debug( String(err) ); // ALARM
+ callback(err, 'Unable to get database connection.');
+ return;
+ }
+ }); // end connection
+ dbConnection.beginTransaction(function(err) {
+ if(err){
+ //dbConnection.release();
+ callback(err,String(err));
+ return;
+ }
+ var sql = "DELETE FROM ROUTER_MASTER";
+ dbConnection.query(sql,function(err,result)
+ {
+ if(err){
+ //dbConnection.release();
+ dbConnection.rollback( function(){
+ callback(err,String(err));
+ return;
+ });
+ }
+ dbConnection.query(routerMasterSQL,function(err,result)
+ {
+ if(err){
+ //dbConnection.release();
+ dbConnection.rollback( function(){
+ callback(err,String(err));
+ return;
+ });
+ }
+ dbConnection.commit(function(err){
+ if(err){
+ //dbConnection.release();
+ dbConnection.rollback( function(){
+ callback(err,String(err));
+ return;
+ });
+ }
+ //dbConnection.release();
+ callback(null);
+ });
+ })
+ });
+ }); // end transaction
+}
+
+/*
+
+ logger.debug('getLinkMaster - count=' + count);
+ if ( true ) {
+ //fail
+ setTimeout( function(){
+ cb(null);}, properties.netdbWaitTime);
+ return;
+ }
+ // success
+ count = 10;
+ cb(null);
+}
+*/
diff --git a/admportal/server/npm-debug.log b/admportal/server/npm-debug.log
new file mode 100644
index 00000000..40e151a2
--- /dev/null
+++ b/admportal/server/npm-debug.log
@@ -0,0 +1,18 @@
+0 info it worked if it ends with ok
+1 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'start' ]
+2 info using npm@1.4.28
+3 info using node@v0.10.35
+4 verbose node symlink /usr/bin/node
+5 error Error: ENOENT, open '/home/users/ar3165/projects/admin-portal2/server/package.json'
+6 error If you need help, you may report this *entire* log,
+6 error including the npm and node versions, at:
+6 error <http://github.com/npm/npm/issues>
+7 error System Linux 3.13.0-40-generic
+8 error command "/usr/bin/node" "/usr/bin/npm" "start"
+9 error cwd /home/users/ar3165/projects/admin-portal2/server
+10 error node -v v0.10.35
+11 error npm -v 1.4.28
+12 error path /home/users/ar3165/projects/admin-portal2/server/package.json
+13 error code ENOENT
+14 error errno 34
+15 verbose exit [ 34, true ]
diff --git a/admportal/server/router/index.js b/admportal/server/router/index.js
new file mode 100644
index 00000000..76cd6115
--- /dev/null
+++ b/admportal/server/router/index.js
@@ -0,0 +1,18 @@
+console.log("index.js");
+
+module.exports = function(app) {
+
+//console.log ( 'index port ' + server.address().port );
+
+ app.use('/', require('./routes/root'));
+ //app.use('/login', require('./routes/login'));
+ app.use('/odl', require('./routes/odl'));
+ app.use('/sla', require('./routes/sla'));
+ app.use('/user', require('./routes/user'));
+ app.use('/gamma', require('./routes/gamma'));
+ app.use('/mobility', require('./routes/mobility'));
+ app.use('/admin', require('./routes/admin'));
+ app.use('/preload', require('./routes/preload'));
+ //app.use('/svc-topology-operation', require('./routes/odl'));
+ //app.use('/wklist-delete', require('./routes/odl'));
+};
diff --git a/admportal/server/router/routes/Odl.js b/admportal/server/router/routes/Odl.js
new file mode 100755
index 00000000..a27d73b3
--- /dev/null
+++ b/admportal/server/router/routes/Odl.js
@@ -0,0 +1,594 @@
+// Odl.js
+var https = require('https');
+var http = require('http');
+var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json');
+
+
+var Odl = function() {
+ // Call ODL page
+ // get(uri,res)
+ // post(uri,data, res)
+
+ var _healthcheck = function(options, callback)
+ {
+ // Setup request to ODL side
+ console.log('options:' + JSON.stringify(options,null,2));
+ var request = https.request(options, function(response) {
+
+ var response_str = '';
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+ response.on('end', function()
+ {
+ //logger.debug(response_str);
+ if(response.statusCode == 200)
+ {
+ console.log('200 OK');
+ callback(null, response_str);
+ return;
+ }
+ else{
+ console.log('not ok status=' + response.statusCode);
+ callback(response_str, 'statusCode=' + response.statusCode + '\n' + response_str);
+ return;
+ }
+ });
+ });
+ request.end()
+
+ request.on('error', function(err) {
+ console.error('err:' + err);
+ callback(err, err);
+ return;
+ });
+ }
+
+ var _get = function(uri,options,callback,req,res)
+ {
+
+ options.method = "GET";
+ options.path = uri;
+
+ // Setup request to ODL side
+ console.log('options:' + JSON.stringify(options,null,2));
+ var request = https.request(options, function(response) {
+ // console.dir(response);
+ console.log('STATUS: ' + response.statusCode);
+ var response_str = '';
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+ response.on('end', function()
+ {
+ console.log(response_str);
+
+ if(response.statusCode == 200)
+ {
+ // make sure response starts with JSON string
+ if (response_str && response_str.indexOf('{') == 0) {
+ //console.log("response: ", result);
+
+ req.session.l3sdnPageInfo = undefined;
+ var x=0;
+ var pageList = [];
+ var obj_rows = [];
+ var rows = [];
+ var robj = JSON.parse(response_str);
+
+ if ( typeof robj['services']['layer3-service-list'] != 'undefined' )
+ {
+ for( var i=0; i<robj['services']['layer3-service-list'].length; i++)
+ {
+ obj_rows.push( robj['services']['layer3-service-list'][i] );
+ }
+ }
+ else
+ {
+ res.render('pages/err', {result:{code:'failure', msg:'no data Error: ' + String(err)}, header:process.env.MAIN_MENU});
+ callback(null,response_str,res);
+ return;
+ }
+
+ var rows = [];
+ var l3sdnPageInfo =
+ {
+ 'totalRows' : obj_rows.length,
+ 'pageSize' : 18,
+ 'pageCount' : parseInt(obj_rows.length/18),
+ 'currentPage' : 1
+ }
+
+ while (obj_rows.length > 0){
+ pageList.push(obj_rows.splice(0,l3sdnPageInfo.pageSize));
+ }
+ l3sdnPageInfo.rows = pageList[0]; // first page
+ l3sdnPageInfo.pages = pageList; // all pages
+
+
+ req.session.l3sdnPageInfo = l3sdnPageInfo;
+ var privObj = req.session.loggedInAdmin;
+
+ res.render('odl/listWklst',
+ {
+ pageInfo : l3sdnPageInfo,
+ result : {code:'', msg:''},
+ privilege : privObj, header:process.env.MAIN_MENU
+ });
+
+
+ } else {
+ res.render('pages/err', {result:{code:'failure', msg:'no data Error: ' + String(err)}, header:process.env.MAIN_MENU});
+ }
+ callback(null, response_str, res);
+ }
+ else
+ {
+ callback(response_str,response_str,res);
+ //res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist. ' + response_str}});
+ }
+ });
+ });
+
+ request.end()
+
+ request.on('error', function(err) {
+ callback(err,null, res);
+ });
+ }
+
+ var _getid = function(uri,options,res) {
+ options.method = "GET";
+ options.path = uri;
+
+ // Setup request to ODL side
+ var request = https.request(options, function(response) {
+ // console.dir(response);
+ //console.log('STATUS: ' + response.statusCode);
+ var response_str = '';
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+ response.on('end', function() {
+ if(response.statusCode == 200){
+ if(response_str){
+ //console.log("response: ", response_str);
+ res.render('odl/view', {response_obj: JSON.parse(response_str), header:process.env.MAIN_MENU});
+ }
+ else{
+ //console.log("no data");
+ res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist'}, header:process.env.MAIN_MENU});
+ }
+ }
+ else {
+ //console.log("bad status code:", response.statusCode);
+ res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist. Status Code:' + response.statusCode}, header:process.env.MAIN_MENU});
+ }
+ });
+ });
+
+ request.end()
+
+ request.on('error', function(err) {
+ //console.log(err);
+ res.render('pages/err', {result:{code:'failure', msg:'Failed to get worklist item. ' + String(err)}, header:process.env.MAIN_MENU});
+ });
+ }
+
+ var _getvrlan = function(uri,options,callback) {
+ options.method = "GET";
+ options.path = uri;
+
+
+ //callback(null,'');
+ // Setup request to ODL side
+ var request = https.request(options, function(response) {
+ // console.dir(response);
+ //console.log('STATUS: ' + response.statusCode);
+ var response_str = '';
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+
+ response.on('end', function() {
+ if(response.statusCode == 200){
+ if(response_str){
+ callback(null,response_str);
+ return;
+ }
+ else{
+ callback('err','no data');
+ return;
+ }
+ }
+ else {
+ callback('error',response.statusCode);
+ return;
+ }
+ });
+ });
+
+ request.end()
+
+ request.on('error', function(err) {
+ callback(err,String(err));
+ return;
+ });
+ }
+
+
+ var _getvnf = function(uri,options,req,res) {
+ options.method = "GET";
+ options.path = uri;
+
+ // Setup request to ODL side
+ var request = https.request(options, function(response) {
+ // console.dir(response);
+ //console.log('STATUS: ' + response.statusCode);
+ var response_str = '';
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+ response.on('end', function() {
+ if(response.statusCode == 200){
+ if(response_str){
+ //console.log("response: ", response_str);
+ res.render('odl/viewvnf', { vnf_obj: JSON.parse(response_str),
+ request_id: req.query['request'], header:process.env.MAIN_MENU });
+ }
+ else{
+ //console.log("no data");
+ res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist item.'}, header:process.env.MAIN_MENU});
+ }
+ }
+ else {
+ //console.log("bad status code:", response.statusCode);
+ res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist. Status Code:' + response.statusCode}, header:process.env.MAIN_MENU});
+ }
+ });
+ });
+
+ request.end()
+
+ request.on('error', function(err) {
+ //console.log(err);
+ res.render('pages/err', {result:{code:'failure', msg:'Failed getting VNF information. Error: '+ String(err)}, header:process.env.MAIN_MENU});
+ });
+ }
+
+ var _getPreloadVnfData = function(uri,options,res,callback) {
+
+ options.method = "GET";
+ options.path = uri;
+
+
+ // Setup request to ODL side
+ var protocol;
+ if ( process.env.NODE_ENV != 'production' ){
+ protocol = http;
+ }else{
+ protocol = https;
+ }
+
+console.log('NODE_ENV:' + process.env.NODE_ENV);
+console.log('GET: ' + JSON.stringify(options,null,4));
+
+ var request = protocol.request(options, function(response) {
+
+ var response_str = '';
+
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+ response.on('end', function() {
+console.log('response_str: ' + response_str);
+console.log('response.statusCode: ' + response.statusCode);
+ if(response.statusCode == 200){
+ if(response_str){
+ callback(null,response_str);
+ return;
+ }
+ else{
+ callback('Error - No data returned.');
+ return;
+ }
+ }
+ else {
+ if ( response.statusCode == 404 )
+ {
+ callback('HTTP Status Code:' + response.statusCode + '. Not Found.');
+ return;
+ }
+ else if ( response_str.length > 0 )
+ {
+ callback('HTTP Status Code:' + response.statusCode + '. ' + response_str);
+ return;
+ }
+ else
+ {
+ callback('HTTP Status Code:' + response.statusCode + '. No data returned.');
+ return;
+ }
+ }
+ });
+ });
+
+ request.end()
+
+ request.on('error', function(err) {
+ callback(err);
+ return;
+ });
+ }
+
+var _getClusterStatus = function(options,callback) {
+ //options.method = "GET";
+ //options.path = uri;
+
+ console.log('URI='+options.path);
+
+ // Setup request to ODL side
+ var protocol = properties.odlProtocol;
+console.log('protocol=' + protocol);
+ if ( protocol == 'http' || protocol == 'HTTP' )
+ {
+console.log('http request');
+ var request = http.request(options, function(response) {
+ var response_str = '';
+
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+
+ response.on('end', function() {
+console.log('HTTP StatusCode='+response.statusCode);
+ if(response.statusCode == 200){
+ if(response_str){
+console.log('response_str='+response_str);
+ callback(null,JSON.parse(response_str));
+ return;
+ }
+ else{
+ callback(null,'no data');
+ return;
+ }
+ }
+ else {
+ callback(null,response.statusCode);
+ return;
+ }
+ });
+ });
+
+ request.end()
+
+ request.on('error', function(err) {
+ callback(null,String(err));
+ return;
+ });
+ }
+ else {
+ var request = https.request(options, function(response) {
+ var response_str = '';
+
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+
+ response.on('end', function() {
+ if(response.statusCode == 200){
+ if(response_str){
+console.log('response_str='+response_str);
+ callback(null,JSON.parse(response_str));
+ return;
+ }
+ else{
+ callback(null,'no data');
+ return;
+ }
+ }
+ else {
+ callback(null,response.statusCode);
+ return;
+ }
+ });
+ });
+
+ request.end()
+
+ request.on('error', function(err) {
+ callback(null,String(err));
+ return;
+ });
+ }
+}
+
+ var _delete = function(uri,options,res,callback) {
+ options.method = 'DELETE';
+ options.path = uri;
+
+
+ // Setup request to ODL side
+ //var request = https.request(options, function(response) {
+ var request = http.request(options, function(response) {
+ //console.log('STATUS: ' + response.statusCode);
+ var response_str = '';
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+ response.on('end', function() {
+ if(response.statusCode == 200){
+ callback(null);
+ return;
+ }
+ else {
+ callback('Error:' + response_str);
+ return;
+ }
+ });
+ });
+ request.on('error', function(err) {
+ callback(err);
+ return;
+ });
+ request.end()
+ }
+
+ var _post = function(uri,options,data,res,callback)
+ {
+ options.method = 'POST';
+ options.path = uri;
+
+
+ // Setup request to ODL side
+ var protocol;
+ //if ( process.env.NODE_ENV != 'production' ){
+ protocol = http;
+ //}else{
+ //protocol = https;
+ //}
+ var request = protocol.request(options, function(response)
+ {
+ var response_str = '';
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ //logger.debug('chunk:' + chunk);
+ });
+
+ // end of request, check response
+ response.on('end', function() {
+ console.log('post status code:'+response.statusCode);
+ if(response.statusCode == 200 ){
+ try {
+ var respObj = JSON.parse(response_str);
+ console.log('response_str.length:' + response_str.length);
+ if(response_str){
+ console.log("post response-code:" + respObj['output']['response-code']);
+
+ if ( respObj['output']['response-code'] == 200 ){
+ callback(null,response_str);
+ return;
+ }else{
+ callback('Error - response-code:' + respObj['output']['response-code'] + ' response-message:' + respObj['output']['response-message']);
+ return;
+ }
+ }else{
+ // success
+ callback(null);
+ return;
+ }
+ }
+ catch (error) {
+ callback('Error parsing response: ' + error);
+ return;
+ }
+ }
+ else {
+ var respObj = null;
+ if ( response_str.length > 0 ) {
+ console.log('response_str:' + response_str);
+ try {
+ respObj = JSON.parse(response_str);
+ if ( typeof respObj['errors'] != 'undefined' )
+ {
+ console.log('Error' + JSON.stringify(respObj));
+ if ( typeof respObj['errors']['error'][0]['error-message'] != 'undefined' )
+ {
+ callback('HTTP Status Code:' + response.statusCode + '. Message:'
+ + respObj['errors']['error'][0]['error-message']);
+ return;
+ }
+ else
+ {
+ callback('Error - HTTP Status Code:' + response.statusCode + '.');
+ return;
+ }
+ }
+ else
+ {
+ callback('Error - HTTP Status Code:' + response.statusCode + '.');
+ return;
+ }
+ }
+ catch (error) {
+ callback('Error - HTTP Status Code:' + response.statusCode + '.');
+ return;
+ }
+ }
+ else{
+ callback('Error - HTTP Status Code:' + response.statusCode + '.');
+ return;
+ }
+ }
+ });
+ });
+
+ request.on('error', function(err) {
+ callback(err);
+ return;
+ });
+
+ request.write(data);
+ request.end()
+ }
+
+ var _postSubnetAllocated = function(uri,options,data,callback,res) {
+ options.method = 'POST';
+ options.path = uri;
+
+ // Setup request to ODL side
+ var request = https.request(options, function(response) {
+ var response_str = '';
+ // Read the response from ODL side
+ response.on('data', function(chunk) {
+ response_str += chunk;
+ });
+
+ // end of request, check response
+ response.on('end', function() {
+ //console.log("post: response: " + response_str);
+ callback(response_str,null,res);
+ });
+ });
+ request.on('error', function(err) {
+ callback(err,null, res);
+ });
+ request.write(data);
+ request.end()
+ }
+
+ return {
+ GetClusterStatus: _getClusterStatus,
+ Get: _get,
+ GetID: _getid,
+ GetVNF: _getvnf,
+ GetVRlan: _getvrlan,
+ GetPreloadVnfData: _getPreloadVnfData,
+ Post: _post,
+ PostSubnetAllocated: _postSubnetAllocated,
+ Delete: _delete,
+ Healthcheck: _healthcheck
+ };
+}();
+
+module.exports = Odl;
+
diff --git a/admportal/server/router/routes/admin.js b/admportal/server/router/routes/admin.js
new file mode 100755
index 00000000..4b7b8088
--- /dev/null
+++ b/admportal/server/router/routes/admin.js
@@ -0,0 +1,83 @@
+var express = require('express');
+var router = express.Router();
+var exec = require('child_process').exec;
+var util = require('util');
+var fs = require('fs');
+var dbRoutes = require('./dbRoutes');
+var csp = require('./csp');
+var bodyParser = require('body-parser');
+var sax = require('sax'),strict=true,parser = sax.parser(strict);
+var async = require('async');
+
+
+// GET
+router.get('/getParameters', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getParameters(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/deleteParameter', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push(function(callback) {
+ dbRoutes.deleteParameter(req,res,callback);
+ });
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getParameters(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from PARAMETERS table.');
+ dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+// POST
+router.post('/addParameter', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.addParameter(req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getParameters(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated PARAMETERS.');
+ dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// gamma - updateAicSite
+router.post('/updateParameter', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.updateParameter(req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated PARAMETERS.');
+ dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+module.exports = router;
diff --git a/admportal/server/router/routes/csp.js b/admportal/server/router/routes/csp.js
new file mode 100644
index 00000000..435aaf91
--- /dev/null
+++ b/admportal/server/router/routes/csp.js
@@ -0,0 +1,84 @@
+var exec = require('child_process').exec;
+var dbRoutes = require('./dbRoutes');
+var fs = require('fs.extra');
+var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json');
+
+var retURL = "";
+var noCookieUrl = "";
+var logoutUrl = "";
+
+function logout(req,res){
+ console.log("logout");
+ req.session.loggedInAdmin = undefined;
+ res.redirect('/login');
+}
+
+function login (req,res) {
+
+ var loggedInAdmin={};
+ var email = req.body.email;
+ dbRoutes.findAdminUser(email,res,function(adminUser){
+ if(adminUser !== null){
+
+ // make sure correct password is provided
+ if (req.body.password != adminUser.password) {
+ res.render("pages/login",
+ {
+ result:
+ {
+ code:'error',
+ msg:'Invalid password entered.'
+ },
+ header:process.env.MAIN_MENU
+ });
+ return;
+ }
+
+ var loggedInAdmin = {
+ email:adminUser.email,
+ password:adminUser.password,
+ privilege:adminUser.privilege
+ }
+ req.session.loggedInAdmin = loggedInAdmin;
+ console.log("Login Success"+JSON.stringify(loggedInAdmin));
+ res.redirect('sla/listSLA');
+ }else{
+ res.render("pages/err",
+ {
+ result:
+ {
+ code:'error',
+ msg:'User ' + attuid + ' is not in the database. Please see an adminstrator to have them added.'
+ },
+ header:process.env.MAIN_MENU
+ });
+ }
+ });
+}
+
+function checkAuth(req,res,next){
+ var host = req.get('host');
+ var url = req.url;
+ var originalUrl = req.originalUrl;
+
+ console.log("checkAuth");
+
+ var host = req.headers['host'];
+console.log('host=' + host);
+
+ console.log("cookie is not null "+JSON.stringify(req.session.loggedInAdmin));
+ if(req.session == null || req.session == undefined
+ || req.session.loggedInAdmin == null || req.session.loggedInAdmin == undefined)
+ {
+ // nothing else to do but log them back in, or they may
+ // be coming from the graph tool
+ console.log("loggedInAdmin not found.session timed out.");
+ res.render('pages/login');
+ return false;
+ }
+ next();
+}
+
+exports.login = login;
+exports.logout = logout;
+exports.checkAuth = checkAuth;
diff --git a/admportal/server/router/routes/dbRoutes.js b/admportal/server/router/routes/dbRoutes.js
new file mode 100644
index 00000000..d2f40b52
--- /dev/null
+++ b/admportal/server/router/routes/dbRoutes.js
@@ -0,0 +1,1192 @@
+var express = require('express'),
+ app = express();
+var mysql = require('mysql');
+var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json');
+var fs = require('fs.extra');
+var util = require('util');
+var os = require('os');
+var async = require('async');
+var l_ = require('lodash');
+var dns = require('dns');
+var dnsSync = require('dns-sync');
+
+var pool = '';
+var currentDB = '';
+var currentDbName = '';
+var fabricDB = properties.dbFabricServer;
+var dbArray = properties.databases;
+var enckey = properties.passwordKey;
+
+console.log('dbFabric=' + properties.dbFabric);
+
+if ( properties.dbFabric == 'true' )
+{
+ connectFabric();
+}
+else
+{
+ initDB();
+}
+
+
+exports.dbConnect = function(){
+
+ console.log('fabric=' + fabricDB);
+ if ( properties.dbFabric == 'true' )
+ {
+ connectFabric();
+ }
+ else
+ {
+ initDB();
+ }
+}
+
+function setCurrentDbName(){
+
+ function createFunction(dbentry)
+ {
+ return function(callback) { findCurrentDbIP(dbentry,callback); }
+ }
+
+ var tasks = [];
+ for (var x=0; x<dbArray.length; x++){
+ var dbElement = dbArray[x];
+ var dbElementArray = dbElement.split("|");
+
+ tasks.push( createFunction(dbElement) );
+ }
+ async.series(tasks, function(err,result){
+
+ if(err){
+ currentDbName = err;
+ console.log('currentDbName: ' + err);
+ return;
+ }
+ else {
+ console.log('not found');
+ return;
+ }
+ });
+}
+
+
+function findCurrentDbIP(dbElement, callback){
+
+ var dbElementArray = dbElement.split("|");
+
+ dns.lookup( dbElementArray[0], function onLookup(err, addresses, family) {
+
+ if ( currentDB == addresses ){
+ callback(dbElementArray[1]);
+ return;
+ }
+ else {
+ callback(null);
+ return;
+ }
+ });
+}
+
+
+exports.getCurrentDB = function(){
+ return currentDbName;
+}
+
+
+exports.testdb = function(req,res,callback){
+console.log('testdb');
+
+ osObj = {
+ 'hostname' : os.hostname(),
+ 'type' : os.type(),
+ 'platform' : os.platform(),
+ 'arch' : os.arch(),
+ 'release' : os.release(),
+ 'uptime' : os.uptime(),
+ 'totalmem' : os.totalmem(),
+ 'dbhealth' : ''
+ };
+
+ pool.getConnection(function(err,connection)
+ {
+ if(err){
+ callback(err);
+ return;
+ }
+
+ // http://stackoverflow.com/questions/10982281/mysql-connection-validity-test-in-datasource-select-1-or-something-better
+ connection.query("/* pint */ SELECT 1", function(err,result){
+
+ connection.release();
+ if(err) {
+ callback(err);
+ return;
+ }
+ callback(null,'Database Connectivity to ' + currentDB + ' is working.');
+ return;
+ }); //end query
+ }); // end getConnection
+}
+
+/*
+exports.checkSvcLogic = function(req,res){
+
+ if ( DBmasterHost.length > 0 && currentHost != DBmasterHost )
+ {
+ // need to copy file so SLA functionality works
+ var source = process.env.SDNC_CONFIG_DIR
+ + "/svclogic.properties." + currentHost;
+ var target = process.env.SDNC_CONFIG_DIR
+ + "/svclogic.properties";
+ fs.copy(source,target,{replace:true}, function(err){
+ if(err){
+ res.render("pages/err",
+ {result:{code:'error',
+ msg:"Unable to copy svclogic.properties. "+ String(err) }});
+ return;
+ }
+ });
+ }
+}
+*/
+function initDB( next ) {
+
+
+ var tasks = [];
+ for (var x=0; x<properties.databases.length; x++){
+
+ var db = properties.databases[x];
+ var dbArray = db.split("|");
+ var _dbIP = dnsSync.resolve(dbArray[0]);
+ var _dbName = dbArray[1];
+
+ tasks.push( createFindMasterFunctionObj(_dbIP, _dbName) );
+ }
+ async.series(tasks, function(err,result)
+ {
+ if(err){
+ if ( err == 'found' ){
+ if ( typeof next != 'undefined'){
+ next();
+ }
+ else {
+ return;
+ }
+ }
+ else {
+ console.error( String(err) ); // ALARM
+ return;
+ }
+ }
+ console.log('result=' + result);
+ });
+ return;
+}
+
+
+function createFindMasterFunctionObj(dbIP,dbName){
+ return function(callback) { findMaster(dbIP, dbName, callback); }
+}
+
+function findMaster (ldbIP, ldbName, callback){
+var dbIP = ldbIP;
+var dbName = ldbName;
+
+ console.log('checking dbIP:' + dbIP);
+
+ pool = mysql.createPool({
+ connectionLimit : properties.dbConnLimit,
+ host : dbIP,
+ user : properties.dbUser,
+ password : properties.dbPassword,
+ database : properties.dbName,
+ multipleStatements: true,
+ debug : false
+ });
+
+ pool.getConnection(function(err,connection){
+
+ if(err){
+ callback( String(err) );
+ return;
+ }
+ var sql = 'select @@read_only';
+ connection.query(sql, function(err,result){
+ connection.release();
+
+ // @@read_only=0 means db is writeable
+ console.log('@@read_only=' + result[0]['@@read_only']);
+ if ( result[0]['@@read_only'] == '0' )
+ { // writeable
+ // if this is not the current DB, make it since its writeable
+ currentDB = dbIP;
+ currentDbName = dbName;
+ console.log('currentDB=' + currentDB + "|" + currentDbName);
+ var newpool = mysql.createPool({
+ connectionLimit : properties.dbConnLimit,
+ host : currentDB,
+ user : properties.dbUser,
+ password : properties.dbPassword,
+ database : properties.dbName,
+ multipleStatements: true,
+ debug : false
+ }); // end create
+ pool = newpool;
+ callback('found', currentDB);
+ return;
+ }
+ // otherwise this is the current db and its writeable, just return
+ callback(null, currentDB);
+ return;
+ });
+ });
+}
+
+exports.checkDB = function(req,res,next){
+
+console.log('checkDB');
+
+
+ if ( properties.dbFabric == 'true' )
+ {
+ connectFabric();
+ next();
+ }
+ else
+ {
+ initDB( next );
+ }
+}
+
+
+exports.saveUser = function(req,res){
+
+ pool.getConnection(function(err,connection){
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("pages/signup", {result:{code:'error', msg:"Unable to get database connection. " + String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+ //var sql = "SELECT AES_DECRYPT(password, '" + enckey + "') password FROM PORTAL_USERS";
+ var sql = "SELECT email FROM PORTAL_USERS WHERE email='" + req.body.nf_email + "'";
+
+ console.log(sql);
+
+ connection.query(sql, function(err,result){
+ if(err){
+ res.render("pages/signup", {result:{code:'error', msg:"Unable to get database connection. " + String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+ if (result.length == 1 || result.length > 1)
+ {
+ res.render("pages/signup", {result:{code:'error', msg:'User Information already exists.'},header:process.env.MAIN_MENU});
+ return;
+ }
+
+ sql = "INSERT INTO PORTAL_USERS (email,password,privilege) VALUES ("
+ +"'"+ req.body.nf_email + "',"
+ + "AES_ENCRYPT('" + req.body.nf_password + "','" + enckey + "'),"
+ +"'A')";
+
+ console.log(sql);
+
+ connection.query(sql, function(err,result){
+ connection.release();
+
+ if(err){
+ res.render("pages/signup", {result:{ code:'error', msg:String(err) },header:process.env.MAIN_MENU});;
+ return;
+ }
+ res.render('pages/signup', {result:{code:'success', msg:'User created. Please login.'},header:process.env.MAIN_MENU});
+ return;
+ });
+ });
+ });
+}
+
+// delete User
+exports.deleteUser = function(req,res){
+
+ var rows={};
+ var resultObj = { code:'', msg:'' };
+ var privilegeObj = req.session.loggedInAdmin;
+
+ pool.getConnection(function(err,connection) {
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. Error:" + String(err),
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+
+ var sqlUpdate = "DELETE FROM PORTAL_USERS WHERE email='" + req.query.email + "'";
+
+ console.log(sqlUpdate);
+
+ connection.query(sqlUpdate,function(err,result){
+
+ if(err){
+ resultObj = {code:'error', msg:'Delete of user failed Error: '+ String(err) };
+ }
+
+ // Need DB lookup logic here
+ connection.query("SELECT email,password,privilege FROM PORTAL_USERS", function(err, rows) {
+ connection.release();
+ if(!err) {
+ if ( rows.length > 0 )
+ {
+ resultObj = {code:'success',msg:'Successfully deleted user.'};
+ res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } );
+ return;
+ }else{
+ res.render("user/list", { rows: null, result:{code:'error', msg:'Unexpected no rows returned from database, please try again.',
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+ } else {
+ res.render("user/list", { rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. Error: ' + String(err),
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+ }); //end query
+ });
+ }); // end of getConnection
+}
+
+// add User
+exports.addUser = function(req,res){
+
+ var rows={};
+ var resultObj = { code:'', msg:'' };
+ var privilegeObj = req.session.loggedInAdmin;
+
+ pool.getConnection(function(err,connection) {
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. "+ String(err),
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+
+ if( req.body.nf_privilege == "admin" ){
+ var char_priv = 'A';
+ }else if(req.body.nf_privilege == 'readonly'){
+ var char_priv = 'R';
+ }else{
+ var char_priv = 'A';
+ }
+
+
+ //connection.query(sqlRequest, function(err,result){
+ var sqlUpdate = "INSERT INTO PORTAL_USERS (email, password, privilege) VALUES ("
+ +"'"+ req.body.nf_email + "',"
+ + "AES_ENCRYPT('" + req.body.nf_password + "','" + enckey + "'),"
+ +"'"+ char_priv + "')";
+
+ console.log(sqlUpdate);
+
+ connection.query(sqlUpdate,function(err,result){
+
+ if(err){
+ resultObj = {code:'error', msg:'Add of user failed Error: '+err};
+ }
+
+ // Need DB lookup logic here
+ connection.query("SELECT email,AES_DECRYPT(password, '" + enckey + "') password,privilege FROM PORTAL_USERS", function(err, rows) {
+
+ connection.release();
+ if(!err) {
+ if ( rows.length > 0 )
+ {
+ resultObj = {code:'success',msg:'Successfully added user.'};
+ res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } );
+ return;
+ }else{
+ res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database, please try again.',
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+ } else {
+ res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. Error: '+ err ,
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+ }); //end query
+ });
+
+ }); // end of getConnection
+}
+
+// updateUser
+exports.updateUser= function(req,res){
+
+ var rows={};
+ var resultObj = { code:'', msg:'' };
+ var privilegeObj = req.session.loggedInAdmin;
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. " + String(err),
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+
+ if( req.body.uf_privilege == "admin" ){
+ var char_priv = 'A';
+ }else if(req.body.uf_privilege == 'readonly'){
+ var char_priv = 'R';
+ }else{
+ var char_priv = 'A';
+ }
+
+
+ //connection.query(sqlRequest, function(err,result){
+ var sqlUpdate = "UPDATE PORTAL_USERS SET "
+ + "email = '" + req.body.uf_email + "',"
+ + "password = " + "AES_ENCRYPT('" + req.body.uf_password + "','" + enckey + "'), "
+ + "privilege = '"+ char_priv + "'"
+ + " WHERE email = '" + req.body.uf_key_email + "'";
+
+ console.log(sqlUpdate);
+
+ connection.query(sqlUpdate,function(err,result){
+
+ if(err){
+ resultObj = {code:'error', msg:'Update of user failed Error: '+err};
+ }
+
+ // Need DB lookup logic here
+ connection.query("SELECT email, AES_DECRYPT(password,'" + enckey + "') password, privilege FROM PORTAL_USERS", function(err, rows) {
+ connection.release();
+ if(!err) {
+ if ( rows.length > 0 )
+ {
+ resultObj = {code:'success',msg:'Successfully updated user.'};
+ res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU} );
+ return;
+ }else{
+ res.render("user/list", {rows: null, result:{ code:'error', msg:'Unexpected no rows returned from database.',
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+ } else {
+ res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. ' + String(err),
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+ }); //end query
+ });
+ }); // end of getConnection
+};
+
+exports.listUsers = function(req,res,resultObj){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var rows={};
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("pages/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. " + String(err),
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+
+ // Need DB lookup logic here
+ var selectUsers = "SELECT email, AES_DECRYPT(password,'" + enckey + "') password, privilege from PORTAL_USERS";
+ console.log(selectUsers);
+ connection.query(selectUsers, function(err, rows) {
+
+ connection.release();
+ if(err){
+ resultObj = {code:'error', msg:'Unable to SELECT users Error: '+err};
+ }
+
+ if(!err) {
+ if ( rows.length > 0 )
+ {
+ console.log(JSON.stringify(rows));
+ res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU });
+ return;
+ }
+ else{
+ res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database.',
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+ } else {
+ res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. ' + String(err),
+ privilege:privilegeObj },header:process.env.MAIN_MENU});
+ return;
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+exports.listSLA = function(req,res,resultObj){
+
+ var privilegeObj = req.session.loggedInAdmin;
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+
+ // Need DB lookup logic here
+ connection.query("SELECT module,rpc,version,mode,active,graph FROM SVC_LOGIC", function(err, rows) {
+
+ connection.release();
+ if(err) {
+ res.render("pages/err", {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+ else {
+ res.render("sla/list", {rows:rows, result:resultObj, privilege:privilegeObj, header:process.env.MAIN_MENU} );
+ return;
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+exports.executeSQL = function(sql,req,res,callback){
+
+ console.log(sql);
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ callback(err, 'Unable to get database connection.' + err);
+ return;
+ }
+
+ connection.query(sql, function(err,result){
+ connection.release();
+ if (err) {
+ callback(err,'Database operation failed. ' + err );
+ }
+ else
+ {
+console.log('affectedRows='+result.affectedRows);
+ callback(null, result.affectedRows);
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+
+// gamma - deleteParameter
+exports.deleteParameter = function(req,res,callback){
+
+ var sql = "DELETE FROM PARAMETERS WHERE name='" + req.query.name + "'";
+
+ console.log(sql);
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.log( String(err) ); // ALARM
+ callback(err, 'Unable to get database connection.' + err);
+ return;
+ }
+ connection.query(sql, function(err,result){
+ connection.release();
+ if(err){
+ console.log('Update failed. ' + err );
+ callback(err,'Update failed. ' + err );
+ }
+ else
+ {
+ callback(null,'');
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+
+exports.getTable = function(req,res,sql,rdestination,resultObj,privilegeObj){
+
+console.log('SQL:'+sql);
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+ connection.query(sql,function(err, rows)
+ {
+ connection.release();
+ if(err) {
+ res.render(rdestination, {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+ else {
+ res.render(rdestination, { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } );
+ return;
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+exports.getMetaTable = function(req,res,sql,rdestination,resultObj,privilegeObj){
+
+ console.log('SQL:'+ sql);
+
+ var rdata = [];
+ var v_tables = [];
+ var vtables = properties.viewTables;
+
+ for ( var i in vtables ) {
+ v_tables.push(vtables[i]);
+ }
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+ connection.query(sql,function(err, rows, fields)
+ {
+ console.log('rows:' + JSON.stringify(rows,null,2));
+ // http://stackoverflow.com/questions/14528385/how-to-convert-json-object-to-javascript-array
+ //logger.debug(Object.keys(rows[0]).map(function(v) { return rows[0][v]; }));
+ for ( var i in rows ){
+ rdata.push(Object.keys(rows[i]).map(function(v) { return rows[i][v]; }));
+ //logger.debug(Object.keys(rows[i]).map(function(v) { return rows[i][v]; }));
+ //logger.debug([i, rows[i]]);
+ }
+ for ( var x in rdata ){
+ for ( var j in rdata[x] ){
+ console.log('rdata[' + x + ']: ' + rdata[x][j]);
+ }
+ }
+ console.log('rdata:' + rdata[0]);
+ console.log('fields:' + JSON.stringify(fields,null,2));
+ connection.release();
+ if(err) {
+ res.render(rdestination, {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+ else {
+ res.render(rdestination, { displayTable:true, vtables:v_tables, rows:rdata, fields:fields, result:resultObj, privilege:privilegeObj, header:process.env.MAIN_MENU } );
+ return;
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+exports.getVnfProfile = function(req,res,resultObj,privilegeObj){
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+
+ connection.query("SELECT vnf_type,availability_zone_count,equipment_role "
+ + "FROM VNF_PROFILE ORDER BY VNF_TYPE", function(err, rows)
+ {
+ connection.release();
+ if(err) {
+ res.render("mobility/vnfProfile", {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+ else {
+ res.render('mobility/vnfProfile', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } );
+ return;
+ }
+ }); //end query
+console.log('after query');
+ }); // end getConnection
+}
+
+
+exports.getVnfPreloadData = function(req,res,dbtable,callback){
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ callback(err, 'Unable to get database connection.' + err);
+ return;
+ }
+
+ // Need DB lookup logic here
+ connection.query("SELECT preload_data FROM " + dbtable + " WHERE id="
+ + req.query.id, function(err, rows)
+ {
+ connection.release();
+ if(err) {
+ callback(err);
+ return;
+ }
+ else {
+ var buffer = rows[0].preload_data;
+ var decode_buffer = decodeURI(buffer);
+ var content = JSON.parse(decode_buffer);
+ callback(null,content);
+ return;
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+
+
+exports.getVnfNetworkData = function(req,res,resultObj,privilegeObj){
+
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+
+ // Need DB lookup logic here
+ connection.query("SELECT id,svc_request_id,svc_action,status,filename,ts,preload_data "
+ + "FROM PRE_LOAD_VNF_NETWORK_DATA ORDER BY id", function(err, rows)
+ {
+ var msgArray = new Array();
+
+ connection.release();
+ if(err) {
+ msgArray = 'Database Error: '+ String(err);
+ res.render("mobility/vnfPreloadNetworkData", {
+ result:{code:'error',msg:msgArray},
+ preloadImportDirectory: properties.preloadImportDirectory,
+ header:process.env.MAIN_MENU
+ });
+ return;
+ }
+ else {
+ var retData = [];
+ for( r=0; r<rows.length; r++)
+ {
+ var rowObj = {};
+ rowObj.row = rows[r];
+ if ( rows[r].filename.length > 0 )
+ {
+ try{
+ var buffer = rows[r].preload_data;
+ var decode_buffer = decodeURI(buffer);
+ var filecontent = JSON.parse(decode_buffer);
+ rowObj.filecontent = filecontent;
+ rowObj.network_name = filecontent.input["network-topology-information"]["network-topology-identifier"]["network-name"];
+ rowObj.network_type = filecontent.input["network-topology-information"]["network-topology-identifier"]["network-type"];
+ }
+ catch(error){
+ msgArray.push('File ' + rows[r].filename + ' has invalid JSON. Error:' + error);
+ }
+ }
+ else {
+ rowObj.filecontent = '';
+ }
+ retData.push(rowObj);
+ }
+ if(msgArray.length>0){
+ resultObj.code = 'failure';
+ resultObj.msg = msgArray;
+ }
+ res.render('mobility/vnfPreloadNetworkData', {
+ retData:retData,
+ result:resultObj,
+ privilege:privilegeObj,
+ preloadImportDirectory: properties.preloadImportDirectory,
+ header:process.env.MAIN_MENU
+ });
+ return;
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+exports.getVnfData = function(req,res,resultObj,privilegeObj){
+
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+
+ // Need DB lookup logic here
+ connection.query("SELECT id,svc_request_id,svc_action,status,filename,ts,preload_data "
+ + "FROM PRE_LOAD_VNF_DATA ORDER BY id", function(err, rows)
+ {
+ var msgArray = new Array();
+
+ connection.release();
+ if(err) {
+ msgArray = 'Database Error: '+ String(err);
+ res.render("mobility/vnfPreloadData", {
+ result:{code:'error',msg:msgArray},
+ preloadImportDirectory: properties.preloadImportDirectory,
+ header:process.env.MAIN_MENU
+ });
+ return;
+ }
+ else {
+ var retData = [];
+ for( r=0; r<rows.length; r++)
+ {
+ var rowObj = {};
+ rowObj.row = rows[r];
+ if ( rows[r].filename.length > 0 )
+ {
+ try{
+ var buffer = rows[r].preload_data;
+ var s_buffer = decodeURI(buffer);
+ var filecontent = JSON.parse(s_buffer);
+ rowObj.filecontent = filecontent;
+ rowObj.vnf_name = filecontent.input["vnf-topology-information"]["vnf-topology-identifier"]["vnf-name"];
+ rowObj.vnf_type = filecontent.input["vnf-topology-information"]["vnf-topology-identifier"]["vnf-type"];
+ }
+ catch(error){
+ msgArray.push('File ' + rows[r].filename + ' has invalid JSON. Error:' + error);
+ }
+ }
+ else {
+ rowObj.filecontent = '';
+ }
+ retData.push(rowObj);
+ }
+ if(msgArray.length>0){
+ resultObj.code = 'failure';
+ resultObj.msg = msgArray;
+ }
+ res.render('mobility/vnfPreloadData',{
+ retData:retData, result:resultObj,
+ privilege:privilegeObj,
+ header:process.env.MAIN_MENU,
+ preloadImportDirectory: properties.preloadImportDirectory
+ });
+ return;
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+
+exports.findAdminUser = function(email,res,callback) {
+
+
+ var adminUser={};
+ pool.getConnection(function(err,connection) {
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("pages/login", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+
+ // Need DB lookup logic here
+ connection.query("SELECT email, AES_DECRYPT(password, '" + enckey + "') password, privilege FROM PORTAL_USERS WHERE email='" + email + "'", function(err, rows) {
+
+ connection.release();
+ if(!err) {
+ if ( rows.length > 0 )
+ {
+ rows.forEach(function(row){
+ adminUser = {
+ "email" : row.email,
+ "password" : row.password,
+ "privilege" : row.privilege };
+ });
+ callback(adminUser);
+ return;
+ }else{
+ console.log("no rows returned");
+ res.render("pages/login", {result:{code:'error', msg:'User is not in database.'},header:process.env.MAIN_MENU});
+ return;
+ }
+ } else {
+ res.render("pages/err", {result:{code:'error',msg:'Unexpected no rows returned from database. '+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+
+exports.addRow = function(sql,req,res,callback){
+
+ console.log(sql);
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ callback(err, 'Unable to get database connection.' + err);
+ return;
+ }
+
+ connection.query(sql, function(err,result){
+ connection.release();
+ if(err){
+ console.debug('Database operation failed. ' + err );
+ callback(err,'Database operation failed. ' + err );
+ }
+ else
+ {
+ callback(null, result.affectedRows);
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+
+
+exports.addVnfProfile = function(row,res,callback){
+
+ var sqlInsert;
+
+ if ( row.length < 3 )
+ {
+ console.log('Row [' + row + '] does not have enough fields.');
+ callback(null, 'Row [' + row + '] does not have enough fields.');
+ return;
+ }
+
+ sqlInsert = "INSERT INTO VNF_PROFILE ("
+ + "vnf_type,availability_zone_count,equipment_role) VALUES ("
+ + "'" + row[0] + "',"
+ + row[1]
+ + ",'" + row[2] + "')";
+
+ console.log('SQL='+sqlInsert);
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.log( String(err) ); // ALARM
+ callback(err, 'Unable to get database connection.');
+ return;
+ }
+ connection.query(sqlInsert, function(err,result){
+ connection.release();
+ if(err){
+ console.log('Row [' + row + '] failed to insert. ' + err );
+ callback(null,'Row [' + row + '] failed to insert. ' + err );
+ }
+ else
+ {
+ callback(null,'');
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+
+// Add to SVC_LOGIC table
+exports.addDG = function(_module, version, rpc, mode, xmlfile, req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var rows={};
+
+ pool.getConnection(function(err,connection) {
+ if(err){
+ console.error( String(err) ); // ALARM
+ res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
+ return;
+ }
+
+ var post = {
+ module : _module,
+ rpc : rpc,
+ version : version,
+ mode : mode,
+ active : "N",
+ graph : xmlfile
+ };
+
+ //logger.debug( JSON.stringify(post));
+
+ //connection.query(sqlRequest, function(err,result){
+ connection.query('INSERT INTO SVC_LOGIC SET ?', post, function(err,result){
+ // neat!
+
+ // Need DB lookup logic here
+ connection.query("SELECT module,rpc,version,mode,active,graph FROM SVC_LOGIC", function(err, rows) {
+
+ if(!err) {
+ if ( rows.length > 0 )
+ {
+ res.render('sla/list', { rows: rows, result:{code:'',msg:''}, privilege:privilegeObj,header:process.env.MAIN_MENU } );
+ return;
+ }else{
+ console.log("no rows returned");
+ res.render("pages/home");
+ return;
+ }
+ }
+ connection.on('error', function(err){
+ connection.release();
+ console.log(500, "An error has occurred -- " + err);
+ res.render("pages/home");
+ return;
+ });
+ }); //end query
+
+ connection.release();
+ });
+ //connection.query('INSERT INTO SVC_LOGIC SET ?', post, function(err,result){
+ // neat!
+ //logger.debug('inserted rows');
+ //});
+
+ //if(err){
+ //res.render('pages/home');
+ //}
+ return;
+
+ }); // end of getConnection
+};
+
+exports.activate = function(req,res,_module,rpc,version,mode,callback){
+
+ var sql = "UPDATE SVC_LOGIC SET active=\'Y\' WHERE module=\'"
+ + _module + "' AND rpc=\'"
+ + rpc + "' AND version=\'"
+ + version + "' AND mode=\'"
+ + mode + "'";
+
+ console.log('SQL='+sql);
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ callback(err, 'Unable to get database connection.' + err);
+ return;
+ }
+
+ connection.query(sql, function(err,result){
+
+ connection.release();
+ if(err){
+ callback(err, 'Unable to get database connection.' + err);
+ }
+ else
+ {
+ callback(null,'');
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+
+exports.deactivate = function(req,res,_module,rpc,version,mode,callback){
+
+ var sql = "UPDATE SVC_LOGIC SET active=\'N\' WHERE module=\'"
+ + _module + "' AND rpc=\'"
+ + rpc + "' AND version=\'"
+ + version + "' AND mode=\'"
+ + mode + "'";
+
+ console.log('SQL='+sql);
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ callback(err, 'Unable to get database connection.' + err);
+ return;
+ }
+
+ connection.query(sql, function(err,result){
+
+ connection.release();
+ if(err){
+ callback(err, 'Unable to get database connection.' + err);
+ }
+ else
+ {
+ callback(null,'');
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+exports.global_deactivate = function(req,res,_module,rpc,mode,callback){
+
+ var sql = "UPDATE SVC_LOGIC SET active=\'N\' WHERE module=\'"
+ + _module + "' AND rpc=\'"
+ + rpc + "' AND mode=\'"
+ + mode + "'";
+
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ callback(err, 'Unable to get database connection.' + err);
+ return;
+ }
+
+ connection.query(sql, function(err,result){
+
+ connection.release();
+ if(err){
+ callback(err, err);
+ }
+ else
+ {
+ callback(null,'');
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+
+exports.deleteDG = function(req,res,_module,rpc,version,mode,callback){
+
+ var sql = "DELETE FROM SVC_LOGIC WHERE module=\'"
+ + _module + "' AND rpc=\'"
+ + rpc + "' AND version=\'"
+ + version + "' AND mode=\'"
+ + mode + "'";
+
+ console.log('SQL='+sql);
+
+ pool.getConnection(function(err,connection) {
+
+ if(err){
+ console.error( String(err) ); // ALARM
+ callback(err, 'Unable to get database connection.' + err);
+ return;
+ }
+
+ connection.query(sql, function(err,result){
+
+ connection.release();
+ if(err){
+ callback(err, 'Unable to get database connection.' + err);
+ }
+ else
+ {
+ callback(null,'');
+ }
+ }); //end query
+ }); // end getConnection
+}
+
+
+
+function padLeft(nr, n, str){
+ return Array(n-String(nr).length+1).join(str||'0')+nr;
+}
+
diff --git a/admportal/server/router/routes/gamma.js b/admportal/server/router/routes/gamma.js
new file mode 100644
index 00000000..70e6713c
--- /dev/null
+++ b/admportal/server/router/routes/gamma.js
@@ -0,0 +1,1667 @@
+var express = require('express');
+var router = express.Router();
+var exec = require('child_process').exec;
+var util = require('util');
+var fs = require('fs');
+var dbRoutes = require('./dbRoutes');
+var csp = require('./csp');
+var multer = require('multer');
+var bodyParser = require('body-parser');
+var sax = require('sax'),strict=true,parser = sax.parser(strict);
+var async = require('async');
+var l_ = require('lodash');
+
+
+// used for file upload button, retain original file name
+//router.use(bodyParser());
+router.use(bodyParser.urlencoded({
+ extended: true
+}));
+
+//var upload = multer({ dest: process.cwd() + '/uploads/', rename: function(fieldname,filename){ return filename; } });
+
+// multer 1.1
+var storage = multer.diskStorage({
+ destination: function (req, file, cb) {
+ cb(null, process.cwd() + '/uploads/')
+ },
+ filename: function (req, file, cb) {
+ cb(null, file.originalname )
+ }
+});
+
+var upload = multer({
+ storage: storage
+});
+
+
+//router.use(express.json());
+//router.use(express.urlencoded());
+//router.use(multer({ dest: './uploads/' }));
+
+// 1604
+var selectNetworkProfile = "SELECT network_type,technology FROM NETWORK_PROFILE ORDER BY network_type";
+
+var selectNbVlanRange = "SELECT vlan_plan_id,plan_type,purpose,LPAD(range_start,4,0) range_start,LPAD(range_end,4,0) range_end,generated from VLAN_RANGES ORDER BY vlan_plan_id";
+
+var selectNbVlanPool = "SELECT aic_site_id,availability_zone,vlan_plan_id,plan_type,purpose,LPAD(vlan_id,4,0) vlan_id,status FROM VLAN_POOL ORDER BY aic_site_id,availability_zone,vlan_plan_id,vlan_id";
+
+router.get('/getNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getTable(req,res,selectNetworkProfile,'gamma/networkProfile',{code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getNbVlanRange', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getTable(req,res,selectNbVlanRange,'gamma/nbVlanRange',{code:'', msg:''}, req.session.loggedInAdmin);
+});
+
+router.get('/getNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ if (typeof req.query.vlan_plan_id == "undefined"){
+ dbRoutes.getTable(req,res,selectNbVlanPool,'gamma/nbVlanPool',{code:'', msg:''}, req.session.loggedInAdmin);
+ }else{
+ var sql = "SELECT aic_site_id,availability_zone,vlan_plan_id,plan_type,purpose,vlan_id,status FROM VLAN_POOL WHERE vlan_plan_id='" + req.query.vlan_plan_id + "' AND vlan_id BETWEEN "
+ + req.query.range_start + " AND " + req.query.range_end;
+ dbRoutes.getTable(req,res,sql,'gamma/nbVlanPool',{code:'', msg:''}, req.session.loggedInAdmin);
+ }
+});
+
+router.post('/addNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var network_type = removeNL(req.body.nf_network_type);
+ var technology = removeNL(req.body.nf_technology);
+ var sql = "INSERT INTO NETWORK_PROFILE (network_type,technology) VALUES ("
+ + "'"+ network_type + "',"
+ + "'"+ technology + "')";
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err)
+ {
+ msgArray.push(err);
+ dbRoutes.getTable(req,res,ucpePhsCredentials, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else
+ {
+ if ( result == 1 )
+ {
+ msgArray.push('Successfully added Network Profile.');
+ dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ else
+ {
+ msgArray.push('Was not able to add Network Profile.');
+ dbRoutes.getTable(req,res,ucpePhsCredentials, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ }
+ });
+});
+
+router.post('/saveNbVlanRange', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var plan_type = req.body.nf_plan_type;
+ var purpose = req.body.nf_purpose;
+ var range_start = padLeft(removeNL(req.body.nf_range_start),4);
+ var range_end = padLeft(removeNL(req.body.nf_range_end),4);
+ var tasks = [];
+ var privilegeObj = req.session.loggedInAdmin;
+
+ tasks.push( function(callback) {
+ dbRoutes.saveNbVlanRange(range_start,range_end,plan_type,purpose,req,res,callback);
+ });
+
+ // will probably need to be a new call that is a transaction if i use a new
+ // plan_type-purpose-counter table.
+ //tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err)
+ {
+ msgArray.push(err);
+ dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else
+ {
+ msgArray.push('Successfully added VLAN Range.');
+ dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+router.get('/deleteNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push(function(callback){
+ dbRoutes.executeSQL("DELETE FROM NETWORK_PROFILE WHERE network_type = '" + req.query.network_type + "'", req,res,callback);
+
+ });
+ async.series(tasks, function(err,result)
+ {
+ var msgArray = new Array();
+ if(err){
+ msgArray.push("Error: " + err);
+ dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else
+ {
+ if ( result[0] == 1 )
+ {
+ msgArray.push('Successfully deleted Network Profile.');
+ dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ else
+ {
+ msgArray.push('No rows removed.');
+ dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ }
+ });
+});
+
+router.get('/deleteNbVlanRange', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+
+ tasks.push(function(callback){
+ dbRoutes.deleteNbVlanRange(req.query.vlan_plan_id,req,res,callback);
+ });
+ async.series(tasks, function(err,result)
+ {
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else
+ {
+ msgArray.push('Successfully deleted Range.');
+ dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+router.post('/updateNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var sql = "UPDATE NETWORK_PROFILE SET "
+ + "network_type='"+ removeNL(req.body.uf_network_type) + "', "
+ + "technology='" + removeNL(req.body.uf_technology) + "' "
+ + "WHERE network_type='" + removeNL(req.body.uf_key_network_type) + "'";
+
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated Network Profile.');
+ dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+router.post('/updateNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var sql = "UPDATE VLAN_POOL SET "
+ + "status='"+ removeNL(req.body.uf_status) + "' "
+ + " WHERE aic_site_id='" + removeNL(req.body.uf_key_aic_site_id) + "'"
+ + " AND availability_zone='" + removeNL(req.body.uf_key_availability_zone) + "'"
+ + " AND vlan_plan_id='" + removeNL(req.body.uf_key_vlan_plan_id) + "'"
+ + " AND plan_type='" + removeNL(req.body.uf_key_plan_type) + "'"
+ + " AND purpose='" + removeNL(req.body.uf_key_purpose) + "'"
+ + " AND vlan_id=" + removeNL(req.body.uf_key_vlan_id);
+
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getTable(req,res,selectNbVlanPool, 'gamma/nbVlanPool', {code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated Network Profile.');
+ dbRoutes.getTable(req,res,selectNbVlanPool, 'gamma/nbVlanPool', {code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+router.post('/updateNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+});
+router.get('/generateNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var vlan_plan_id = req.query.vlan_plan_id;
+ var plan_type = req.query.plan_type;
+ var purpose = req.query.purpose;
+ var range_start = req.query.range_start;
+ var range_end = req.query.range_end;
+ var tasks = [];
+ var privilegeObj = req.session.loggedInAdmin;
+
+ tasks.push( function(callback) {
+ dbRoutes.generateNbVlanPool(range_start,range_end,plan_type,purpose,vlan_plan_id,req,res,callback);
+ });
+
+ // will probably need to be a new call that is a transaction if i use a new
+ // plan_type-purpose-counter table.
+ //tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err)
+ {
+ msgArray.push(err);
+ dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else
+ {
+ msgArray.push('Successfully added VLAN Range.');
+ dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+///// end 1604
+
+
+// GET
+router.get('/getServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getServiceHoming(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getServiceHomingRollback', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getServiceHomingRollback(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getVlanPool(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getAicSite', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getAicSite(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getAicSwitch', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getAicSwitch(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getAicAvailZone', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getAicAvailZone(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getVpePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getVpePool(req,res,{code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getVplspePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getVplspePool(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+
+// ROLLBACK SERVICE_HOMING
+router.get('/rollbackServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push(function(callback) {
+ dbRoutes.rollbackServiceHoming(req,res,callback);
+ });
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getServiceHomingRollback(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('SERVICE_HOMING table successfully restored.');
+ dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// DELETE SERVICE_HOMING
+router.get('/deleteServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push(function(callback) {
+ dbRoutes.deleteServiceHoming(req,res,callback);
+ });
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from SERVICE_HOMING table.');
+ dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+// DELETE AIC_SITE
+router.get('/deleteSite', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push(function(callback) {
+ dbRoutes.deleteSite(req,res,callback);
+ });
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getAicSite(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from AIC_SITE table.');
+ dbRoutes.getAicSite(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// DELETE AIC_SWITCH
+router.get('/deleteSwitch', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push(function(callback) {
+ dbRoutes.deleteSwitch(req,res,callback);
+ });
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getAicSwitch(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from AIC_SWITCH table.');
+ dbRoutes.getAicSwitch(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// DELETE AIC_AVAIL_ZONE_POOL
+router.get('/deleteZone', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push(function(callback) {
+ dbRoutes.deleteZone(req,res,callback);
+ });
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from AIC_AVAIL_ZONE_POOL table.');
+ dbRoutes.getAicAvailZone(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// DELETE VLAN_ID_POOL
+router.get('/deleteVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push(function(callback) {
+ dbRoutes.deleteVlanPool(req,res,callback);
+ });
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVlanPool(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from VLAN_ID_POOL table.');
+ dbRoutes.getVlanPool(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// DELETE VPE_POOL
+router.get('/deleteVpePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push(function(callback) {
+ dbRoutes.deleteVpePool(req,res,callback);
+ });
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVpePool(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from VPE_POOL table.');
+ dbRoutes.getVpePool(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+// DELETE VPE_POOL
+router.get('/deleteVplspePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push(function(callback) {
+ dbRoutes.deleteVplspePool(req,res,callback);
+ });
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVplspePool(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from VPLSPE_POOL table.');
+ dbRoutes.getVplspePool(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// POST
+router.post('/addServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.addWebServiceHoming(req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully added SERVICE_HOMING');
+ dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+// gamma - updateProvStatus
+router.post('/updateProvStatus', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.updateProvStatus(req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVpePool(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated Provisioning Status');
+ dbRoutes.getVpePool(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// gamma - updateAicSite
+router.post('/updateAicSite', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.updateAicSite(req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getAicSite(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated AIC_SITE table.');
+ dbRoutes.getAicSite(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// gamma - updateAicSwitch
+router.post('/updateAicSwitch', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.updateAicSwitch(req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getAicSwitch(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated AIC_SWITCH table.');
+ dbRoutes.getAicSwitch(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// gamma - updateAicAvailZone
+router.post('/updateAicAvailZone', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.updateAicAvailZone(req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated AIC_AVAIL_ZONE_POOL table.');
+ dbRoutes.getAicAvailZone(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// gamma - updateVlanPool
+router.post('/updateVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.updateVlanPool(req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVlanPool(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated VLAN_ID_POOL table.');
+ dbRoutes.getVlanPool(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// gamma - updateVpePool
+router.post('/updateVpePool', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.updateVpePool(req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVpePool(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated VPE_POOL table.');
+ dbRoutes.getVpePool(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// gamma - updateVplspePool
+router.post('/updateVplspePool', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.updateVplspePool(req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVplspePool(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated VPLSPE_POOL table.');
+ dbRoutes.getVplspePool(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+// gamma - updateServiceHoming
+router.post('/updateServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.updateServiceHoming(req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully updated SERVICE_HOMING table.');
+ dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+router.post('/uploadVLAN', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res, next){
+
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname){
+ if (req.file.originalname.size == 0) {
+ dbRoutes.getVlanPool(req,res,{code:'danger', msg:'There was an error uploading the file, please try again.'},privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists) {
+ if(exists) {
+
+ var str = req.file.originalname;
+
+ // check for valid filename format
+ var tagpos = str.search("_ctag_pool");
+ var csvpos = str.search(".csv");
+ if(tagpos != 13 || csvpos != 23){
+ var msgArray = new Array();
+ msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_ctag_pool.csv');
+ dbRoutes.getVlanPool(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ try {
+ var csv = require('csv');
+
+ // the job of the parser is to convert a CSV file
+ // to a list of rows (array of rows)
+ var parser = csv.parse({
+ columns: function(line) {
+ // By defining this callback, we get handed the
+ // first line of the spreadsheet. Which we'll
+ // ignore and effectively skip this line from processing
+ },
+ skip_empty_lines: true
+ });
+
+ var row = 0;
+ var f = new Array();
+ var transformer = csv.transform(function(data){
+ // this will get row by row data, so for example,
+ //logger.debug(data[0]+','+data[1]+','+data[2]);
+ f[row] = new Array();
+ for ( col=0; col<data.length; col++ )
+ {
+ f[row][col] = data[col];
+ }
+ row++;
+ });
+
+
+ // called when done with processing the CSV
+ transformer.on("finish", function() {
+
+ var funcArray = new Array();
+
+ function createFunction(lrow,res)
+ {
+ return function(callback) { dbRoutes.addVLAN(lrow,res,callback); }
+ }
+
+ // loop for each row and create an array of callbacks for async.parallelLimit
+ // had to create a function above 'createFunction' to get
+ for (var x=0; x<f.length; x++)
+ {
+ funcArray.push( createFunction(f[x],res) );
+ }
+
+ // make db calls in parrallel
+ //async.parallelLimit(funcArray, 5, function(err,result){
+ async.series(funcArray, function(err,result){
+
+ if ( err ) {
+ dbRoutes.getVlanPool(req,res, result,privilegeObj);
+ return;
+ }
+ else {
+ // result array has an entry in it, success entries are blank, figure out
+ // how many are not blank, aka errors.
+ var rowError = 0;
+ for(var i=0;i<result.length;i++){
+ if ( result[i].length > 0 )
+ {
+ rowError++;
+ }
+ }
+
+ var rowsProcessed = f.length - rowError;
+ result.push(rowsProcessed + ' of ' + f.length + ' rows processed.');
+ if ( rowError > 0 )
+ {
+ result = {code:'failure', msg:result};
+ }
+ else
+ {
+ result = {code:'success', msg:result};
+ }
+ dbRoutes.getVlanPool(req,res,result,privilegeObj);
+ return;
+ }
+ });
+ });
+
+
+ var stream = fs.createReadStream(req.file.path, "utf8");
+ stream.pipe(parser).pipe(transformer);
+
+
+ } catch(ex) {
+ console.error('error:'+ex);
+ msgArray = [];
+ msgArray.push('There was an error uploading the file. '+ex);
+ dbRoutes.getVlanPool(req,res, {code:'danger', msg:msgArray}, privilegeObj);
+ return;
+ }
+
+ } else {
+ msgArray = [];
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVlanPool(req,res, {code:'danger', msg:msgArray}, privilegeObj);
+ return;
+ }
+ });
+ }
+ else {
+ msgArray = [];
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVlanPool(req,res, {code:'danger', msg:msgArray}, privilegeObj);
+ return;
+ }
+
+});
+
+
+// POST
+router.post('/uploadAicSite', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){
+
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname){
+ if (req.file.originalname.size == 0) {
+ dbRoutes.getAicSite(req,res, {code:'danger', msg:'There was an error uploading the file, please try again.'}, privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists) {
+ if(exists) {
+
+ var str = req.file.originalname;
+
+ // check for valid filename format
+ var tagpos = str.search("_site");
+ var csvpos = str.search(".csv");
+ if(tagpos != 13 || csvpos != 18){
+ msgArray.length = 0;
+ msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_site.csv');
+ dbRoutes.getAicSite(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ try {
+ var csv = require('csv');
+
+ // the job of the parser is to convert a CSV file
+ // to a list of rows (array of rows)
+ var parser = csv.parse({
+ columns: function(line) {
+ // By defining this callback, we get handed the
+ // first line of the spreadsheet. Which we'll
+ // ignore and effectively skip this line from processing
+ },
+ skip_empty_lines: true
+ });
+
+ var row = 0;
+ var f = new Array();
+ var transformer = csv.transform(function(data){
+ // this will get row by row data, so for example,
+ //logger.debug(data[0]+','+data[1]+','+data[2]);
+
+ // build an array of rows
+ f[row] = new Array();
+ for ( col=0; col<data.length; col++ )
+ {
+ f[row][col] = data[col];
+ }
+ row++;
+ });
+
+ // called when done with processing the CSV
+ transformer.on("finish", function() {
+
+ var funcArray = new Array();
+
+ function createFunction(lrow,res)
+ {
+ return function(callback) { dbRoutes.addAicSite(lrow,res,callback); }
+ }
+
+ // loop for each row and create an array of callbacks for async.parallelLimit
+ // had to create a function above 'createFunction' to get
+ for (var x=0; x<f.length; x++)
+ {
+ funcArray.push( createFunction(f[x],res) );
+ }
+
+ // make db calls in parrallel
+ async.parallelLimit(funcArray, 50, function(err,result){
+
+ if ( err ) {
+ dbRoutes.getAicSite(req,res, result,privilegeObj);
+ return;
+ }
+ else {
+ // result array has an entry in it, success entries are blank, figure out
+ // how many are not blank, aka errors.
+ var rowError = 0;
+ for(var i=0;i<result.length;i++){
+ if ( result[i].length > 0 )
+ {
+ rowError++;
+ }
+ }
+
+ var rowsProcessed = f.length - rowError;
+ result.push(rowsProcessed + ' of ' + f.length + ' rows processed.');
+ if ( rowError > 0 )
+ {
+ result = {code:'failure', msg:result};
+ }
+ else
+ {
+ result = {code:'success', msg:result};
+ }
+ dbRoutes.getAicSite(req,res,result,privilegeObj);
+ return;
+ }
+ });
+ });
+
+ var stream = fs.createReadStream(req.file.path, "utf8");
+ stream.pipe(parser).pipe(transformer);
+
+
+ } catch(ex) {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file. '+ex);
+ dbRoutes.getAicSite(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getAicSite(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getAicSite(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ }
+
+} );
+
+// POST
+router.post('/uploadAicSwitch', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){
+
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname){
+ if (req.file.originalname.size == 0) {
+ dbRoutes.getAicSwitch(req,res,{code:'danger', msg:'There was an error uploading the file, please try again.'},privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists) {
+
+ if(exists) {
+
+ var str = req.file.orignalname;
+
+ // check for valid filename format
+ var tagpos = str.search("_switch");
+ var csvpos = str.search(".csv");
+ if(tagpos != 13 || csvpos != 20){
+ msgArray.length = 0;
+ msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_switch.csv');
+ dbRoutes.getAicSwitch(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ try {
+ var csv = require('csv');
+
+ // the job of the parser is to convert a CSV file
+ // to a list of rows (array of rows)
+ var parser = csv.parse({
+ columns: function(line) {
+ // By defining this callback, we get handed the
+ // first line of the spreadsheet. Which we'll
+ // ignore and effectively skip this line from processing
+ },
+ skip_empty_lines: true
+ });
+
+ var row = 0;
+ var f = new Array();
+ var transformer = csv.transform(function(data){
+ // this will get row by row data, so for example,
+ //logger.debug(data[0]+','+data[1]+','+data[2]);
+
+ // build an array of rows
+ f[row] = new Array();
+ for ( col=0; col<data.length; col++ )
+ {
+ f[row][col] = data[col];
+ }
+ row++;
+ });
+
+ // called when done with processing the CSV
+ transformer.on("finish", function() {
+
+ var funcArray = new Array();
+
+ function createFunction(lrow,res)
+ {
+ return function(callback) { dbRoutes.addAicSwitch(lrow,res,callback); }
+ }
+
+ // loop for each row and create an array of callbacks for async.parallelLimit
+ // had to create a function above 'createFunction' to get
+ for (var x=0; x<f.length; x++)
+ {
+ funcArray.push( createFunction(f[x],res) );
+ }
+
+ // make db calls in parrallel
+ async.parallelLimit(funcArray, 50, function(err,result){
+
+ if ( err ) {
+ dbRoutes.getAicSwitch(req,res,result,privilegeObj);
+ return;
+ }
+ else {
+ // result array has an entry in it, success entries are blank, figure out
+ // how many are not blank, aka errors.
+ var rowError = 0;
+ for(var i=0;i<result.length;i++){
+ if ( result[i].length > 0 )
+ {
+ rowError++;
+ }
+ }
+
+ var rowsProcessed = f.length - rowError;
+ result.push(rowsProcessed + ' of ' + f.length + ' rows processed.');
+ if ( rowError > 0 )
+ {
+ result = {code:'failure', msg:result};
+ }
+ else
+ {
+ result = {code:'success', msg:result};
+ }
+ dbRoutes.getAicSwitch(req,res,result,privilegeObj);
+ return;
+ }
+ });
+ });
+
+ var stream = fs.createReadStream(req.file.path, "utf8");
+ stream.pipe(parser).pipe(transformer);
+
+
+ } catch(ex) {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file. '+ex);
+ dbRoutes.getAicSwitch(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getAicSwitch(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getAicSwitch(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+} );
+
+// POST
+router.post('/uploadAicAvailZone', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){
+
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname){
+ if (req.file.originalname.size == 0) {
+ dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists) {
+
+ if(exists) {
+
+ var str = req.file.originalname;
+
+ // check for valid filename format
+ var tagpos = str.search("_availabilityzone");
+ var csvpos = str.search(".csv");
+ if(tagpos != 13 || csvpos != 30){
+ msgArray.length = 0;
+ msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_availabilityzone.csv');
+ dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ try {
+ var csv = require('csv');
+
+ // the job of the parser is to convert a CSV file
+ // to a list of rows (array of rows)
+ var parser = csv.parse({
+ columns: function(line) {
+ // By defining this callback, we get handed the
+ // first line of the spreadsheet. Which we'll
+ // ignore and effectively skip this line from processing
+ },
+ skip_empty_lines: true
+ });
+
+ var row = 0;
+ var f = new Array();
+ var transformer = csv.transform(function(data){
+ // this will get row by row data, so for example,
+ //logger.debug(data[0]+','+data[1]+','+data[2]);
+
+ // build an array of rows
+ f[row] = new Array();
+ for ( col=0; col<data.length; col++ )
+ {
+ f[row][col] = data[col];
+ }
+ row++;
+ });
+
+ // called when done with processing the CSV
+ transformer.on("finish", function() {
+
+ var funcArray = new Array();
+
+ function createFunction(lrow,res)
+ {
+ return function(callback) { dbRoutes.addAicAvailZone(lrow,res,callback); }
+ }
+
+ // loop for each row and create an array of callbacks for async.parallelLimit
+ // had to create a function above 'createFunction' to get
+ for (var x=0; x<f.length; x++)
+ {
+ funcArray.push( createFunction(f[x],res) );
+ }
+
+ // make db calls in parrallel
+ async.parallelLimit(funcArray, 50, function(err,result){
+
+ if ( err ) {
+ dbRoutes.getAicAvailZone(req,res,result,privilegeObj);
+ return;
+ }
+ else {
+ // result array has an entry in it, success entries are blank, figure out
+ // how many are not blank, aka errors.
+ var rowError = 0;
+ for(var i=0;i<result.length;i++){
+ if ( result[i].length > 0 )
+ {
+ rowError++;
+ }
+ }
+
+ var rowsProcessed = f.length - rowError;
+ result.push(rowsProcessed + ' of ' + f.length + ' rows processed.');
+ if ( rowError > 0 )
+ {
+ result = {code:'failure', msg:result};
+ }
+ else
+ {
+ result = {code:'success', msg:result};
+ }
+ dbRoutes.getAicAvailZone(req,res,result,privilegeObj);
+ return;
+ }
+ });
+ });
+
+ var stream = fs.createReadStream(req.file.path, "utf8");
+ stream.pipe(parser).pipe(transformer);
+
+
+ } catch(ex) {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file. '+ex);
+ dbRoutes.getAicAvailZone(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getAicAvailZone(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getAicAvailZone(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+} );
+
+// POST
+router.post('/uploadVpePool', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){
+
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname){
+ if (req.file.originalname.size == 0) {
+ dbRoutes.getVpePool(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists) {
+
+ if(exists) {
+
+ var str = req.file.originalname;
+
+ // check for valid filename format
+ var tagpos = str.search("_vpe");
+ var csvpos = str.search(".csv");
+ if(tagpos != 13 || csvpos != 17){
+ msgArray.length = 0;
+ msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_vpe.csv');
+ var resultObj = {code:'failure', msg:msgArray};
+ dbRoutes.getVpePool(req,res,resultObj,privilegeObj);
+ return;
+ }
+
+ try {
+ var csv = require('csv');
+
+ // the job of the parser is to convert a CSV file
+ // to a list of rows (array of rows)
+ var parser = csv.parse({
+ columns: function(line) {
+ // By defining this callback, we get handed the
+ // first line of the spreadsheet. Which we'll
+ // ignore and effectively skip this line from processing
+ },
+ skip_empty_lines: true
+ });
+
+ var row = 0;
+ var f = new Array();
+ var transformer = csv.transform(function(data){
+ // this will get row by row data, so for example,
+ //logger.debug(data[0]+','+data[1]+','+data[2]);
+
+ // build an array of rows
+ f[row] = new Array();
+ for ( col=0; col<data.length; col++ )
+ {
+ f[row][col] = data[col];
+ }
+ row++;
+ });
+
+ // called when done with processing the CSV
+ transformer.on("finish", function() {
+
+ var funcArray = new Array();
+
+ function createFunction(lrow,res)
+ {
+ return function(callback) { dbRoutes.addVpePool(lrow,res,callback); }
+ }
+
+ // loop for each row and create an array of callbacks for async.parallelLimit
+ // had to create a function above 'createFunction' to get
+ for (var x=0; x<f.length; x++)
+ {
+ funcArray.push( createFunction(f[x],res) );
+ }
+
+ // make db calls in parrallel
+ async.parallelLimit(funcArray, 50, function(err,result){
+
+ if ( err ) {
+ dbRoutes.getVpePool(req,res,result,privilegeObj);
+ return;
+ }
+ else {
+ // result array has an entry in it, success entries are blank, figure out
+ // how many are not blank, aka errors.
+ var rowError = 0;
+ for(var i=0;i<result.length;i++){
+ if ( result[i].length > 0 )
+ {
+ rowError++;
+ }
+ }
+
+ var rowsProcessed = f.length - rowError;
+ result.push(rowsProcessed + ' of ' + f.length + ' rows processed.');
+ if ( rowError > 0 )
+ {
+ result = {code:'failure', msg:result};
+ }
+ else
+ {
+ result = {code:'success', msg:result};
+ }
+ dbRoutes.getVpePool(req,res,result,privilegeObj);
+ return;
+ }
+ });
+ });
+
+ var stream = fs.createReadStream(req.file.path, "utf8");
+ stream.pipe(parser).pipe(transformer);
+
+
+ } catch(ex) {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file. '+ex);
+ dbRoutes.getVpePool(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVpePool(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVpePool(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+} );
+
+// POST
+router.post('/uploadVplspePool', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){
+
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname){
+ if (req.file.originalname.size == 0) {
+ dbRoutes.getVplspePool(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists) {
+
+ if(exists) {
+
+ var str = req.file.originalname;
+
+ // check for valid filename format
+ var tagpos = str.search("_vpls");
+ var csvpos = str.search(".csv");
+ if(tagpos != 13 || csvpos != 18){
+ msgArray.length = 0;
+ msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_vpls.csv');
+ dbRoutes.getVplspePool(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ try {
+ var csv = require('csv');
+
+ // the job of the parser is to convert a CSV file
+ // to a list of rows (array of rows)
+ var parser = csv.parse({
+ columns: function(line) {
+ // By defining this callback, we get handed the
+ // first line of the spreadsheet. Which we'll
+ // ignore and effectively skip this line from processing
+ },
+ skip_empty_lines: true
+ });
+
+ var row = 0;
+ var f = new Array();
+ var transformer = csv.transform(function(data){
+ // this will get row by row data, so for example,
+ //logger.debug(data[0]+','+data[1]+','+data[2]);
+
+ // build an array of rows
+ f[row] = new Array();
+ for ( col=0; col<data.length; col++ )
+ {
+ f[row][col] = data[col];
+ }
+ row++;
+ });
+
+ // called when done with processing the CSV
+ transformer.on("finish", function() {
+
+ var funcArray = new Array();
+
+ function createFunction(lrow,res)
+ {
+ return function(callback) { dbRoutes.addVplspePool(lrow,res,callback); }
+ }
+ // loop for each row and create an array of callbacks for async.parallelLimit
+ // had to create a function above 'createFunction' to get
+ for (var x=0; x<f.length; x++)
+ {
+ funcArray.push( createFunction(f[x],res) );
+ }
+
+ // make db calls in parrallel
+ async.parallelLimit(funcArray, 50, function(err,result){
+
+ if ( err ) {
+ dbRoutes.getVplspePool(req,res,result,privilegeObj);
+ return;
+ }
+ else {
+ // result array has an entry in it, success entries are blank, figure out
+ // how many are not blank, aka errors.
+ var rowError = 0;
+ for(var i=0;i<result.length;i++){
+ if ( result[i].length > 0 )
+ {
+ rowError++;
+ }
+ }
+ var rowsProcessed = f.length - rowError;
+ result.push(rowsProcessed + ' of ' + f.length + ' rows processed.');
+ if ( rowError > 0 )
+ {
+ result = {code:'failure', msg:result};
+ }
+ else
+ {
+ result = {code:'success', msg:result};
+ }
+ dbRoutes.getVplspePool(req,res,result,privilegeObj);
+ return;
+ }
+ });
+ });
+
+ var stream = fs.createReadStream(req.file.path, "utf8");
+ stream.pipe(parser).pipe(transformer);
+
+
+ } catch(ex) {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file. '+ex);
+ dbRoutes.getVplspePool(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVplspePool(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVplspePool(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+} );
+
+// POST
+router.post('/uploadServiceHoming', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res)
+{
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname)
+ {
+ if (req.file.originalname.size == 0) {
+ dbRoutes.getServiceHoming(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists)
+ {
+ if(exists)
+ {
+ var str = req.file.originalname;
+
+ // check for valid filename format
+ var csvpos = str.search(".csv");
+ if( (l_.startsWith(str,'aichoming_') != true) || csvpos != 18)
+ {
+ msgArray.length = 0;
+ msgArray.push('Not a valid filename, format must be aichoming_mmddYYYY.csv');
+ //msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_vpls.csv');
+ dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ try
+ {
+ var csv = require('csv');
+
+ // the job of the parser is to convert a CSV file
+ // to a list of rows (array of rows)
+ var parser = csv.parse({
+ columns: function(line) {
+ // By defining this callback, we get handed the
+ // first line of the spreadsheet. Which we'll
+ // ignore and effectively skip this line from processing
+ },
+ skip_empty_lines: true
+ });
+
+ var row = 0;
+ var f = new Array();
+ var csvrows = new Array();
+ var transformer = csv.transform(function(data){
+ // this will get row by row data, so for example,
+ //logger.debug(data[0]+','+data[1]+','+data[2]);
+
+ // build an array of rows
+ f[row] = new Array();
+ for ( col=0; col<data.length; col++ )
+ {
+ f[row][col] = data[col];
+ }
+ row++;
+ });
+
+ // called when done with processing the CSV
+ transformer.on("finish", function()
+ {
+ var funcArray = new Array();
+
+ function createFunction(lrow,res)
+ {
+ return function(callback) { dbRoutes.addServiceHoming(lrow,req,res,callback); }
+ }
+ funcArray.push(function(callback) {
+ dbRoutes.saveServiceHoming(req,res,callback);
+ });
+ // loop for each row and create an array of callbacks for async.parallelLimit
+ // had to create a function above 'createFunction' to get
+ for (var x=0; x<f.length; x++)
+ {
+ funcArray.push( createFunction(f[x],res) );
+ }
+
+ // make db calls in series
+ async.series(funcArray, function(err,result)
+ {
+ if ( err )
+ {
+ result = {code:'failure', msg:result};
+ dbRoutes.getServiceHoming(req,res,result,privilegeObj);
+ return;
+ }
+ else
+ { // result array has an entry in it, success entries are blank, figure out
+ // how many are not blank, aka errors.
+ var rowError = 0;
+ for(var i=0;i<result.length;i++)
+ {
+ if ( result[i].length > 0 )
+ {
+ rowError++;
+ }
+ }
+ var rowsProcessed = f.length - rowError;
+ result.push(rowsProcessed + ' of ' + f.length + ' rows processed.');
+ if ( rowError > 0 )
+ {
+ result = {code:'failure', msg:result};
+ }
+ else
+ {
+ result = {code:'success', msg:result};
+ }
+ dbRoutes.getServiceHoming(req,res,result,privilegeObj);
+ return;
+ }
+ });
+ });
+
+ var stream = fs.createReadStream(req.file.path, "utf8");
+ stream.pipe(parser).pipe(transformer);
+
+
+ } catch(ex) {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file. '+ex);
+ dbRoutes.getServiceHoming(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getServiceHoming(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else
+ {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getServiceHoming(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+} );
+function removeNL(s) {
+ /*
+ ** Remove NewLine, CarriageReturn and Tab characters from a String
+ ** s string to be processed
+ ** returns new string
+ */
+ r = "";
+ for (i=0; i < s.length; i++)
+ {
+ if (s.charAt(i) != '\n' &&
+ s.charAt(i) != '\r' &&
+ s.charAt(i) != '\t')
+ {
+ r += s.charAt(i);
+ }
+ }
+ return r;
+}
+function padLeft(nr, n, str){
+ return Array(n-String(nr).length+1).join(str||'0')+nr;
+}
+
+
+module.exports = router;
diff --git a/admportal/server/router/routes/helpers.js b/admportal/server/router/routes/helpers.js
new file mode 100644
index 00000000..6ac8215f
--- /dev/null
+++ b/admportal/server/router/routes/helpers.js
@@ -0,0 +1,66 @@
+
+var _ = require('lodash');
+var csvtojson = require('csvtojson');
+var async = require('async');
+var uuid = require('node-uuid'); // generate a uuid with "uuid.v1()"
+var path = require('path');
+var fs = require("fs");
+var moment = require('moment');
+
+var helpers = module.exports;
+
+function puts(obj) { console.log(obj); }
+function putd(obj) { console.log(obj); }
+helpers.puts = puts;
+helpers.putd = putd;
+
+
+helpers.readCsv = function(filedir, filename, callback) {
+
+
+ var Converter=csvtojson.Converter;
+ var csvFileName=path.join(filedir,filename);
+ var fileStream=fs.createReadStream(csvFileName);
+ fileStream.on('error', function(err){
+ callback(err, null);
+ });
+ var param={noheader:true, checkType:false};
+ var csvConverter=new Converter(param);
+ csvConverter.on("end_parsed",function(jsonObj){
+ var returnValue = jsonObj;
+ callback(null, returnValue);
+ });
+ fileStream.on('error', function(err) {
+ putd(err);
+ callback(err,"");
+ });
+ fileStream.pipe(csvConverter);
+}
+
+helpers.getParam = function(csv, matchField, matchValue, returnField) {
+ dataRow=_.find(csv, matchField, matchValue);
+ dataValue=dataRow[returnField];
+ return dataValue;
+}
+
+helpers.writeOutput = function(req, filename, jsonOutput, callback) {
+ try {
+ fs.writeFileSync(filename, jsonOutput);
+ }
+ catch(err){
+ callback(err);
+ }
+}
+
+helpers.getFileName = function(req, defFilename) {
+
+ var fileObj = null;
+ for (var x=0; x < req.files.length; x++)
+ {
+ var fileObj = req.files[x];
+ if ( fileObj.filename.indexOf(defFilename) != -1 ){
+ return fileObj.filename;
+ }
+ }
+ return null;
+}
diff --git a/admportal/server/router/routes/mobility.js b/admportal/server/router/routes/mobility.js
new file mode 100644
index 00000000..1c45452e
--- /dev/null
+++ b/admportal/server/router/routes/mobility.js
@@ -0,0 +1,1339 @@
+var express = require('express');
+var router = express.Router();
+var exec = require('child_process').exec;
+var util = require('util');
+var fs = require('fs.extra');
+var dbRoutes = require('./dbRoutes');
+var csp = require('./csp');
+var multer = require('multer');
+var bodyParser = require('body-parser');
+var sax = require('sax'),strict=true,parser = sax.parser(strict);
+var async = require('async');
+var l_ = require('lodash');
+var dateFormat = require('dateformat');
+var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json');
+
+
+// pass host, username and password to ODL
+// target host for ODL request
+var username = properties.odlUser;
+var password = properties.odlPasswd;
+var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
+var host = properties.odlHost;
+var port = properties.odlPort;
+
+var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/json'};
+var options = {
+ host : host,
+ headers : header,
+ port : port,
+ rejectUnauthorized:false,
+ strictSSL: false
+};
+
+// Connection to OpenDaylight
+Odl = require('./Odl');
+
+// used for file upload button, retain original file name
+//router.use(bodyParser());
+//router.use(bodyParser.urlencoded({
+ //extended: true
+//}));
+
+//var upload = multer({ dest: process.cwd() + '/uploads/', rename: function(fieldname,filename){ return filename; } });
+
+// multer 1.1
+var storage = multer.diskStorage({
+ destination: function (req, file, cb) {
+ cb(null, process.cwd() + '/uploads/')
+ },
+ filename: function (req, file, cb) {
+ cb(null, file.originalname )
+ }
+});
+
+var upload = multer({
+ storage: storage
+});
+
+
+
+
+// GET
+router.get('/getVnfData', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getVnfData(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getVmNetworks', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getVmNetworks(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getVnfProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getVnfProfile(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getVnfNetworks', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getVnfNetworks(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+router.get('/getVmProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getVmProfile(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+////////
+router.get('/getVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.getVnfNetworkData(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+
+router.get('/viewVnfNetworkData', csp.checkAuth, function(req,res)
+{
+ var privilegeObj = req.session.loggedInAdmin;
+ var resp_msg = '';
+ var network_name = req.query.network_name;
+ var network_type = req.query.network_type;
+ var tasks = [];
+
+ tasks.push(function(callback){
+ Odl.GetPreloadVnfData('/restconf/config/VNF-API:preload-vnfs/vnf-preload-list/'
+ + encodeURIComponent(network_name) + '/' + encodeURIComponent(network_type) + '/', options,res,callback);
+
+ });
+ async.series(tasks, function(err,result)
+ {
+ var msgArray = new Array();
+ if(err){
+ resp_msg = err;
+ res.render('mobility/displayVnfNetworkData', {result:{code:'failure', msg:resp_msg}, header:process.env.MAIN_MENU});
+ return;
+ }
+ else{
+ resp_msg = JSON.stringify(JSON.parse(result[0],null,4));
+ res.render('mobility/displayVnfNetworkData', {result:{code:'success', msg:JSON.parse(result[0])}, header:process.env.MAIN_MENU});
+ return;
+ }
+ });
+
+});
+
+router.get('/viewVnfData', csp.checkAuth, function(req,res)
+{
+ var privilegeObj = req.session.loggedInAdmin;
+ var resp_msg = '';
+ var vnf_name = req.query.vnf_name;
+ var vnf_type = req.query.vnf_type;
+ var tasks = [];
+
+ tasks.push(function(callback){
+ Odl.GetPreloadVnfData('/restconf/config/VNF-API:preload-vnfs/vnf-preload-list/'
+ + encodeURIComponent(vnf_name) + '/' + encodeURIComponent(vnf_type) + '/', options,res,callback);
+
+ });
+ async.series(tasks, function(err,result)
+ {
+ var msgArray = new Array();
+ if(err){
+ resp_msg = err;
+ res.render('mobility/displayVnfData', {result:{code:'failure', msg:resp_msg}, header:process.env.MAIN_MENU});
+ return;
+ }
+ else{
+ resp_msg = JSON.stringify(JSON.parse(result[0],null,4));
+ res.render('mobility/displayVnfData', {result:{code:'success', msg:JSON.parse(result[0])}, header:process.env.MAIN_MENU});
+ return;
+ }
+ });
+
+});
+
+router.get('/loadVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, function(req,res)
+{
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var msgArray = new Array();
+
+ if ( req.query.status != 'pending' )
+ {
+ msgArray.push("Upload Status must be in 'pending' state.");
+ dbRoutes.getVnfNetworkData(req,res, {code:'failure', msg:msgArray}, privilegeObj);
+ return;
+ }
+
+ // build request-id
+ var now = new Date();
+ var df = dateFormat(now,"isoDateTime");
+ var rnum = Math.floor((Math.random() * 9999) +1);
+ var svc_req_id = req.query.id + "-" + df + "-" + rnum;
+
+ var tasks = [];
+
+ // first get the contents of the file from the db
+ tasks.push(function(callback){
+ dbRoutes.getVnfPreloadData(req,res,"PRE_LOAD_VNF_NETWORK_DATA",callback);
+ });
+
+ // then format the request and send it using the arg1 parameter
+ // which is the contents of the file returned from the previous function
+ // call in the tasks array
+ tasks.push(function(arg1,callback){
+
+ var s_file = JSON.stringify(arg1);
+
+ // remove the last two braces, going to add the headers there
+ // will add them back later.
+ s_file = s_file.substring(0, (s_file.length-2));
+
+ // add the request-information header
+ s_file = s_file.concat(',"request-information": {"request-action": "PreloadNetworkRequest"}');
+
+ // add the sdnc-request-header
+ s_file = s_file.concat(',"sdnc-request-header": {"svc-request-id":"');
+ s_file = s_file.concat(svc_req_id);
+ s_file = s_file.concat('","svc-action": "reserve"}');
+
+ // add the two curly braces at the end that we stripped off
+ s_file = s_file.concat('}}');
+
+ Odl.Post('/restconf/operations/VNF-API:preload-network-topology-operation',
+ options,s_file,res,callback);
+ });
+
+ // if successful then update the status
+ tasks.push(function(arg1,callback){
+ dbRoutes.executeSQL("UPDATE PRE_LOAD_VNF_NETWORK_DATA SET status='uploaded',svc_request_id='"
+ + svc_req_id + "',svc_action='reserve' WHERE id="+req.query.id,req,res,callback);
+ });
+
+ // use the waterfall method of making calls
+ async.waterfall(tasks, function(err,result)
+ {
+ var msgArray = new Array();
+ if(err){
+ msgArray.push("Error posting pre-load data to ODL: "+err);
+ dbRoutes.getVnfNetworkData(req,res, {code:'failure', msg:msgArray}, privilegeObj);
+ return;
+ }
+ else{
+ msgArray.push('Successfully loaded VNF pre-loaded data.');
+ dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+router.get('/loadVnfData', csp.checkAuth, dbRoutes.checkDB, function(req,res)
+{
+ var privilegeObj = req.session.loggedInAdmin;
+ var full_path_file_name = process.cwd() + "/uploads/" + req.query.filename
+ var msgArray = new Array();
+
+ if ( req.query.status != 'pending' )
+ {
+ msgArray.push("Upload Status must be in 'pending' state.");
+ dbRoutes.getVnfData(req,res, {code:'failure', msg:msgArray}, privilegeObj);
+ return;
+ }
+
+ // build request-id
+ var now = new Date();
+ var df = dateFormat(now,"isoDateTime");
+ var rnum = Math.floor((Math.random() * 9999) +1);
+ var svc_req_id = req.query.id + "-" + df + "-" + rnum;
+
+ var tasks = [];
+
+ // first get the contents of the file from the db
+ tasks.push(function(callback){
+ dbRoutes.getVnfPreloadData(req,res,"PRE_LOAD_VNF_DATA",callback);
+ });
+
+ // then format the request and send it using the arg1 parameter
+ // which is the contents of the file returned from the previous function
+ // call in the tasks array
+ tasks.push(function(arg1,callback){
+
+ var s1_file = JSON.stringify(arg1);
+ var s_file = decodeURI(s1_file);
+
+
+ // remove the last two braces, going to add the headers there
+ // will add them back later.
+ s_file = s_file.substring(0, (s_file.length-2));
+
+ // add the request-information header
+ s_file = s_file.concat(',"request-information": {"request-action": "PreloadVNFRequest"}');
+
+ // add the sdnc-request-header
+ s_file = s_file.concat(',"sdnc-request-header": {"svc-request-id":"');
+ s_file = s_file.concat(svc_req_id);
+ s_file = s_file.concat('","svc-action": "reserve"}');
+
+ // add the two curly braces at the end that we stripped off
+ s_file = s_file.concat('}}');
+
+ Odl.Post('/restconf/operations/VNF-API:preload-vnf-topology-operation',
+ options,s_file,res,callback);
+ });
+
+ // if successful then update the status
+ tasks.push(function(arg1,callback){
+ dbRoutes.executeSQL("UPDATE PRE_LOAD_VNF_DATA SET status='uploaded',svc_request_id='"
+ + svc_req_id + "',svc_action='reserve' WHERE id="+req.query.id,req,res,callback);
+ });
+
+ // use the waterfall method of making calls
+ async.waterfall(tasks, function(err,result)
+ {
+ var msgArray = new Array();
+ if(err){
+ msgArray.push("Error posting pre-load data to ODL: "+err);
+ dbRoutes.getVnfData(req,res, {code:'failure', msg:msgArray}, privilegeObj);
+ return;
+ }
+ else{
+ msgArray.push('Successfully loaded VNF pre-loaded data.');
+ dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+router.get('/deleteVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ var sql = 'DELETE FROM PRE_LOAD_VNF_NETWORK_DATA WHERE id=' + req.query.id;
+
+ // if status is pending, then we do not have to call
+ // ODL, just remove from db
+ if (req.query.status == 'pending'){
+ tasks.push(function(callback) {
+ dbRoutes.executeSQL(sql,req,res,callback);
+ });
+ } else {
+ // format the request to ODL
+ var inputString = '{"input":{"network-topology-information":{"network-topology-identifier":{"service-type":"SDN-MOBILITY","network-name": "';
+ inputString = inputString.concat(req.query.network_name);
+ inputString = inputString.concat('","network-type":"');
+ inputString = inputString.concat(req.query.network_type);
+ inputString = inputString.concat('"}},');
+
+ // add the request-information header
+ inputString = inputString.concat('"request-information": {"request-action": "DeletePreloadNetworkRequest"},');
+
+ // add the sdnc-request-header
+ inputString = inputString.concat('"sdnc-request-header": {"svc-request-id":"');
+ inputString = inputString.concat(req.query.svc_request_id);
+ inputString = inputString.concat('","svc-action": "delete"}}}');
+
+ tasks.push(function(callback) {
+ Odl.Post('/restconf/operations/VNF-API:preload-network-topology-operation',
+ options,inputString,res,callback);
+ });
+ tasks.push(function(callback) {
+ dbRoutes.executeSQL(sql,req,res,callback);
+ });
+ }
+ async.series(tasks, function(err,result){
+
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from PRE_LOAD_VNF_NETWORK_DATA table and ODL.');
+ dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+router.get('/deleteVnfData', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ var sql = 'DELETE FROM PRE_LOAD_VNF_DATA WHERE id=' + req.query.id;
+
+ // if status is pending, then we do not have to call
+ // ODL, just remove from db
+ if (req.query.status == 'pending'){
+ tasks.push(function(callback) {
+ dbRoutes.executeSQL(sql,req,res,callback);
+ });
+ } else {
+ var inputString = '{"input":{"vnf-topology-information":{"vnf-topology-identifier":{"service-type":"SDN-MOBILITY","vnf-name": "';
+ inputString = inputString.concat(req.query.vnf_name);
+ inputString = inputString.concat('","vnf-type":"');
+ inputString = inputString.concat(req.query.vnf_type);
+ inputString = inputString.concat('"}},');
+
+ // add the request-information header
+ inputString = inputString.concat('"request-information": {"request-action": "DeletePreloadVNFRequest"},');
+
+ // add the request-information header
+ //inputString = inputString.concat('"request-information": {"request-id": "259c0f93-23cf-46ad-84dc-162ea234fff1",');
+ //inputString = inputString.concat('"source": "ADMINPORTAL",');
+ //inputString = inputString.concat('"order-version": "1",');
+ //inputString = inputString.concat('"notification-url": "notused-this would be infrastructure portal",');
+ //inputString = inputString.concat('"order-number": "1",');
+ //inputString = inputString.concat('"request-action": "DeletePreloadVNFRequest"},');
+
+ // add the sdnc-request-header
+ inputString = inputString.concat('"sdnc-request-header": {"svc-request-id":"');
+ inputString = inputString.concat(req.query.svc_request_id);
+ inputString = inputString.concat('","svc-action": "delete"}}}');
+
+ //inputString = inputString.concat('"sdnc-request-header":{');
+ //inputString = inputString.concat('"svc-request-id": "2015-01-15T14:34:54.st1101a",');
+ //inputString = inputString.concat('"svc-notification-url": "not used",');
+ //inputString = inputString.concat('"svc-action": "delete"}}}');
+
+ tasks.push(function(callback) {
+ Odl.Post('/restconf/operations/VNF-API:preload-vnf-topology-operation',
+ options,inputString,res,callback);
+ });
+ tasks.push(function(callback) {
+ dbRoutes.executeSQL(sql,req,res,callback);
+ });
+ }
+ async.series(tasks, function(err,result){
+
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from PRE_LOAD_VNF_DATA table and ODL.');
+ dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+router.get('/deleteVmProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ var sql = '';
+
+ sql = "DELETE FROM VM_PROFILE WHERE vnf_type='" + req.query.vnf_type + "'"
+ + " AND vm_type='" + req.query.vm_type + "'";
+
+ tasks.push(function(callback) {
+ dbRoutes.executeSQL(sql,req,res,callback);
+ });
+ async.series(tasks, function(err,result)
+ {
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVmProfile(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from VM_PROFILE table.');
+ dbRoutes.getVmProfile(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+router.get('/deleteVnfNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ var sql = '';
+
+ sql = "DELETE FROM VNF_NETWORKS WHERE vnf_type='" + req.query.vnf_type + "'"
+ + " AND network_role='" + req.query.network_role + "'";
+
+ tasks.push(function(callback) {
+ dbRoutes.executeSQL(sql,req,res,callback);
+ });
+ async.series(tasks, function(err,result)
+ {
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVnfNetwork(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from VNF_NETWORKS table.');
+ dbRoutes.getVnfNetworks(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+router.get('/deleteVnfProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ var sql = '';
+
+ sql = "DELETE FROM VNF_PROFILE WHERE vnf_type='" + req.query.vnf_type + "'";
+
+ tasks.push(function(callback) {
+ dbRoutes.executeSQL(sql,req,res,callback);
+ });
+ async.series(tasks, function(err,result)
+ {
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVnfProfile(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from VNF_PROFILE table.');
+ dbRoutes.getVnfProfile(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+router.get('/deleteVmNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ var sql = '';
+
+ sql = "DELETE FROM VM_NETWORKS WHERE vnf_type='" + req.query.vnf_type
+ + "' AND vm_type='" + req.query.vm_type + "' AND network_role='"
+ + req.query.network_role + "'";
+
+ tasks.push(function(callback) {
+ dbRoutes.executeSQL(sql,req,res,callback);
+ });
+ async.series(tasks, function(err,result)
+ {
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVmNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from VM_NETWORKS table.');
+ dbRoutes.getVmNetworks(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+// POST
+router.post('/addVmProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ var sql;
+
+
+ if ( req.body.nf_vm_count.length > 0 )
+ {
+ sql = "INSERT INTO VM_PROFILE (vnf_type,vm_type,vm_count) VALUES ("
+ + "'" + req.body.nf_vnf_type + "',"
+ + "'" + req.body.nf_vm_type + "',"
+ + req.body.nf_vm_count + ")";
+ }
+ else
+ {
+ sql = "INSERT INTO VM_PROFILE (vnf_type,vm_type) VALUES ("
+ + "'" + req.body.nf_vnf_type + "',"
+ + "'" + req.body.nf_vm_type + "')";
+ }
+
+
+ console.log("SQL: " + sql);
+
+ tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVmProfile(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully added VM Profile');
+ dbRoutes.getVmProfile(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+
+router.post('/addVnfNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+
+ var sql = "INSERT INTO VNF_NETWORKS (vnf_type,network_role) VALUES ("
+ + "'" + req.body.nf_vnf_type + "',"
+ + "'" + req.body.nf_network_role + "')";
+
+ console.log("SQL: " + sql);
+
+ tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVnfNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully added VNF Network');
+ dbRoutes.getVnfNetworks(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+router.post('/addVnfProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ var sql;
+
+ sql = "INSERT INTO VNF_PROFILE (vnf_type,availability_zone_count,equipment_role) VALUES ("
+ + "'" + req.body.nf_vnf_type + "',"
+ + req.body.nf_availability_zone_count
+ + ",'" + req.body.nf_equipment_role + "')";
+
+console.log(sql);
+
+ tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } );
+ async.series(tasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVnfProfile(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully added VNF Profile');
+ dbRoutes.getVnfProfile(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+router.post('/addVmNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ var msgArray = new Array();
+
+ // convert true|false to 1|0
+ var assign_ips = (req.body.nf_assign_ips == 'true') ? 1 : 0;
+ var assign_macs = (req.body.nf_assign_macs == 'true') ? 1 : 0;
+ var assign_floating_ip = (req.body.nf_assign_floating_ip == 'true') ? 1 : 0;
+
+
+ if ((req.body.nf_assign_ips == 'true' &&
+ (typeof req.body.nf_ip_count == 'undefined' || req.body.nf_ip_count.length <=0)))
+ {
+ msgArray.push("If assign_ips equals 'true', ip_count must be populated with a number.");
+ dbRoutes.getVmNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+
+
+ if ( req.body.nf_ip_count.length >0 )
+ {
+ var sql = "INSERT INTO VM_NETWORKS (vnf_type,vm_type,network_role,ip_count,assign_ips,assign_macs,assign_floating_ip) VALUES ("
+ + "'" + req.body.nf_vnf_type + "',"
+ + "'" + req.body.nf_vm_type + "',"
+ + "'" + req.body.nf_network_role + "',"
+ + req.body.nf_ip_count + ","
+ + assign_ips + ","
+ + assign_macs + ","
+ + assign_floating_ip + ")";
+ }
+ else
+ {
+ var sql = "INSERT INTO VM_NETWORKS (vnf_type,vm_type,network_role,assign_ips,assign_macs,assign_floating_ip) VALUES ("
+ + "'" + req.body.nf_vnf_type + "',"
+ + "'" + req.body.nf_vm_type + "',"
+ + "'" + req.body.nf_network_role + "',"
+ + assign_ips + ","
+ + assign_macs + ","
+ + assign_floating_ip + ")";
+ }
+
+ tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } );
+ async.series(tasks, function(err,result){
+ msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVmNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully added VM Network');
+ var message = '';
+ if (req.body.nf_ip_count.length >0)
+ {
+ message = req.body.nf_vnf_type
+ + ',' + req.body.nf_vm_type
+ + ',' + req.body.nf_network_role
+ + ',' + req.body.nf_ip_count
+ + ',' + req.body.nf_assign_ips
+ + ',' + req.body.nf_assign_macs
+ + ',' + req.body.nf_assign_floating_ip;
+ }
+ else
+ {
+ message = req.body.nf_vnf_type
+ + ',' + req.body.nf_vm_type
+ + ',' + req.body.nf_network_role
+ + ',' + req.body.nf_assign_ips
+ + ',' + req.body.nf_assign_macs
+ + ',' + req.body.nf_assign_floating_ip;
+ }
+ dbRoutes.getVmNetworks(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+});
+
+// POST
+router.post('/uploadVnfData', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res)
+{
+console.log('filename:'+ JSON.stringify(req.file.originalname));
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname)
+ {
+ if (req.file.originalname.size == 0) {
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists)
+ {
+ if(exists)
+ {
+ var str = req.file.originalname;
+ var content;
+ var enc_content;
+
+ try{
+ content = fs.readFileSync(req.file.path);
+ enc_content = encodeURI(content);
+
+
+ var sql = "INSERT INTO PRE_LOAD_VNF_DATA "
+ + "(filename,preload_data) VALUES ("
+ + "'"+ str + "'," + "'" + enc_content + "')";
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } );
+ async.series(tasks, function(err,result)
+ {
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully uploaded ' + str);
+ dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ catch(error){
+ fs.removeSync(req.file.path); // remove bad file that was uploaded
+ console.error("There was an error reading the file '"+str+"'. Error: " + error);
+ msgArray.push("There was an error reading the file '"+str+"'. Error: " + error);
+ dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVnfData(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else
+ {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVnfData(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+} );
+
+router.post('/uploadVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res)
+{
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname)
+ {
+ if (req.file.originalname.size == 0) {
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists)
+ {
+ if(exists)
+ {
+ var str = req.file.originalname;
+ var content;
+ var enc_content;
+
+ try{
+ content = fs.readFileSync(req.file.path);
+ enc_content = encodeURI(content);
+
+ var sql = "INSERT INTO PRE_LOAD_VNF_NETWORK_DATA "
+ + "(filename,preload_data) VALUES ("
+ + "'"+ str + "'," + "'" + enc_content + "')";
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } );
+ async.series(tasks, function(err,result)
+ {
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ msgArray.push('Successfully uploaded ' + str);
+ dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ catch(error){
+ fs.removeSync(req.file.path); // remove bad file that was uploaded
+ msgArray.push("There was an error reading the file '"+str+"'. Error: " + error);
+ dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVnfNetworkData(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else
+ {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVnfNetworkData(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+} );
+
+
+router.post('/uploadVmNetworks', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){
+
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname){
+ if (req.file.originalname.size == 0) {
+ dbRoutes.getVmNetworks(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists) {
+
+ if(exists) {
+
+ var str = req.file.originalname;
+
+ try {
+ var csv = require('csv');
+
+ // the job of the parser is to convert a CSV file
+ // to a list of rows (array of rows)
+ var parser = csv.parse({
+ columns: function(line) {
+ // By defining this callback, we get handed the
+ // first line of the spreadsheet. Which we'll
+ // ignore and effectively skip this line from processing
+ },
+ skip_empty_lines: true
+ });
+
+ var row = 0;
+ var f = new Array();
+ var transformer = csv.transform(function(data){
+ // this will get row by row data, so for example,
+ //logger.debug(data[0]+','+data[1]+','+data[2]);
+
+ // build an array of rows
+ f[row] = new Array();
+ for ( col=0; col<data.length; col++ )
+ {
+ f[row][col] = data[col];
+ }
+ row++;
+ });
+
+ // called when done with processing the CSV
+ transformer.on("finish", function() {
+
+ var funcArray = new Array();
+
+ function createFunction(lrow,res)
+ {
+ return function(callback) { dbRoutes.addVmNetwork(lrow,res,callback); }
+ }
+ // loop for each row and create an array of callbacks for async.parallelLimit
+ // had to create a function above 'createFunction' to get
+ for (var x=0; x<f.length; x++)
+ {
+ funcArray.push( createFunction(f[x],res) );
+ }
+
+ // make db calls in parrallel
+ async.parallelLimit(funcArray, 50, function(err,result){
+
+ if ( err ) {
+ dbRoutes.getVmNetworks(req,res,result,privilegeObj);
+ return;
+ }
+ else {
+ // result array has an entry in it, success entries are blank, figure out
+ // how many are not blank, aka errors.
+ var rowError = 0;
+ for(var i=0;i<result.length;i++){
+ if ( result[i].length > 0 )
+ {
+ rowError++;
+ }
+ }
+ var rowsProcessed = f.length - rowError;
+ result.push(rowsProcessed + ' of ' + f.length + ' rows processed.');
+ if ( rowError > 0 )
+ {
+ result = {code:'failure', msg:result};
+ }
+ else
+ {
+ result = {code:'success', msg:result};
+ }
+ dbRoutes.getVmNetworks(req,res,result,privilegeObj);
+ return;
+ }
+ });
+ });
+
+ var stream = fs.createReadStream(req.file.path, "utf8");
+ stream.pipe(parser).pipe(transformer);
+
+ } catch(ex) {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file. '+ex);
+ dbRoutes.getVmNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVmNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVmNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+
+} );
+
+router.post('/uploadVnfProfile', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){
+
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname)
+ {
+ if (req.file.originalname.size == 0) {
+ dbRoutes.getVnfProfile(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists) {
+
+ if(exists) {
+
+ var str = req.file.originalname;
+
+ try {
+ var csv = require('csv');
+
+ // the job of the parser is to convert a CSV file
+ // to a list of rows (array of rows)
+ var parser = csv.parse({
+ columns: function(line) {
+ // By defining this callback, we get handed the
+ // first line of the spreadsheet. Which we'll
+ // ignore and effectively skip this line from processing
+ },
+ skip_empty_lines: true
+ });
+
+ var row = 0;
+ var f = new Array();
+ var transformer = csv.transform(function(data){
+ // this will get row by row data, so for example,
+ //logger.debug(data[0]+','+data[1]+','+data[2]);
+
+ // build an array of rows
+ f[row] = new Array();
+ for ( col=0; col<data.length; col++ )
+ {
+ f[row][col] = data[col];
+ }
+ row++;
+ });
+
+ // called when done with processing the CSV
+ transformer.on("finish", function() {
+
+ var funcArray = new Array();
+
+ function createFunction(lrow,res)
+ {
+ return function(callback) { dbRoutes.addVnfProfile(lrow,res,callback); }
+ }
+ // loop for each row and create an array of callbacks for async.parallelLimit
+ // had to create a function above 'createFunction' to get
+ for (var x=0; x<f.length; x++)
+ {
+ funcArray.push( createFunction(f[x],res) );
+ }
+
+ // make db calls in parrallel
+ async.series(funcArray, function(err,result){
+
+ if ( err ) {
+ dbRoutes.getVnfProfile(req,res,result,privilegeObj);
+ return;
+ }
+ else {
+ // result array has an entry in it, success entries are blank, figure out
+ // how many are not blank, aka errors.
+ var rowError = 0;
+ for(var i=0;i<result.length;i++){
+ if ( result[i].length > 0 )
+ {
+ rowError++;
+ }
+ }
+console.log('rowError='+rowError);
+ var rowsProcessed = f.length - rowError;
+console.log('rowsProcessed='+rowsProcessed);
+ result.push(rowsProcessed + ' of ' + f.length + ' rows processed.');
+ if ( rowError > 0 )
+ {
+ result = {code:'failure', msg:result};
+ }
+ else
+ {
+ result = {code:'success', msg:result};
+ }
+console.log('result='+JSON.stringify(result));
+ dbRoutes.getVnfProfile(req,res,result,privilegeObj);
+ return;
+ }
+ });
+ });
+
+ var stream = fs.createReadStream(req.file.path, "utf8");
+ stream.pipe(parser).pipe(transformer);
+
+ } catch(ex) {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file. '+ex);
+ console.error('There was an error uploading the file. '+ex);
+ dbRoutes.getVnfProfile(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVnfProfile(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVnfProfile(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+} );
+
+
+router.post('/uploadVnfNetworks', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){
+
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname)
+ {
+ if (req.file.originalname.size == 0) {
+ dbRoutes.getVnfProfile(req,res,
+ {code:'failure', msg:'There was an error uploading the file, please try again.'},
+ privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists) {
+
+ if(exists) {
+
+ var str = req.file.originalname;
+
+ try {
+ var csv = require('csv');
+
+ // the job of the parser is to convert a CSV file
+ // to a list of rows (array of rows)
+ var parser = csv.parse({
+ columns: function(line) {
+ // By defining this callback, we get handed the
+ // first line of the spreadsheet. Which we'll
+ // ignore and effectively skip this line from processing
+ },
+ skip_empty_lines: true
+ });
+
+ var row = 0;
+ var f = new Array();
+ var transformer = csv.transform(function(data){
+ // this will get row by row data, so for example,
+ //logger.debug(data[0]+','+data[1]+','+data[2]);
+
+ // build an array of rows
+ f[row] = new Array();
+ for ( col=0; col<data.length; col++ )
+ {
+ f[row][col] = data[col];
+ }
+ row++;
+ });
+
+ // called when done with processing the CSV
+ transformer.on("finish", function() {
+
+ var funcArray = new Array();
+
+ function createFunction(lrow,res)
+ {
+ return function(callback) { dbRoutes.addVnfNetwork(lrow,res,callback); }
+ }
+ // loop for each row and create an array of callbacks for async.parallelLimit
+ // had to create a function above 'createFunction' to get
+ for (var x=0; x<f.length; x++)
+ {
+ funcArray.push( createFunction(f[x],res) );
+ }
+
+ // make db calls in parrallel
+ async.series(funcArray, function(err,result){
+
+ if ( err ) {
+ dbRoutes.getVnfNetworks(req,res,result,privilegeObj);
+ return;
+ }
+ else {
+ // result array has an entry in it, success entries are blank, figure out
+ // how many are not blank, aka errors.
+ var rowError = 0;
+ for(var i=0;i<result.length;i++){
+ if ( result[i].length > 0 )
+ {
+ rowError++;
+ }
+ }
+ var rowsProcessed = f.length - rowError;
+ result.push(rowsProcessed + ' of ' + f.length + ' rows processed.');
+ if ( rowError > 0 )
+ {
+ result = {code:'failure', msg:result};
+ }
+ else
+ {
+ result = {code:'success', msg:result};
+ }
+ dbRoutes.getVnfNetworks(req,res,result,privilegeObj);
+ return;
+ }
+ });
+ });
+
+ var stream = fs.createReadStream(req.file.path, "utf8");
+ stream.pipe(parser).pipe(transformer);
+
+ } catch(ex) {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file. '+ex);
+ dbRoutes.getVnfNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVnfNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVnfNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+} );
+
+router.post('/uploadVmProfile', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){
+
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ if(req.file.originalname)
+ {
+ if (req.file.originalname.size == 0) {
+ dbRoutes.getVmProfile(req,res,
+ {code:'failure', msg:'There was an error uploading the file, please try again.'},
+ privilegeObj);
+ return;
+ }
+ fs.exists(req.file.path, function(exists) {
+
+ if(exists) {
+
+ var str = req.file.originalname;
+
+ try {
+ var csv = require('csv');
+
+ // the job of the parser is to convert a CSV file
+ // to a list of rows (array of rows)
+ var parser = csv.parse({
+ columns: function(line) {
+ // By defining this callback, we get handed the
+ // first line of the spreadsheet. Which we'll
+ // ignore and effectively skip this line from processing
+ },
+ skip_empty_lines: true
+ });
+
+ var row = 0;
+ var f = new Array();
+ var transformer = csv.transform(function(data){
+ // this will get row by row data, so for example,
+ //logger.debug(data[0]+','+data[1]+','+data[2]);
+
+ // build an array of rows
+ f[row] = new Array();
+ for ( col=0; col<data.length; col++ )
+ {
+ f[row][col] = data[col];
+ }
+ row++;
+ });
+
+ // called when done with processing the CSV
+ transformer.on("finish", function() {
+
+ var funcArray = new Array();
+
+ function createFunction(lrow,res)
+ {
+ return function(callback) { dbRoutes.addVmProfile(lrow,res,callback); }
+ }
+ // loop for each row and create an array of callbacks for async.parallelLimit
+ // had to create a function above 'createFunction' to get
+ for (var x=0; x<f.length; x++)
+ {
+ funcArray.push( createFunction(f[x],res) );
+ }
+
+ // make db calls in parrallel
+ async.series(funcArray, function(err,result){
+
+ if ( err ) {
+ dbRoutes.getVmProfile(req,res,result,privilegeObj);
+ return;
+ }
+ else {
+ // result array has an entry in it, success entries are blank, figure out
+ // how many are not blank, aka errors.
+ var rowError = 0;
+ for(var i=0;i<result.length;i++){
+ if ( result[i].length > 0 )
+ {
+ rowError++;
+ }
+ }
+ var rowsProcessed = f.length - rowError;
+ result.push(rowsProcessed + ' of ' + f.length + ' rows processed.');
+ if ( rowError > 0 )
+ {
+ result = {code:'failure', msg:result};
+ }
+ else
+ {
+ result = {code:'success', msg:result};
+ }
+ dbRoutes.getVmProfile(req,res,result,privilegeObj);
+ return;
+ }
+ });
+ });
+
+ var stream = fs.createReadStream(req.file.path, "utf8");
+ stream.pipe(parser).pipe(transformer);
+
+ } catch(ex) {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file. '+ex);
+ dbRoutes.getVmProfile(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ } else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVmProfile(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+ }
+ else {
+ msgArray.length = 0;
+ msgArray.push('There was an error uploading the file.');
+ dbRoutes.getVmProfile(req,res,{code:'danger', msg:msgArray},privilegeObj);
+ return;
+ }
+} );
+
+module.exports = router;
diff --git a/admportal/server/router/routes/network.js b/admportal/server/router/routes/network.js
new file mode 100644
index 00000000..c64beae2
--- /dev/null
+++ b/admportal/server/router/routes/network.js
@@ -0,0 +1,400 @@
+
+// Helper functions for processing a NETWORK worksheet
+
+var helpers = require('./helpers.js');
+var _ = require('lodash');
+var csvtojson = require('csvtojson');
+var async = require('async');
+var uuid = require('node-uuid'); // generate a uuid with "uuid.v1()"
+var path = require('path');
+var fs = require("fs");
+var moment = require("moment");
+
+var network = module.exports;
+var getParam = helpers.getParam;
+
+var indir;
+var csvGeneral, csvSubnets, csvVpnBindings, csvPolicies, csvNetRoutes;
+var rawJson={}
+var finalJson={};
+var platform;
+var req,res;
+var preloadVersion; // 1607, 1610, etc...
+
+puts = helpers.puts;
+putd = helpers.putd;
+
+network.go = function(lreq,lres,cb,dir) {
+ puts("Processing NETWORK workbook");
+ req = lreq;
+ res = lres;
+ callback = cb;
+ if (dir!="") {
+ platform="pc";
+ indir=dir;
+ } else {
+ platform="portal";
+ indir=process.cwd() + "/uploads/";
+ }
+ doGeneral();
+}
+
+// READ WORKSHEET: GENERAL
+
+function doGeneral() {
+ puts("Reading General worksheet");
+ var csvFilename="General.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotGeneral);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotGeneral(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('General.csv file is missing from upload.');
+ return;
+ }
+ csvGeneral = jsonObj;
+ puts("\nRead this: ");
+ putd(csvGeneral);
+ puts("\n");
+ doSubnets();
+}
+
+// READ WORKSHEET: SUBNETS
+
+function doSubnets() {
+ puts("Reading Subnets worksheet");
+ var csvFilename="Subnets.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotSubnets);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotSubnets(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Subnets.csv file is missing from upload.');
+ return;
+ }
+ csvSubnets = jsonObj;
+ csvSubnets = _.reject(csvSubnets, 'field2', 'Subnets');
+ csvSubnets = _.reject(csvSubnets, 'field2', 'start-address');
+ csvSubnets = _.reject(csvSubnets, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvSubnets);
+ puts("\n");
+ doVpnBindings();
+}
+
+// READ WORKSHEET: VPN-BINDINGS
+
+function doVpnBindings() {
+ puts("Reading VPN-Bindings worksheet");
+ var csvFilename="VPN-Bindings.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVpnBindings);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVpnBindings(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VPN-Bindings.csv file is missing from upload.');
+ return;
+ }
+ csvVpnBindings = jsonObj;
+ csvVpnBindings = _.reject(csvVpnBindings, 'field2', 'VPN-Bindings');
+ csvVpnBindings = _.reject(csvVpnBindings, 'field2', 'vpn-binding-id');
+ csvVpnBindings = _.reject(csvVpnBindings, function(o) { return (_.trim(o.field2)=="") && (_.trim(o.field3)==""); } );
+ puts("\nRead this: ");
+ putd(csvVpnBindings);
+ puts("\n");
+ doPolicies();
+}
+
+
+// READ WORKSHEET: POLICIES
+
+function doPolicies() {
+ puts("Reading Policies worksheet");
+ var csvFilename="Policies.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotPolicies);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotPolicies(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Policies.csv file is missing from upload.');
+ return;
+ }
+ csvPolicies = jsonObj;
+ csvPolicies = _.reject(csvPolicies, 'field2', 'Policies');
+ csvPolicies = _.reject(csvPolicies, 'field2', 'network-policy-fqdn');
+ csvPolicies = _.reject(csvPolicies, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvPolicies);
+ puts("\n");
+ doNetRoutes();
+}
+
+
+// READ WORKSHEET: NETWORK-ROUTES
+
+function doNetRoutes() {
+ puts("Reading Network-Routes worksheet");
+ var csvFilename="Network-Routes.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');
+ if ( preloadVersion == '1607' ) {
+ puts("This is a 1607 spreadsheet. Skipping Network-Routes.csv.");
+ gotNetRoutes(null,{});
+ return;
+ }
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotNetRoutes);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotNetRoutes(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Network-Routes.csv file is missing from upload.');
+ return;
+ }
+ csvNetRoutes = jsonObj;
+ csvNetRoutes = _.reject(csvNetRoutes, 'field2', 'Network-Routes');
+ csvNetRoutes = _.reject(csvNetRoutes, 'field2', 'route-table-reference-fqdn');
+ csvNetRoutes = _.reject(csvNetRoutes, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvNetRoutes);
+ puts("\n");
+ doneReadingFiles();
+}
+
+
+// DONE READING FILES
+
+function doneReadingFiles() {
+ puts("\n");
+ puts("DONE READING FILES!");
+ puts("\n");
+ processJson();
+}
+
+
+// PROCESS THE CSV FILES INTO OBJECTS TO BE ASSEMBLED INTO FINAL OUTPUT
+function processJson() {
+ processGeneral();
+ processSubnets();
+ processVpnBindings();
+ processPolicies();
+ processNetRoutes();
+ assembleJson();
+}
+
+// ASSEMBLE AND OUTPUT RESULTS
+
+function assembleJson() {
+ puts("\n");
+ puts("Using raw JSON and assembling final ouptut JSON.");
+ puts("\n");
+
+ networkTopoID = { "network-name": rawJson['network-name'],
+ "network-role": rawJson['network-role'],
+ "network-type": rawJson['network-type'],
+ "network-technology": rawJson['network-technology'] };
+
+ providerInfo = { "physical-network-name": rawJson['physical-network-name'],
+ "is-provider-network": rawJson['is-provider-network'],
+ "is-shared-network": rawJson['is-shared-network'],
+ "is-external-network": rawJson['is-external-network'] };
+
+ networkSubnets = rawJson['subnets'];
+
+ networkVpnBindings = rawJson['vpn-bindings'];
+
+ networkPolicies = rawJson['network-policy-fqdns'];
+
+ networkRoutes = rawJson['route-table-reference'];
+
+ networkTopo = { "network-topology-identifier": networkTopoID,
+ "provider-network-information": providerInfo,
+ "subnets": networkSubnets,
+ "vpn-bindings": networkVpnBindings,
+ "network-policy": networkPolicies,
+ "route-table-reference": networkRoutes};
+
+ networkInput = {'network-topology-information': networkTopo};
+
+ finalJson = {"input": networkInput};
+
+ outputJson();
+}
+
+function outputJson() {
+ puts("\n");
+ puts("\n");
+ puts(JSON.stringify(finalJson,null,2));
+ puts("\n");
+ puts("\n");
+ var unixTime, fullpath_filename, filename;
+ unixTime = moment().unix();
+ if (platform=='portal') {
+ fullpath_filename = process.cwd() + "/uploads/" + unixTime + ".net_worksheet.json";
+ filename = unixTime + ".net_worksheet.json.";
+ } else {
+ fullpath_filename = "./output.json."+unixTime;
+ filename = "output.json." + unixTime;
+ }
+ helpers.writeOutput(req, fullpath_filename, JSON.stringify(finalJson,null,2), callback);
+ callback(null, finalJson, filename);
+}
+
+
+// Gather functions that actually process data after it is all read
+
+function processGeneral() {
+ preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');
+ rawJson['preload-version'] = preloadVersion;
+ puts("Preload version: " + preloadVersion);
+
+ if ( (preloadVersion!='1607') && (preloadVersion!='1610') ) {
+ puts("\nError - incorrect version of preload worksheet.");
+ callback('Error - incorrect version of preload worksheet.');
+ }
+
+ rawJson['network-name'] = getParam(csvGeneral, 'field2', 'network-name', 'field3');
+ rawJson['network-role'] = getParam(csvGeneral, 'field2', 'network-role', 'field3');
+ rawJson['network-type'] = getParam(csvGeneral, 'field2', 'network-type', 'field3');
+ rawJson['network-technology'] = getParam(csvGeneral, 'field2', 'network-technology', 'field3');
+
+ if ( preloadVersion!='1607' ) {
+ rawJson['physical-network-name'] = getParam(csvGeneral, 'field2', 'physical-network-name', 'field3');
+ rawJson['is-provider-network'] = getParam(csvGeneral, 'field2', 'is-provider-network', 'field3');
+ rawJson['is-shared-network'] = getParam(csvGeneral, 'field2', 'is-shared-network', 'field3');
+ rawJson['is-external-network'] = getParam(csvGeneral, 'field2', 'is-external-network', 'field3');
+ }
+
+ rawJson['request-action'] = "PreloadNetworkRequest";
+ rawJson['svc-request-id'] = uuid.v1();
+ rawJson['svc-action'] = "reserve";
+ puts('rawJson:');
+ putd(rawJson);
+ puts("\n");
+}
+
+function processSubnets() {
+ var newSubnets = [];
+ csvSubnets.forEach( function(subnet) {
+ var subnetJson = {};
+ subnetJson["start-address"] = subnet.field2;
+ if (subnet.field3!='') {
+ subnetJson["dhcp-start-address"] = subnet.field3;
+ }
+ if (subnet.field4!='') {
+ subnetJson["dhcp-end-address"] = subnet.field4;
+ }
+ if (subnet.field5!='') {
+ subnetJson["gateway-address"] = subnet.field5;
+ }
+ subnetJson["cidr-mask"] = subnet.field6;
+ subnetJson["ip-version"] = subnet.field7;
+ subnetJson["dhcp-enabled"] = subnet.field8;
+ subnetJson["subnet-name"] = subnet.field9;
+ newSubnets.push(subnetJson);
+ }
+ );
+ puts("subnets:");
+ putd(newSubnets);
+ puts("\n");
+ rawJson["subnets"] = newSubnets;
+}
+
+function processVpnBindings() {
+ var newVpnBindings = [];
+
+ csvVpnBindings.forEach( function(vpn) {
+ var vpnJson = {};
+ bindid = _.trim(vpn.field2);
+ vpnJson["vpn-binding-id"] = bindid;
+ if (bindid!="") {
+ newVpnBindings.push(vpnJson);
+ }
+ });
+
+ puts("VPN-Bindings:");
+ putd(newVpnBindings);
+ puts("\n");
+ rawJson["vpn-bindings"] = newVpnBindings;
+}
+
+function processPolicies() {
+ var newPolicies = [];
+
+ csvPolicies.forEach( function(policy) {
+ var policyJson = {};
+ fqdn = _.trim(policy.field2);
+ if (fqdn != "") {
+ policyJson["network-policy-fqdn"] = fqdn;
+ newPolicies.push(policyJson);
+ }
+
+ }
+ );
+
+ puts("Policies:");
+ putd(newPolicies);
+ puts("\n");
+ rawJson["network-policy-fqdns"] = newPolicies;
+}
+
+function processNetRoutes() {
+ var newNetRoutes = [];
+
+ csvNetRoutes.forEach( function(netroute) {
+ var netrouteJson = {};
+ fqdn = _.trim(netroute.field2);
+ if (fqdn != "") {
+ netrouteJson["route-table-reference-fqdn"] = fqdn;
+ newNetRoutes.push(netrouteJson);
+ }
+
+ }
+ );
+
+ puts("Network-Routes:");
+ putd(newNetRoutes);
+ puts("\n");
+ rawJson["route-table-reference"] = newNetRoutes;
+}
+
+
+
diff --git a/admportal/server/router/routes/odl.js b/admportal/server/router/routes/odl.js
new file mode 100644
index 00000000..fba646fa
--- /dev/null
+++ b/admportal/server/router/routes/odl.js
@@ -0,0 +1,258 @@
+var express = require('express');
+var router = express.Router();
+var csp = require('./csp');
+var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json');
+var async = require('async');
+
+
+// pass host, username and password to ODL
+var username = properties.odlUser;
+var password = properties.odlPasswd;
+var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
+
+// target host for ODL request
+var host = properties.odlHost;
+var port = properties.odlPort;
+var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'};
+var options = {
+ host: host,
+ headers : header,
+ port : port,
+ rejectUnauthorized: false,
+ strictSSL : false
+};
+
+// Connection to OpenDaylight
+Odl = require('./Odl');
+
+function handleResult(err, response_str, res) {
+ if (err) {
+ console.error( String(err) );
+ res.render('pages/err', {result:{code:'failure', msg:String(err)}, header:process.env.MAIN_MENU});
+ } else {
+ // make sure response starts with JSON string
+ if (response_str && response_str.indexOf('{') == 0) {
+ //console.log("response: ", result);
+ res.render('odl/listWklst', { response_obj: JSON.parse(response_str), header:process.env.MAIN_MENU });
+ } else {
+ res.render('pages/err', {result:{code:'failure', msg:String(err) }, header:process.env.MAIN_MENU});
+ }
+ }
+}
+
+// / index page
+// calls restconf to get information
+router.get('/listWklst', csp.checkAuth, function(req, res) {
+ options.strictSSL = true; // used to test SSL certificate
+ Odl.Get('/restconf/config/L3SDN-API:services',options, handleResult,req,res);
+});
+
+router.get('/pageWklst', csp.checkAuth, function(req,res) {
+ pageWklst(req,res, {code:'', msg:''}, req.session.loggedInAdmin);
+});
+
+
+function pageWklst(req,res,resultObj,privilegeObj)
+{
+ if(req.session == null || req.session == undefined
+ || req.session.l3sdnPageInfo == null || req.session.l3sdnPageInfo == undefined)
+ {
+ res.render("pages/err",
+ { result: {code:'error', msg:"Unable to read session information. "+ String(err) }, header:process.env.MAIN_MENU});
+ return;
+ }
+
+ var l3sdnPageInfo = req.session.l3sdnPageInfo;
+ var currentPage=1;
+ if (typeof req.query.page != 'undefined')
+ {
+ currentPage = +req.query.page;
+ }
+ l3sdnPageInfo.currentPage = currentPage;
+ l3sdnPageInfo.rows = l3sdnPageInfo.pages[currentPage-1];
+ req.session.l3sdnPageInfo = l3sdnPageInfo;
+ res.render('odl/listWklst',
+ {
+ pageInfo : l3sdnPageInfo,
+ result : resultObj,
+ privilege : privilegeObj, header:process.env.MAIN_MENU
+ });
+ return;
+}
+
+
+router.post('/update_vr_lan_interface', function(req,res){
+ var svc_instance_id = encodeURIComponent(req.body.svc_instance_id);
+
+ // format msg
+ var msgRsp =
+ {
+ "vr-lan-interface" :
+ [
+ {
+ "vr-designation" : req.body.uf_vr_designation,
+ "v6-vr-lan-prefix" : req.body.uf_vr_lan_prefix,
+ "v6-vr-lan-prefix-length": req.body.uf_vr_lan_prefix_length,
+ "v6-vce-wan-address" : req.body.uf_vce_wan_address,
+ "v4-vr-lan-prefix" : req.body.uf_vr_lan_prefix,
+ "v4-vr-lan-prefix-length": req.body.uf_vr_lan_prefix_length,
+ "v4-vce-loopback-address": req.body.uf_vce_loopback_address
+ }
+ ]
+ };
+ var tasks = [];
+ tasks.push(function(callback){
+ Odl.put_vr_lan_interface('/restconf/config/L3SDN-API:services/layer3-service-list/'
+ + svc_instance_id
+ + '/service-data/vr-lan/', options, callback);
+ });
+ async.series(tasks, function(err,result){
+
+ if(err){
+ }
+ else{
+ var msgArray = new Array();
+ //result:{code:'error', msg:"got vr-lan information: "+ String(result)}
+ msgArray.push('vr-lan-interface successfully updated.');
+ res.render("odl/listVRlan",
+ {
+ svc_instance_id: req.body.svc_instance_id,
+ response_obj : JSON.parse(result), header:process.env.MAIN_MENU
+ });
+ return;
+ }
+ });
+});
+
+
+// sendData submits form data to ODL
+// Data is read from URL params and converted to JSON
+router.get('/svc-topology-operation', function(req, res) {
+ var formData = '{"input":{'
+ + '"svc-request-id":"'+ new Date().toISOString() + '"' +','
+ + '"svc-notification-url":"'+ req.query['svc-notification-url']+ '"' + ','
+ + '"svc-action":"'+ req.query['svc-action']+ '"' + ','
+ + '"svc-vnf-type":"'+ req.query['svc-vnf-type']+ '"' + ','
+ + '"svc-instance-id":"'+ req.query['svc-instance-id']+ '"' + ','
+ + '"svc-aic-site-id":"'+ req.query['svc-aic-site-id']+ '"'
+ +' } }';
+ Odl.Post('/restconf/operations/L3SDN-API:svc-topology-operation', options, formData, handleResult, res);
+});
+
+// delete request
+router.get('/wklist-delete', function(req, res) {
+ //console.dir(req.query);
+ Odl.Delete('/restconf/config/L3SDN-API:l3sdn-api-worklist/requests/'+req.query['request'], options, handleResult, res);
+});
+
+// get request
+router.get('/getid',function(req, res) {
+ //console.dir(req.query);
+ Odl.GetID('/restconf/config/L3SDN-API:l3sdn-api-worklist/requests/'+req.query['request'], options, res);
+});
+
+router.get('/getvnf', function(req,res) {
+ //console.log("/getvnf "+req.query);
+ Odl.GetVNF('/restconf/config/L3SDN-API:l3sdn-api-worklist/requests/'+req.query['request']+'/vnf/',options,req,res);
+});
+router.get('/getvrlan', function(req,res) {
+ var vrtasks = [];
+ var reqstr = encodeURIComponent(req.query['request']);
+ vrtasks.push(function(callback) {
+ Odl.GetVRlan('/restconf/config/L3SDN-API:services/layer3-service-list/'+reqstr+'/service-data/vr-lan/',options,callback);
+ });
+ async.series(vrtasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ Odl.Get('/restconf/config/L3SDN-API:services',options, handleResult,res);
+ //res.render("pages/err",
+ //{result:{code:'error', msg:"Unable to get vr-lan information: "+ String(err) }});
+ return;
+ }
+ else {
+ msgArray.push('Row successfully deleted from AIC_SITE table.');
+ res.render("odl/listVRlan",
+ {
+ svc_instance_id: req.query['request'],
+ response_obj : JSON.parse(result), header:process.env.MAIN_MENU
+ });
+ return;
+ }
+ });
+});
+router.get('/getClusterStatus', function(req,res) {
+
+
+ var urltasks = [];
+ var _header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'};
+ var _options = null;
+
+ var slist = properties.shard_list;
+ var hlist = properties.hostnameList;
+ var port = properties.clusterPort;
+ var prefix_url = properties.clusterPrefixURL;
+ var mid_url = properties.clusterMidURL;
+ var suffix_url = properties.clusterSuffixURL;
+ var urlArray = new Array();
+ var url_request='';
+ var shard=null, hostname=null;
+
+ // build array of urls from properties
+ for(var x=0; x<slist.length; x++)
+ {
+ shard = slist[x];
+ for(var y=0; y<hlist.length; y++)
+ {
+ hostname = hlist[y];
+
+ url_request = properties.odlProtocol + '://'
+ + hostname.hname + ':'
+ + port
+ + prefix_url
+ + (y+1)
+ + mid_url
+ + shard.shard_name
+ + suffix_url;
+
+ _options = {
+ method : "GET",
+ path : url_request,
+ host : hostname.hname,
+ headers : _header,
+ port : port,
+ rejectUnauthorized: false,
+ strictSSL : false
+ };
+ urlArray.push(_options);
+ }
+ }
+
+ urlArray.forEach(function(request){
+ urltasks.push(function(callback) {
+ Odl.GetClusterStatus(request,callback);
+ });
+ });
+ async.series(urltasks, function(err,result){
+ var msgArray = new Array();
+ if(err){
+ msgArray.push(err);
+ res.render("pages/err",
+ {result:{code:'error', msg:"Unable to get status: "+ String(err) }, header:process.env.MAIN_MENU});
+ return;
+ }
+ else {
+ var msgArray = new Array();
+ msgArray.push('Sucess');
+ res.render("odl/cluster_status",
+ {
+ result : {code:'success', msg:msgArray},
+ response_obj : result, header:process.env.MAIN_MENU
+ });
+ return;
+ }
+ });
+});
+
+
+module.exports = router;
diff --git a/admportal/server/router/routes/preload.js b/admportal/server/router/routes/preload.js
new file mode 100644
index 00000000..1a63ec0e
--- /dev/null
+++ b/admportal/server/router/routes/preload.js
@@ -0,0 +1,154 @@
+var express = require('express');
+var router = express.Router();
+var exec = require('child_process').exec;
+var util = require('util');
+var fs = require('fs.extra');
+var dbRoutes = require('./dbRoutes');
+var csp = require('./csp');
+var multer = require('multer');
+var bodyParser = require('body-parser');
+var sax = require('sax'),strict=true,parser = sax.parser(strict);
+var async = require('async');
+var l_ = require('lodash');
+var dateFormat = require('dateformat');
+var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json');
+var vnf = require('./vnf');
+var network = require('./network');
+var moment = require('moment');
+
+
+
+// pass host, username and password to ODL
+// target host for ODL request
+var username = properties.odlUser;
+var password = properties.odlPasswd;
+var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
+var host = properties.odlHost;
+var port = properties.odlPort;
+
+var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/json'};
+var options = {
+ host : host,
+ headers : header,
+ port : port,
+ rejectUnauthorized:false,
+ strictSSL: false
+};
+
+// Connection to OpenDaylight
+Odl = require('./Odl');
+
+// multer 1.1
+var unixTime = moment().unix();
+var storage = multer.diskStorage({
+ destination: function (req, file, cb) {
+ cb(null, process.cwd() + '/uploads/')
+ },
+ filename: function (req, file, cb) {
+ cb(null, unixTime + "." + file.originalname )
+ }
+});
+
+var upload = multer({
+ storage: storage,
+ fileFilter: function(req,file,cb) {
+ var type = file.mimetype;
+ if ( type.indexOf('ms-excel') == -1 ) {
+ return cb(null,false);
+ }
+ cb(null,true);
+ }
+});
+
+router.post('/uploadVnfCsv', csp.checkAuth, dbRoutes.checkDB, upload.array('filename'), function(req, res)
+{
+ console.log('files:'+ JSON.stringify(req.files,null,4));
+
+ var tasks = []
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+
+ tasks.push ( function(callback) { vnf.go(req,res,callback,''); } );
+ tasks.push ( function(arg1,arg2,callback) { formatVnfInsertStatement(arg1,arg2,req,res,callback); } );
+ tasks.push( function(arg1, callback) { dbRoutes.addRow(arg1,req,res,callback); } );
+ async.waterfall(tasks, function(err,result)
+ {
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ //logger.debug('Successfully uploaded ' + req.session.worksheetFilename);
+ msgArray.push('Successfully uploaded file.' );
+ dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+
+});
+
+router.post('/uploadNetworkCsv', csp.checkAuth, dbRoutes.checkDB, upload.array('filename'), function(req, res)
+{
+ console.log('files:'+ JSON.stringify(req.files,null,4));
+
+ var tasks = []
+ var msgArray = new Array();
+ var privilegeObj = req.session.loggedInAdmin;
+
+ var privilegeObj = req.session.loggedInAdmin;
+ var tasks = [];
+
+ tasks.push ( function(callback) { network.go(req,res,callback,''); } );
+ tasks.push ( function(arg1,arg2,callback) { formatNetworkInsertStatement(arg1,arg2,req,res,callback); } );
+ tasks.push( function(arg1, callback) { dbRoutes.addRow(arg1,req,res,callback); } );
+ async.waterfall(tasks, function(err,result)
+ {
+ if(err){
+ msgArray.push(err);
+ dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj);
+ return;
+ }
+ else {
+ //logger.debug('Successfully uploaded ' + req.session.worksheetFilename);
+ msgArray.push('Successfully uploaded file.' );
+ dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj);
+ return;
+ }
+ });
+
+});
+
+
+function formatVnfInsertStatement(content,filename,req,res,callback)
+{
+ //var newstr = JSON.stringify(content).replace(/\\\"/g,'\\\\\\"');
+ //var ins_str = newstr.replace("\r\n ", "\\r\\n");
+ var newstr = JSON.stringify(content);
+ var enc_str = encodeURI(newstr);
+ var sql = "INSERT INTO PRE_LOAD_VNF_DATA "
+ + "(filename,preload_data) VALUES ("
+ + "'"+ filename + "',"
+ + "'" + enc_str + "')";
+
+ callback(null,sql);
+}
+
+function formatNetworkInsertStatement(content,filename,req,res,callback)
+{
+ var newstr = JSON.stringify(content);
+ var enc_str = encodeURI(newstr);
+ var sql = "INSERT INTO PRE_LOAD_VNF_NETWORK_DATA "
+ + "(filename,preload_data) VALUES ("
+ + "'"+ filename + "',"
+ + "'" + enc_str + "')";
+
+ callback(null,sql);
+}
+
+
+
+module.exports = router;
diff --git a/admportal/server/router/routes/root.js b/admportal/server/router/routes/root.js
new file mode 100644
index 00000000..f586892b
--- /dev/null
+++ b/admportal/server/router/routes/root.js
@@ -0,0 +1,111 @@
+var express = require('express');
+var router = express.Router();
+var csp = require('./csp.js');
+var dbRoutes = require('./dbRoutes.js');
+var sla = require('./sla');
+var os = require('os');
+var async = require('async');
+var Odl = require('./Odl');
+var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json');
+
+
+
+router.use('/healthcheck', function(req,res){
+ res.render('pages/healthcheck');
+});
+router.get('/test', function(req,res){
+
+//console.log('port='+ req.socket.localPort);
+//console.log('port='+ req.protocol);
+
+ // pass host, username and password to ODL
+ var username = properties.odlUser;
+ var password = properties.odlPasswd;
+ var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
+
+ // target host for ODL request
+ var host = properties.odlHost;
+ var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'};
+ var c_header = {'Host': properties.odlConexusHost, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'};
+
+// path = '/restconf/config/SLI-API:healthcheck',
+ var _options = {
+ method : 'POST',
+ host : host,
+ headers : header,
+ port : '8443',
+ path : '/restconf/operations/SLI-API:healthcheck',
+ rejectUnauthorized: false,
+ strictSSL : false
+ };
+ var c_options = {
+ method : 'POST',
+ host : properties.odlConexusHost,
+ headers : c_header,
+ port : '8543',
+ path : '/restconf/operations/SLI-API:healthcheck',
+ rejectUnauthorized: false,
+ strictSSL : false
+ };
+
+
+ var tasks = [];
+ //tasks.push( function(callback) { dbRoutes.testdb(req,res,callback); } );
+
+ tasks.push ( createFunctionObj(_options) );
+
+ tasks.push ( createFunctionObj(c_options) );
+
+ async.series(tasks, function(err,result){
+ if(err) {
+ res.status(400).send(err);
+ return;
+ }
+ res.status(200).send(result);
+ return;
+ });
+});
+
+function createFunctionObj( loptions ) {
+ return function(callback) { Odl.Healthcheck(loptions,callback); };
+}
+
+router.get('/mytree', function(req,res) {
+ res.render('pages/tree');
+});
+router.get('/setuplogin', function(req,res) {
+ res.render('pages/setuplogin');
+});
+router.post('/formSetupLogin', dbRoutes.checkDB, function(req,res) {
+ dbRoutes.saveSetupLogin(req,res);
+});
+router.post('/formSignUp', dbRoutes.checkDB, function(req,res) {
+ dbRoutes.saveUser(req,res);
+});
+router.post('/formlogin', csp.login, dbRoutes.checkDB, function(req,res) {
+});
+router.get('/login', function(req,res) {
+ res.render('pages/login');
+ // handle get
+});
+router.get('/signup', function(req,res) {
+ res.render('pages/signup');
+ // handle get
+});
+router.get('/info', function(req,res) {
+ // handle get
+ res.send("login info");
+});
+router.get('/logout', csp.logout, function(req,res) {
+ // handle get
+});
+router.get('/csplogout', function(req,res) {
+ // handle get
+ res.render("pages/csplogout", {result:{code:'success', msg:'You have been successfylly logged out.'},header:process.env.MAIN_MENU});
+});
+router.get('/getuser', function(req,res) {
+ // handle get
+ res.render("pages/home");
+});
+
+module.exports = router;
diff --git a/admportal/server/router/routes/sla.js b/admportal/server/router/routes/sla.js
new file mode 100644
index 00000000..92fa846b
--- /dev/null
+++ b/admportal/server/router/routes/sla.js
@@ -0,0 +1,369 @@
+var express = require('express');
+var router = express.Router();
+var exec = require('child_process').exec;
+//var util = require('util');
+var fs = require('fs');
+var dbRoutes = require('./dbRoutes');
+var csp = require('./csp');
+var multer = require('multer');
+var bodyParser = require('body-parser');
+//var sax = require('sax'),strict=true,parser = sax.parser(strict);
+var async = require('async');
+
+
+// SVC_LOGIC table columns
+var _module=''; // cannot use module its a reserved word
+var version='';
+var rpc='';
+var mode='';
+var xmlfile='';
+
+
+// used for file upload button, retain original file name
+//router.use(bodyParser());
+router.use(bodyParser.urlencoded({
+ extended: true
+}));
+//var upload = multer({ dest: process.cwd() + '/uploads/', rename: function(fieldname,filename){ return filename; } });
+
+// multer 1.1
+var storage = multer.diskStorage({
+ destination: function (req, file, cb) {
+ cb(null, process.cwd() + '/uploads/')
+ },
+ filename: function (req, file, cb) {
+ cb(null, file.originalname )
+ }
+});
+
+var upload = multer({
+ storage: storage
+});
+
+
+/*
+router.use(multer({
+ dest: process.cwd() + '/uploads/',
+ rename: function(fieldname,filename){
+ return filename;
+ }
+}));
+*/
+
+
+//router.use(express.json());
+//router.use(express.urlencoded());
+//router.use(multer({ dest: './uploads/' }));
+
+
+// GET
+router.get('/listSLA', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.listSLA(req,res,{code:'', msg:''} );
+});
+
+router.get('/activate', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var _module = req.query.module;
+ var rpc = req.query.rpc;
+ var version = req.query.version;
+ var mode = req.query.mode;
+
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.global_deactivate(req,res,_module,rpc,mode,callback); } );
+ tasks.push( function(callback) { dbRoutes.activate(req,res,_module,rpc,version,mode,callback); } );
+ async.series(tasks, function(err,result){
+
+ if ( err ) {
+ dbRoutes.listSLA(req,res,{code:'failure', msg:'Failed to activate, '+ String(err) });
+ }
+ else {
+ dbRoutes.listSLA(req,res,{ code:'success', msg:'Successfully activated directed graph.'});
+ }
+ });
+});
+
+router.get('/deactivate', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var _module = req.query.module;
+ var rpc = req.query.rpc;
+ var version = req.query.version;
+ var mode = req.query.mode;
+
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.deactivate(req,res,_module,rpc,version,mode,callback); } );
+ async.series(tasks, function(err,result){
+
+ if ( err ) {
+ dbRoutes.listSLA(req,res,{code:'failure', msg:'There was an error uploading the file. '+ err });
+ }
+ else {
+ dbRoutes.listSLA(req,res,{ code:'success', msg:'Successfully deactivated directed graph.'});
+ }
+ });
+});
+
+router.get('/deleteDG', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ var _module = req.query.module;
+ var rpc = req.query.rpc;
+ var version = req.query.version;
+ var mode = req.query.mode;
+
+ var tasks = [];
+ tasks.push( function(callback) { dbRoutes.deleteDG(req,res,_module,rpc,version,mode,callback); } );
+ async.series(tasks, function(err,result){
+
+ if ( err ) {
+ dbRoutes.listSLA(req,res,{ code:'failure', msg:'There was an error uploading the file. '+ err });
+ }
+ else {
+ dbRoutes.listSLA(req,res,{ code:'success', msg:'Successfully deleted directed graph.'});
+ }
+ });
+});
+
+router.post('/dgUpload', dbRoutes.checkDB, upload.single('filename'), function(req, res, next){
+
+ if(req.file.originalname){
+ if (req.file.originalname == 0) {
+
+ dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'});
+ }
+ fs.exists(req.file.path, function(exists) {
+ if(exists) {
+
+ // parse xml
+ try {
+ //dbRoutes.checkSvcLogic(req,res);
+
+ var file_buf = fs.readFileSync(req.file.path, "utf8");
+
+ // call Dan's svclogic shell script from here
+ var currentDB = dbRoutes.getCurrentDB();
+ var commandToExec = process.cwd()
+ + "/shell/svclogic.sh load "
+ + req.file.path + " "
+ + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB;
+
+ console.log("commandToExec:" + commandToExec);
+ child = exec(commandToExec ,function (error,stdout,stderr){
+ if(error){
+ console.error("error:" + error);
+ //res.type('text/html').status(400).send( error);
+ //return;
+ }
+ if(stderr){
+ res.status(400).send(stderr);
+ return;
+ }
+ if(stdout){
+ res.status(200).send( new Buffer('Success'));
+ return;
+ }
+
+ // remove the grave accents, the sax parser does not like them
+ //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close();
+ //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res);
+ //dbRoutes.listSLA(req,res, resultObj);
+ });
+ } catch(ex) {
+ // keep 'em silent
+ console.error('sax error:'+ex);
+ res.status(400).send(ex);
+ return;
+ }
+
+ } else {
+ res.status(400).send(new Buffer('Cannot find file.'));
+ return;
+
+ }
+ });
+ }
+ else {
+ res.status(400).send(new Buffer('file does not exist\n'));
+ }
+ return;
+});
+
+
+// POST
+router.post('/upload', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res, next){
+
+console.log('file:'+ JSON.stringify(req.file));
+
+ if(req.file.originalname){
+ if (req.file.originalname.size == 0) {
+ dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'});
+ }
+ fs.exists(req.file.path, function(exists) {
+ if(exists) {
+
+ // parse xml
+ try {
+ //dbRoutes.checkSvcLogic(req,res);
+
+ var currentDB = dbRoutes.getCurrentDB();
+ var file_buf = fs.readFileSync(req.file.path, "utf8");
+
+ // call Dan's svclogic shell script from here
+ var commandToExec = process.cwd()
+ + "/shell/svclogic.sh load "
+ + req.file.path + " "
+ + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB;
+
+ console.log("commandToExec:" + commandToExec);
+ child = exec(commandToExec ,function (error,stdout,stderr){
+ if(error){
+ console.error("error:" + error);
+ dbRoutes.listSLA(req,res,{code:'failure',msg:error} );
+ return;
+ }
+ if(stderr){
+ console.error("stderr:" + JSON.stringify(stderr,null,2));
+ var s_stderr = JSON.stringify(stderr);
+ if ( s_stderr.indexOf("Saving") > -1 )
+ {
+ dbRoutes.listSLA(req,res,{code:'success', msg:'File sucessfully uploaded.'});
+ }else {
+ dbRoutes.listSLA(req,res,{code:'failure', msg:stderr});
+ }
+ return;
+ }
+ if(stdout){
+ console.log("stderr:" + stdout);
+ dbRoutes.listSLA(req,res,{code:'success', msg:'File sucessfully uploaded.'});
+ return;
+ }
+
+ // remove the grave accents, the sax parser does not like them
+ //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close();
+ //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res);
+ //dbRoutes.listSLA(req,res, resultObj);
+ });
+ } catch(ex) {
+ // keep 'em silent
+ console.error("error:" + ex);
+ dbRoutes.listSLA(req,res,{code:'failure',msg:ex} );
+ }
+
+ } else {
+ dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'});
+ }
+ });
+ }
+ else {
+ dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'});
+ }
+});
+
+router.get('/printAsXml', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ try {
+ //dbRoutes.checkSvcLogic(req,res);
+
+ var _module = req.query.module;
+ var rpc = req.query.rpc;
+ var version = req.query.version;
+ var mode = req.query.mode;
+ var currentDB = dbRoutes.getCurrentDB();
+
+ // call Dan's svclogic shell script from here
+ var commandToExec = process.cwd()
+ + "/shell/svclogic.sh get-source "
+ + _module + " "
+ + rpc + " "
+ + mode + " "
+ + version + " "
+ + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB;
+
+ console.log("commandToExec:" + commandToExec);
+
+ child = exec(commandToExec , {maxBuffer: 1024*5000}, function (error,stdout,stderr){
+ if(error){
+ console.error("error:" + error);
+ dbRoutes.listSLA(req,res,{code:'failure',msg:error} );
+ return;
+ }
+ //if(stderr){
+ //logger.info("stderr:" + stderr);
+ //}
+ if(stdout){
+ console.log("OUTPUT:" + stdout);
+ res.render('sla/printasxml', {result:{code:'success',
+ msg:'Module : ' + _module + '\n' +
+ 'RPC : ' + rpc + '\n' +
+ 'Mode : ' + mode + '\n' +
+ 'Version: ' + version + '\n\n' + stdout}, header:process.env.MAIN_MENU});
+ }
+
+ // remove the grave accents, the sax parser does not like them
+ //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close();
+ //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res);
+ //dbRoutes.listSLA(req,res, resultObj);
+ });
+ } catch(ex) {
+ console.error("error:" + ex);
+ dbRoutes.listSLA(req,res,{code:'failure',msg:ex} );
+ }
+});
+
+
+router.get('/printAsGv', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ try {
+ //dbRoutes.checkSvcLogic(req,res);
+
+ var _module = req.query.module;
+ var rpc = req.query.rpc;
+ var version = req.query.version;
+ var mode = req.query.mode;
+ var currentDB = dbRoutes.getCurrentDB();
+console.log('currentDB='+currentDB);
+
+ // call Dan's svclogic shell script from here
+ var commandToExec = process.cwd()
+ + "/shell/svclogic.sh print "
+ + _module + " "
+ + rpc + " "
+ + mode + " "
+ + version + " "
+ + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB
+ + " | dot -Tpng";
+
+ console.log("commandToExec:" + commandToExec);
+
+ child = exec(commandToExec ,
+ {encoding:'base64',maxBuffer:5000*1024}, function (error,stdout,stderr){
+ if(error){
+ console.error("error:" + error);
+ dbRoutes.listSLA(req,res,{code:'failure',msg:error} );
+ return;
+ }
+ if(stderr){
+ console.error("stderr:" + stderr);
+ }
+ if(stdout){
+ //logger.info("OUTPUT:" + stdout);
+ //res.render('sla/printasgv', result = {code:'success',
+ //msg:new Buffer(stdout,'base64')} );
+ res.render('sla/printasgv', {result:{code:'success',
+ module: _module,
+ rpc: rpc,
+ version: version,
+ mode:mode,
+ msg:stdout}, header:process.env.MAIN_MENU});
+ }
+
+ // remove the grave accents, the sax parser does not like them
+ //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close();
+ //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res);
+ //dbRoutes.listSLA(req,res, resultObj);
+ });
+ } catch(ex) {
+ console.error("error:" + ex);
+ dbRoutes.listSLA(req,res,{code:'failure',msg:ex} );
+ }
+
+});
+module.exports = router;
diff --git a/admportal/server/router/routes/user.js b/admportal/server/router/routes/user.js
new file mode 100644
index 00000000..116bf932
--- /dev/null
+++ b/admportal/server/router/routes/user.js
@@ -0,0 +1,169 @@
+var express = require('express');
+var router = express.Router();
+var exec = require('child_process').exec;
+var util = require('util');
+var fs = require('fs');
+var dbRoutes = require('./dbRoutes');
+var csp = require('./csp');
+var bodyParser = require('body-parser');
+var sax = require('sax'),strict=true,parser = sax.parser(strict);
+
+// SVC_LOGIC table columns
+var _module=''; // cannot use module its a reserved word
+var version='';
+var rpc='';
+var mode='';
+var xmlfile='';
+
+
+//router.use(bodyParser());
+router.use(bodyParser.urlencoded({
+ extended: true
+}));
+
+
+// GET
+router.get('/listUsers', csp.checkAuth, function(req,res) {
+ dbRoutes.listUsers(req,res, {user:req.session.loggedInAdmin,code:'', msg:''} );
+});
+router.get('/deleteUser', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.deleteUser(req,res, {code:'', msg:''} );
+});
+
+//router.get('/activate', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ //var _module = req.query.module;
+ //var rpc = req.query.rpc;
+ //var version = req.query.version;
+ //var mode = req.query.mode;
+
+ //dbRoutes.activate(req,res,_module,rpc,version,mode);
+//});
+
+//router.get('/deactivate', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ //var _module = req.query.module;
+ //var rpc = req.query.rpc;
+ //var version = req.query.version;
+ //var mode = req.query.mode;
+//
+ //dbRoutes.deactivate(req,res,_module,rpc,version,mode);
+//});
+
+//router.get('/deleteDG', csp.checkAuth, dbRoutes.checkDB, function(req,res){
+
+ //var _module = req.query.module;
+ //var rpc = req.query.rpc;
+ //var version = req.query.version;
+ //var mode = req.query.mode;
+
+ //dbRoutes.deleteDG(req,res,_module,rpc,version,mode);
+//});
+/*
+// SAX
+parser.onerror = function (e) {
+ logger.debug('onerror');
+ // an error happened.
+};
+parser.ontext = function (t) {
+ // got some text. t is the string of text.
+ logger.debug('ontext:'+t);
+};
+parser.onopentag = function (node) {
+ // opened a tag. node has "name" and "attributes"
+ if ( node.name == 'service-logic' )
+ {
+ _module = node.attributes.module;
+ version = node.attributes.version;
+ }
+ if ( node.name == 'method' )
+ {
+ rpc = node.attributes.rpc;
+ mode = node.attributes.mode;
+ }
+};
+parser.onattribute = function (attr) {
+ // an attribute. attr has "name" and "value"
+ logger.debug('onattribute:'+attr);
+};
+parser.onend = function () {
+ // parser stream is done, and ready to have more stuff written to it.
+ logger.debug('onend:');
+};
+*/
+
+
+// POST
+router.post('/updateUser', csp.checkAuth, dbRoutes.checkDB, function(req,res,next){
+ dbRoutes.updateUser(req,res,{code:'',msg:''});
+});
+router.post('/addUser', csp.checkAuth, dbRoutes.checkDB, function(req,res) {
+ dbRoutes.addUser(req,res, {code:'', msg:''} );
+});
+
+//router.post('/upload', csp.checkAuth, dbRoutes.checkDB, function(req, res, next){
+
+/*
+logger.debug("upload");
+ if(req.files.filename){
+ if (req.files.filename.size == 0) {
+ resultObj =
+ {code:'danger', msg:'There was an error uploading the file, please try again.'};
+ dbRoutes.listSLA(req,res, resultObj);
+ }
+ fs.exists(req.files.filename.path, function(exists) {
+ if(exists) {
+ resultObj = {code:'success', msg:'File sucessfully uploaded.'};
+
+ // parse xml
+ try {
+ var file_buf = fs.readFileSync(req.files.filename.path, "utf8");
+logger.debug('file '+req.files.filename);
+
+
+ // call Dan's svclogic shell script from here
+ var commandToExec = process.cwd()
+ + "/shell/svclogic.sh load "
+ + req.files.filename.path + " "
+ + process.cwd()
+ + "/config/svclogic.properties";
+
+ logger.debug("commandToExec:" + commandToExec);
+ child = exec(commandToExec ,function (error,stdout,stderr){
+ if(error){
+ logger.info("error:" + error);
+ }
+ if(stderr){
+ logger.info("stderr:" + stderr);
+ }
+ if(stdout){
+ logger.info("OUTPUT:" + stdout);
+ dbRoutes.listSLA(req,res, resultObj);
+ }
+
+ // remove the grave accents, the sax parser does not like them
+ //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close();
+ //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res);
+ //dbRoutes.listSLA(req,res, resultObj);
+ });
+ } catch(ex) {
+ // keep 'em silent
+ logger.debug('sax error:'+ex);
+ }
+
+ } else {
+ resultObj =
+ {code:'danger', msg:'There was an error uploading the file, please try again.'};
+ dbRoutes.listSLA(req,res, resultObj);
+ }
+ });
+ }
+ else {
+ resultObj =
+ {code:'danger', msg:'There was an error uploading the file, please try again.'};
+ dbRoutes.listSLA(req,res, resultObj);
+ }
+});
+*/
+
+module.exports = router;
diff --git a/admportal/server/router/routes/vnf.js b/admportal/server/router/routes/vnf.js
new file mode 100644
index 00000000..be004fe2
--- /dev/null
+++ b/admportal/server/router/routes/vnf.js
@@ -0,0 +1,603 @@
+
+// Helper functions for processing a VNF worksheet
+
+var helpers = require('./helpers.js');
+var _ = require('lodash');
+var csvtojson = require('csvtojson');
+var async = require('async');
+var uuid = require('node-uuid'); // generate a uuid with "uuid.v1()"
+var path = require('path');
+var fs = require("fs");
+var moment = require("moment");
+
+var vnf = module.exports;
+var getParam = helpers.getParam;
+
+var callback;
+var indir;
+var csvGeneral, csvZones, csvNetworks, csvVMs, csvVMnetworks, csvVMnetworkIPs, csvVMnetworkMACs, csvTagValues;
+var rawJson={}
+var finalJson={};
+var platform;
+var req, res;
+var preloadVersion; // 1607, 1610, etc...
+
+puts = helpers.puts;
+putd = helpers.putd;
+
+vnf.go = function(lreq,lres,cb,dir){
+ puts("Processing VNF workbook");
+ req = lreq;
+ res = lres;
+ callback = cb;
+ if (dir!="") {
+ platform="pc";
+ indir=dir;
+ } else {
+ platform="portal";
+ indir=process.cwd() + "/uploads/";
+ }
+ doGeneral();
+}
+
+
+// READ WORKSHEET: GENERAL
+
+function doGeneral() {
+ puts("Reading General worksheet");
+ var csvFilename="General.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotGeneral);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotGeneral(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('General.csv file is missing from upload.');
+ return;
+ }
+ csvGeneral = jsonObj;
+ puts("\nRead this: ");
+ putd(csvGeneral);
+ puts("\n");
+ doAvailZones();
+}
+
+// READ WORKSHEET: AVAILABILITY ZONES
+
+function doAvailZones() {
+ puts("Reading Availability-zones worksheet");
+ var csvFilename="Availability-zones.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotAvailZones);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotAvailZones(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Availability-zones.csv file is missing from upload.');
+ return;
+ }
+ csvZones = jsonObj;
+ csvZones = _.reject(csvZones, 'field2', 'Availability Zones');
+ csvZones = _.reject(csvZones, 'field2', 'List the availability zones for this VNF');
+ csvZones = _.reject(csvZones, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvZones);
+ puts("\n");
+ doNetworks();
+}
+
+// READ WORKSHEET: NETWORKS
+
+function doNetworks() {
+ puts("Reading Networks worksheet");
+ var csvFilename="Networks.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotNetworks);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotNetworks(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Networks.csv file is missing from upload.');
+ return;
+ }
+ csvNetworks = jsonObj;
+ csvNetworks = _.reject(csvNetworks, 'field2', 'Networks');
+ csvNetworks = _.reject(csvNetworks, 'field2', 'List the VNF networks. (VM-networks are on a different worksheet.)');
+ csvNetworks = _.reject(csvNetworks, 'field2', 'network-role');
+ csvNetworks = _.reject(csvNetworks, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvNetworks);
+ puts("\n");
+ doVMs();
+}
+
+// READ WORKSHEET: VMs
+
+function doVMs() {
+ puts("Reading VMs worksheet");
+ var csvFilename="VMs.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMs);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMs(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VMs.csv file is missing from upload.');
+ return;
+ }
+ csvVMs = jsonObj;
+ csvVMs = _.reject(csvVMs, 'field2', 'VMs');
+ csvVMs = _.reject(csvVMs, 'field2', 'List the VM types for this VNF');
+ csvVMs = _.reject(csvVMs, 'field2', 'vm-type');
+ csvVMs = _.reject(csvVMs, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMs);
+ puts("\n");
+ doVMnetworks();
+}
+
+// READ WORKSHEET: VM-NETWORKS
+
+function doVMnetworks() {
+ puts("Reading VM-networks worksheet");
+ var csvFilename="VM-networks.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMnetworks);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMnetworks(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VM-networks.csv file is missing from upload.');
+ return;
+ }
+ csvVMnetworks = jsonObj;
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'VM-networks');
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'List the VM-networks for each VM type');
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'vm-type');
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMnetworks);
+ puts("\n");
+ doVMnetworkIPs();
+}
+
+// READ WORKSHEET: VM-NETWORK-IPS
+
+function doVMnetworkIPs() {
+ puts("Reading VM-network-IPs worksheet");
+ var csvFilename="VM-network-IPs.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMnetworkIPs);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMnetworkIPs(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VM-network-IPs.csv file is missing from upload.');
+ return;
+ }
+ csvVMnetworkIPs = jsonObj;
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'VM-network-IPs');
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'List the IPs assigned to each VM-network');
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'vm-type');
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMnetworkIPs);
+ puts("\n");
+ doVMnetworkMACs();
+}
+
+// READ WORKSHEET: VM-NETWORK-MACS
+
+function doVMnetworkMACs() {
+ puts("Reading VM-network-MACs worksheet");
+ var csvFilename="VM-network-MACs.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMnetworkMACs);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMnetworkMACs(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VM-network-MACs.csv file is missing from upload.');
+ return;
+ }
+ csvVMnetworkMACs = jsonObj;
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'VM-network-MACs');
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'List the MACs assigned to each VM-network');
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'vm-type');
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMnetworkMACs);
+ puts("\n");
+ doTagValues();
+}
+
+// READ WORKSHEET: TAG-VALUES
+
+function doTagValues() {
+ puts("Reading Tag-values worksheet");
+ var csvFilename="Tag-values.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotTagValues);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotTagValues(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Tag-values.csv file is missing from upload.');
+ return;
+ }
+ csvTagValues = jsonObj;
+ csvTagValues = _.reject(csvTagValues, 'field2', 'Tag-values');
+ csvTagValues = _.reject(csvTagValues, 'field2', 'Extra data to be passed into the HEAT template for this VNF');
+ csvTagValues = _.reject(csvTagValues, 'field2', 'vnf-parameter-name');
+ csvTagValues = _.reject(csvTagValues, 'field2', 'vnf-parameter-value');
+ csvTagValues = _.reject(csvTagValues, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvTagValues);
+ puts("\n");
+ doneReadingFiles();
+}
+
+
+
+
+function doneReadingFiles() {
+ puts("\n");
+ puts("DONE READING FILES!");
+ puts("\n");
+ processJson();
+}
+
+
+// PROCESS THE CSV FILES INTO OBJECTS TO BE ASSEMBLED INTO FINAL OUTPUT
+function processJson() {
+ processGeneral();
+ processAvailZones();
+ processNetworks();
+ processVMnetworks();
+ processVMnetips();
+ processVMnetmacs();
+ processVMs();
+ processTagValues();
+ assembleJson();
+}
+
+// ASSEMBLE AND OUTPUT RESULTS
+
+function assembleJson() {
+ puts("\n");
+ puts("Using raw JSON and assembling final ouptut JSON.");
+ puts("\n");
+
+ vnfTopoID = { "service-type": "SDN-MOBILITY",
+ "vnf-name": rawJson['vf-module-name'],
+ "vnf-type": rawJson['vf-module-model-name'],
+ "generic-vnf-name": rawJson['generic-vnf-name'],
+ "generic-vnf-type": rawJson['generic-vnf-type'] };
+
+ vnfZones = rawJson['availability-zones'];
+
+ vnfNetworks = rawJson['networks'];
+
+ vnfVMs = rawJson['vms'];
+
+ vnfParams = rawJson['tag-values'];
+
+ vnfAssignments = { "availability-zones": vnfZones,
+ "vnf-networks": vnfNetworks,
+ "vnf-vms": vnfVMs};
+
+ vnfTopo = { "vnf-topology-identifier": vnfTopoID,
+ "vnf-assignments": vnfAssignments,
+ "vnf-parameters": vnfParams };
+
+ vnfInput = {'vnf-topology-information': vnfTopo};
+
+ finalJson = {"input": vnfInput};
+
+ outputJson();
+}
+
+function outputJson() {
+ puts("\n");
+ puts("\n");
+ puts(JSON.stringify(finalJson,null,2));
+ puts("\n");
+ puts("\n");
+ var unixTime, fullpath_filename, filename;
+ unixTime = moment().unix();
+ if (platform=='portal') {
+ fullpath_filename = process.cwd() + "/uploads/" + unixTime + ".vnf_worksheet.json";
+ filename = unixTime + ".vnf_worksheet.json.";
+ } else {
+ fullpath_filename = "./output.json."+unixTime;
+ filename = "output.json." + unixTime;
+ }
+ helpers.writeOutput(req, fullpath_filename, JSON.stringify(finalJson,null,2), callback);
+ callback(null, finalJson, filename);
+}
+
+
+// Gather functions that actually process data after it is all read
+
+function processGeneral() {
+
+ preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');
+ rawJson['preload-version'] = preloadVersion;
+ puts("Preload version: " + preloadVersion);
+
+ if ( (preloadVersion!='1607') && (preloadVersion!='1610') ) {
+ puts("\nError - incorrect version of preload worksheet.");
+ callback('Error - incorrect version of preload worksheet.');
+ }
+
+ rawJson['vf-module-name'] = getParam(csvGeneral, 'field2', 'vf-module-name', 'field3');
+ // rawJson['vf-module-type'] = getParam(csvGeneral, 'field2', 'vf-module-type', 'field3');
+ try {
+ rawJson['vf-module-model-name'] = getParam(csvGeneral, 'field2', 'vf-module-model-name', 'field3');
+ } catch (e) {
+ puts("\n\n");
+ puts("ERROR ERROR ERROR ERROR ERROR\n");
+ puts("Failed to find data field 'vf-module-model-name'. Maybe this preload worksheet is older?")
+ puts("If on the 'general' tab there is a field called 'vf-module-type' please rename it to 'vf-module-model-name'");
+ puts("\n\n");
+ process.exit();
+ }
+ rawJson['generic-vnf-name'] = getParam(csvGeneral, 'field2', 'vnf-name', 'field3');
+ rawJson['generic-vnf-type'] = getParam(csvGeneral, 'field2', 'vnf-type', 'field3');
+ rawJson['request-id'] = uuid.v1();
+ rawJson['source'] = "ADMINPORTAL";
+ rawJson['request-action'] = "PreloadVNFRequest";
+ rawJson['svc-request-id'] = uuid.v1();
+ rawJson['svc-action'] = "reserve";
+ puts('rawJson:');
+ putd(rawJson);
+ puts("\n");
+}
+
+function processAvailZones() {
+ var newZones = _.map(csvZones, function(x) { return {'availability-zone': x['field2']}; } );
+ rawJson['availability-zones'] = newZones;
+ puts("Availability zones read:");
+ putd(rawJson['availability-zones']);
+ puts("\n");
+}
+
+function processNetworks() {
+ var newNetworks = [];
+ csvNetworks.forEach( function(network) {
+ var netJson = {};
+ netJson["network-role"] = network.field2;
+ netJson["network-name"] = network.field3;
+ netJson["network-id"] = network.field4;
+ netJson["contrail-network-fqdn"] = network.field5;
+ netJson["subnet-name"] = network.field6;
+ netJson["subnet-id"] = network.field7;
+ netJson["ipv6-subnet-name"] = network.field8;
+ netJson["ipv6-subnet-id"] = network.field9;
+ newNetworks.push(netJson);
+ }
+ );
+ puts("networks:");
+ putd(newNetworks);
+ rawJson["networks"] = newNetworks;
+}
+
+function processVMs() {
+ var newVMs = [];
+ csvVMs.forEach( function(vm) {
+ var vmJson = {};
+ vmJson["vm-type"] = vm.field2;
+ vmJson["vm-name"] = vm.field3;
+ newVMs.push(vmJson);
+ }
+ );
+
+ puts("VMs:");
+ putd(newVMs);
+
+ // OK, now for each type, get count and then build vm-names array of the names
+ var vnfvms=[]
+ vmTypes = _.uniq(_.pluck(newVMs,'vm-type'));
+ vmTypes.forEach( function(vmType) {
+ puts(vmType);
+ var vmJson={};
+ var vmThisType;
+ var vmCount;
+ var vmNames=[];
+ var tmpNames;
+ vmThisType=_.select(newVMs, 'vm-type', vmType);
+ vmCount=vmThisType.length;
+ vmJson["vm-type"] = vmType;
+ vmJson["vm-count"] = vmCount;
+ tmpNames = _.pluck(vmThisType,'vm-name');
+ vmJson["vm-names"] = _.map(tmpNames, function(nam) { return {"vm-name": nam}; } );
+ netroles = _.select( rawJson["vm-networks"], "vm-type", vmType );
+ newnetroles=[]
+ netroles.forEach( function(netrole) {
+ tmpNetDetails = {};
+ tmpNetDetails["network-role"] = netrole["network-role"];
+ tmpNetDetails["use-dhcp"] = netrole["use-dhcp"];
+
+ var tmpipsThisVmType=[];
+ tmpipsThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);
+ var tmpips=[];
+ tmpips = _.select( tmpipsThisVmType, "network-role", netrole["network-role"]);
+ tmpipsJson = _.map(tmpips, function(ip) { return {"ip-address": ip["ip-address"]} } );
+ tmpipsJson = _.reject(tmpipsJson, function(o) { return (o["ip-address"]==undefined); } );
+ tmpNetDetails["network-ips"] = tmpipsJson;
+
+ var tmpipsv6ThisVmType=[];
+ tmpipsv6ThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);
+ var tmpipsv6=[];
+ tmpipsv6 = _.select( tmpipsv6ThisVmType, "network-role", netrole["network-role"]);
+ tmpipsv6Json = _.map(tmpipsv6, function(ip) { return {"ip-address-ipv6": ip["ipv6-address"]} } );
+ tmpipsv6Json = _.reject(tmpipsv6Json, function(o) { return (o["ip-address-ipv6"]==undefined); } );
+ tmpNetDetails["network-ips-v6"] = tmpipsv6Json;
+
+ var tmpirpThisVmType=[];
+ tmpirpThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);
+ var tmpirp=[];
+ tmpirp = _.select( tmpirpThisVmType, "network-role", netrole["network-role"]);
+ tmpirpJson = _.map(tmpirp, function(irp) { return {"interface-route-prefix-cidr": irp["interface-route-prefix"]} } );
+ tmpirpJson = _.reject(tmpirpJson, function(o) { return (o["interface-route-prefix-cidr"]==undefined); } );
+ tmpNetDetails["interface-route-prefixes"] = tmpirpJson;
+
+ var tmpmacsThisVmType=[];
+ tmpmacsThisVmType = _.select( rawJson["vm-net-macs"], "vm-type", vmType);
+ var tmpmacs=[];
+ tmpmacs = _.select( tmpmacsThisVmType, "network-role", netrole["network-role"]);
+ tmpmacsJson = _.map(tmpmacs, function(mac) { return {"mac-address": mac["mac-address"]} } );
+ tmpNetDetails["network-macs"] = tmpmacsJson;
+
+ var fip='';
+ fip = netrole["floating-ip"];
+ fip = _.trim(fip);
+ if (fip != '') {
+ tmpNetDetails["floating-ip"] = netrole["floating-ip"];
+ }
+
+ var fipv6='';
+ fipv6 = netrole["floating-ip-v6"];
+ fipv6 = _.trim(fipv6);
+ if (fipv6 != '') {
+ tmpNetDetails["floating-ip-v6"] = netrole["floating-ip-v6"];
+ }
+
+ newnetroles.push(tmpNetDetails);
+ }
+ );
+ vmJson["vm-networks"] = newnetroles;
+ putd(vmJson);
+ vnfvms.push(vmJson);
+ }
+ );
+ rawJson["vms"] = vnfvms;
+}
+
+function processVMnetworks() {
+ // For each VM type, for each Network role, get details like use-dhcp
+ var newVMnetworks = [];
+ csvVMnetworks.forEach( function(vm) {
+ var newvmJson = {};
+ newvmJson["vm-type"] = vm.field2;
+ newvmJson["network-role"] = vm.field3;
+ newvmJson["use-dhcp"] = vm.field4;
+ newvmJson["floating-ip"] = vm.field5;
+ newvmJson["floating-ip-v6"] = vm.field6;
+ newVMnetworks.push(newvmJson);
+ }
+ );
+ rawJson["vm-networks"] = newVMnetworks;
+ puts("rawJson for vm-networks...");
+ putd( rawJson["vm-networks"] );
+}
+
+
+function processVMnetips() {
+ // For each VM type, for each network role, get the set of network IPs
+ puts("Processing VM-net-ips");
+ var newVMnetips = [];
+ csvVMnetworkIPs.forEach( function(vm) {
+ var newvmnetipsJson = {};
+ newvmnetipsJson["vm-type"] = vm.field2;
+ newvmnetipsJson["network-role"] = vm.field3;
+ if (_.trim(vm.field4)!="") {
+ newvmnetipsJson["ip-address"] = vm.field4;
+ }
+ if (_.trim(vm.field5)!="") {
+ newvmnetipsJson["ipv6-address"] = vm.field5;
+ }
+ if (_.trim(vm.field6)!="") {
+ newvmnetipsJson["interface-route-prefix"] = vm.field6;
+ }
+ newVMnetips.push(newvmnetipsJson);
+ }
+ );
+ rawJson["vm-net-ips"] = newVMnetips;
+ puts("rawJson for vm-net-ips");
+ putd(rawJson["vm-net-ips"]);
+}
+
+function processVMnetmacs() {
+ // For each VM type, for each network role, get the set of MACs
+ puts("Processing VM-net-macs");
+ var newVMnetmacs = [];
+ csvVMnetworkMACs.forEach( function(vm) {
+ var newvmnetmacsJson = {};
+ newvmnetmacsJson["vm-type"] = vm.field2;
+ newvmnetmacsJson["network-role"] = vm.field3;
+ newvmnetmacsJson["mac-address"] = vm.field4;
+ newVMnetmacs.push(newvmnetmacsJson);
+ }
+ );
+ rawJson["vm-net-macs"] = newVMnetmacs;
+ puts("rawJson for vm-net-macs");
+ putd(rawJson["vm-net-macs"]);
+}
+
+function processTagValues() {
+ var newTagValues = _.map(csvTagValues, function(x) { return {'vnf-parameter-name': x['field2'],
+ 'vnf-parameter-value': x['field3']}; } );
+ rawJson['tag-values'] = newTagValues;
+ puts("Tag-values read:");
+ putd(rawJson['tag-values']);
+ puts("\n");
+}
+
+
diff --git a/admportal/shell/getAdmPortalProp.py b/admportal/shell/getAdmPortalProp.py
new file mode 100755
index 00000000..2e0ea797
--- /dev/null
+++ b/admportal/shell/getAdmPortalProp.py
@@ -0,0 +1,13 @@
+#!/usr/bin/python
+
+import json
+import sys
+import os
+
+propfile = os.getenv('SDNC_CONFIG_DIR') + '/admportal.json'
+
+from pprint import pprint
+
+with open(propfile) as data_file:
+ data = json.load(data_file)
+pprint( str(data[sys.argv[1]]))
diff --git a/admportal/shell/start.sh b/admportal/shell/start.sh
new file mode 100755
index 00000000..d8cb0fcd
--- /dev/null
+++ b/admportal/shell/start.sh
@@ -0,0 +1,11 @@
+#. ./set-http-env.sh
+#cd ../bin
+#cp ../config/config.json.http ../config/config.json
+. /etc/attappl.env
+. ${PROJECT_HOME}/etc/default.env
+
+MAIN_MENU=`python printMainMenu.py | sed -e 's|['\'']||g'`
+export MAIN_MENU
+
+cd ..
+pm2 startOrRestart process.http.json
diff --git a/admportal/shell/start_netdb.sh b/admportal/shell/start_netdb.sh
new file mode 100755
index 00000000..4a3d75ac
--- /dev/null
+++ b/admportal/shell/start_netdb.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+. /etc/attappl.env
+. ${PROJECT_HOME}/etc/default.env
+. ${PROJECT_HOME}/siteconfig/siteconf.info
+
+# only run on primary adm vm
+# ${Rank} comes from siteconf.info
+if [ ${Rank} == '1' ]; then
+ cd /opt/admportal/server
+ node ./netdb_updater.js -t ${1} -d ${2} >/dev/null 2>&1
+fi
diff --git a/admportal/shell/start_portal.sh b/admportal/shell/start_portal.sh
new file mode 100755
index 00000000..976502cd
--- /dev/null
+++ b/admportal/shell/start_portal.sh
@@ -0,0 +1,32 @@
+#. ./set-https-env.sh
+#cd ../bin
+#cp ../config/config.json.https ../config/config.json
+export PROJECT_HOME=/opt/openecomp/sdnc
+export PROJECT_RUNTIME_BASE=/opt/openecomp/sdnc
+#export JAVA_HOME=/usr/lib/jvm/java-7-oracle
+export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
+export SSL_ENABLED=false
+export SDNC_CONFIG_DIR=${PROJECT_HOME}/data/properties
+export NODE_ENV=production
+export CLASSPATH=$PROJECT_HOME/admportal/lib:$CLASSPATH
+
+PATH=${PATH}:${JAVA_HOME}/bin
+
+#. ${PROJECT_HOME}/etc/default.env
+
+MAIN_MENU=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py MainMenu | sed -e 's|['\'']||g'`
+export MAIN_MENU
+SSL_ENABLED=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py sslEnabled | sed -e 's|['\'']||g'`
+export SSL_ENABLED
+
+if [ ! -d /opt/openecomp/sdnc/admportal/node_modules ]; then
+ cd /opt/openecomp/sdnc/admportal && npm install
+fi
+
+cd /opt/openecomp/sdnc/admportal
+node shell/www
+#if [ "true" == "${SSL_ENABLED}" ]; then
+ #pm2 startOrRestart process.https.json
+#else
+ #pm2 startOrRestart process.http.json
+#fi
diff --git a/admportal/shell/startssl.sh b/admportal/shell/startssl.sh
new file mode 100755
index 00000000..a56570e3
--- /dev/null
+++ b/admportal/shell/startssl.sh
@@ -0,0 +1,28 @@
+#. ./set-https-env.sh
+#cd ../bin
+#cp ../config/config.json.https ../config/config.json
+export PROJECT_HOME=/opt/openecomp/sdnc
+export PROJECT_RUNTIME_BASE=/opt/openecomp/sdnc
+#export JAVA_HOME=/usr/lib/jvm/java-7-oracle
+export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
+export SSL_ENABLED=false
+export SDNC_CONFIG_DIR=${PROJECT_HOME}/data/properties
+export NODE_ENV=production
+export CLASSPATH=$PROJECT_HOME/admportal/lib:$CLASSPATH
+
+PATH=${PATH}:${JAVA_HOME}/bin
+
+#. ${PROJECT_HOME}/etc/default.env
+
+MAIN_MENU=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py MainMenu | sed -e 's|['\'']||g'`
+export MAIN_MENU
+SSL_ENABLED=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py sslEnabled | sed -e 's|['\'']||g'`
+export SSL_ENABLED
+
+cd ..
+node bin/www
+#if [ "true" == "${SSL_ENABLED}" ]; then
+ #pm2 startOrRestart process.https.json
+#else
+ #pm2 startOrRestart process.http.json
+#fi
diff --git a/admportal/shell/stop.sh b/admportal/shell/stop.sh
new file mode 100644
index 00000000..404c2fbd
--- /dev/null
+++ b/admportal/shell/stop.sh
@@ -0,0 +1,2 @@
+pm2 stop http_admportal
+pm2 kill
diff --git a/admportal/shell/stopssl.sh b/admportal/shell/stopssl.sh
new file mode 100755
index 00000000..a71de61e
--- /dev/null
+++ b/admportal/shell/stopssl.sh
@@ -0,0 +1,13 @@
+. /etc/attappl.env
+. ${PROJECT_HOME}/etc/default.env
+
+SSL_ENABLED=`python /opt/admportal/shell/getAdmPortalProp.py sslEnabled | sed -e 's|['\'']||g'`
+export SSL_ENABLED
+
+cd ..
+if [ "true" == "${SSL_ENABLED}" ]; then
+ pm2 stop admportal8443
+else
+ pm2 stop http_admportal
+fi
+pm2 kill
diff --git a/admportal/shell/svclogic.sh b/admportal/shell/svclogic.sh
new file mode 100644
index 00000000..aca6bf1f
--- /dev/null
+++ b/admportal/shell/svclogic.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+###
+# ============LICENSE_START=======================================================
+# openECOMP : SDN-C
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+BASEDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"
+JARDIR=${BASEDIR}/lib
+
+for jar in $JARDIR/*.jar
+do
+ CLASSPATH=$CLASSPATH:${jar}
+done
+
+java -cp ${CLASSPATH}:${MYSQL_JDBC_DRIVER} org.openecomp.sdnc.sli.SvcLogicParser $*
diff --git a/admportal/shell/www b/admportal/shell/www
new file mode 100755
index 00000000..29710dbb
--- /dev/null
+++ b/admportal/shell/www
@@ -0,0 +1,14 @@
+#!/usr/bin/env node
+var debug = require('debug')('admportal');
+var app = require('../server/app');
+var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json');
+var out_file = "/opt/openecomp/sdnc/admportal/logs/http_admportal.log";
+var error_file = "/opt/openecomp/sdnc/admportal/logs/error_http_admportal.log";
+var cwd = "/opt/openecomp/sdnc/admportal";
+
+app.set('port', properties.nonSslPort || 8181 );
+
+var server = app.listen(app.get('port'), function() {
+ console.log('Express server listening on port ' + server.address().port);
+ debug('Express server listening on port ' + server.address().port);
+});
diff --git a/admportal/src/assembly/assemble_zip.xml b/admportal/src/assembly/assemble_zip.xml
new file mode 100644
index 00000000..46763c81
--- /dev/null
+++ b/admportal/src/assembly/assemble_zip.xml
@@ -0,0 +1,101 @@
+<!--
+ ============LICENSE_START=======================================================
+ openECOMP : SDN-C
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property. All rights
+ reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+ -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+ <formats>
+ <format>zip</format>
+ </formats>
+
+ <includeBaseDirectory>false</includeBaseDirectory>
+
+ <fileSets>
+ <fileSet>
+ <directory>bin</directory>
+ <outputDirectory>admportal/bin</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>certs</directory>
+ <outputDirectory>admportal/certs</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>config</directory>
+ <outputDirectory>admportal/config</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>lib</directory>
+ <outputDirectory>admportal/lib</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>node_modules</directory>
+ <outputDirectory>admportal/node_modules</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>public</directory>
+ <outputDirectory>admportal/public</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>routes</directory>
+ <outputDirectory>admportal/routes</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>server</directory>
+ <outputDirectory>admportal/server</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>shell</directory>
+ <outputDirectory>admportal/shell</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>uploads</directory>
+ <outputDirectory>admportal/uploads</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>test</directory>
+ <outputDirectory>admportal/test</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>views</directory>
+ <outputDirectory>admportal/views</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>.</directory>
+ <outputDirectory>admportal/</outputDirectory>
+ <includes>
+ <include>*.json</include>
+ <include>README</include>
+ </includes>
+ </fileSet>
+ <fileSet>
+ <directory>target/lib</directory>
+ <outputDirectory>admportal/lib</outputDirectory>
+ <includes>
+ <include>*.jar</include>
+ </includes>
+ </fileSet>
+ </fileSets>
+
+
+</assembly>
diff --git a/admportal/src/main/swm/deinstall/postproc/post_proc b/admportal/src/main/swm/deinstall/postproc/post_proc
new file mode 100644
index 00000000..09e4ca85
--- /dev/null
+++ b/admportal/src/main/swm/deinstall/postproc/post_proc
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+exit 0;
+
diff --git a/admportal/src/main/swm/deinstall/preproc/pre_proc b/admportal/src/main/swm/deinstall/preproc/pre_proc
new file mode 100644
index 00000000..09e4ca85
--- /dev/null
+++ b/admportal/src/main/swm/deinstall/preproc/pre_proc
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+exit 0;
+
diff --git a/admportal/src/main/swm/fallback/postproc/post_proc b/admportal/src/main/swm/fallback/postproc/post_proc
new file mode 100644
index 00000000..09e4ca85
--- /dev/null
+++ b/admportal/src/main/swm/fallback/postproc/post_proc
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+exit 0;
+
diff --git a/admportal/src/main/swm/fallback/preproc/pre_proc b/admportal/src/main/swm/fallback/preproc/pre_proc
new file mode 100644
index 00000000..09e4ca85
--- /dev/null
+++ b/admportal/src/main/swm/fallback/preproc/pre_proc
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+exit 0;
+
diff --git a/admportal/src/main/swm/initinst/postproc/post_proc b/admportal/src/main/swm/initinst/postproc/post_proc
new file mode 100644
index 00000000..09e4ca85
--- /dev/null
+++ b/admportal/src/main/swm/initinst/postproc/post_proc
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+exit 0;
+
diff --git a/admportal/src/main/swm/initinst/preproc/pre_proc b/admportal/src/main/swm/initinst/preproc/pre_proc
new file mode 100644
index 00000000..09e4ca85
--- /dev/null
+++ b/admportal/src/main/swm/initinst/preproc/pre_proc
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+exit 0;
+
diff --git a/admportal/src/main/swm/install/postproc/post_proc b/admportal/src/main/swm/install/postproc/post_proc
new file mode 100644
index 00000000..09e4ca85
--- /dev/null
+++ b/admportal/src/main/swm/install/postproc/post_proc
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+exit 0;
+
diff --git a/admportal/src/main/swm/install/preproc/pre_proc b/admportal/src/main/swm/install/preproc/pre_proc
new file mode 100644
index 00000000..a8f5979a
--- /dev/null
+++ b/admportal/src/main/swm/install/preproc/pre_proc
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exit 0;
diff --git a/admportal/src/main/swm/notes.txt b/admportal/src/main/swm/notes.txt
new file mode 100644
index 00000000..7fd88fbd
--- /dev/null
+++ b/admportal/src/main/swm/notes.txt
@@ -0,0 +1,3 @@
+${groupId} ${artifactId} ${project.version}-${build.number}
+${SWM_VERSION}
+
diff --git a/admportal/test/YYYYMMDDHH_ctag_pool.csv b/admportal/test/YYYYMMDDHH_ctag_pool.csv
new file mode 100644
index 00000000..80102f78
--- /dev/null
+++ b/admportal/test/YYYYMMDDHH_ctag_pool.csv
@@ -0,0 +1,1501 @@
+#vlan_id,aic_site_id,azone,vplspe,purpose
+2001,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2002,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2003,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2004,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2005,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2006,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2007,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2008,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2009,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2010,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2011,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2012,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2013,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2014,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2015,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2016,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2017,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2018,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2019,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2020,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2021,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2022,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2023,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2024,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2025,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2026,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2027,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2028,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2029,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2030,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2031,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2032,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2033,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2034,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2035,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2036,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2037,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2038,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2039,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2040,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2041,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2042,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2043,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2044,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2045,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2046,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2047,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2048,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2049,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2050,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2051,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2052,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2053,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2054,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2055,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2056,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2057,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2058,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2059,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2060,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2061,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2062,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2063,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2064,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2065,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2066,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2067,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2068,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2069,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2070,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2071,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2072,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2073,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2074,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2075,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2076,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2077,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2078,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2079,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2080,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2081,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2082,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2083,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2084,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2085,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2086,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2087,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2088,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2089,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2090,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2091,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2092,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2093,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2094,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2095,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2096,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2097,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2098,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2099,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2100,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2101,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2102,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2103,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2104,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2105,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2106,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2107,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2108,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2109,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2110,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2111,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2112,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2113,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2114,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2115,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2116,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2117,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2118,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2119,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2120,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2121,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2122,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2123,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2124,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2125,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2126,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2127,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2128,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2129,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2130,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2131,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2132,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2133,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2134,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2135,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2136,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2137,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2138,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2139,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2140,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2141,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2142,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2143,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2144,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2145,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2146,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2147,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2148,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2149,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2150,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2151,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2152,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2153,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2154,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2155,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2156,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2157,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2158,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2159,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2160,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2161,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2162,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2163,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2164,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2165,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2166,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2167,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2168,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2169,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2170,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2171,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2172,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2173,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2174,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2175,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2176,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2177,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2178,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2179,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2180,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2181,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2182,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2183,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2184,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2185,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2186,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2187,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2188,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2189,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2190,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2191,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2192,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2193,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2194,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2195,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2196,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2197,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2198,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2199,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2200,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2201,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2202,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2203,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2204,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2205,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2206,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2207,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2208,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2209,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2210,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2211,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2212,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2213,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2214,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2215,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2216,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2217,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2218,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2219,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2220,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2221,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2222,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2223,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2224,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2225,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2226,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2227,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2228,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2229,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2230,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2231,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2232,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2233,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2234,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2235,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2236,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2237,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2238,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2239,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2240,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2241,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2242,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2243,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2244,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2245,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2246,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2247,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2248,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2249,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2250,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2251,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2252,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2253,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2254,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2255,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2256,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2257,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2258,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2259,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2260,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2261,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2262,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2263,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2264,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2265,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2266,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2267,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2268,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2269,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2270,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2271,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2272,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2273,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2274,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2275,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2276,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2277,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2278,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2279,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2280,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2281,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2282,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2283,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2284,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2285,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2286,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2287,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2288,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2289,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2290,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2291,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2292,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2293,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2294,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2295,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2296,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2297,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2298,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2299,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2300,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2301,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2302,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2303,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2304,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2305,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2306,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2307,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2308,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2309,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2310,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2311,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2312,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2313,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2314,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2315,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2316,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2317,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2318,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2319,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2320,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2321,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2322,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2323,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2324,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2325,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2326,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2327,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2328,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2329,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2330,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2331,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2332,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2333,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2334,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2335,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2336,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2337,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2338,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2339,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2340,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2341,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2342,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2343,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2344,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2345,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2346,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2347,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2348,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2349,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2350,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2351,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2352,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2353,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2354,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2355,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2356,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2357,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2358,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2359,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2360,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2361,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2362,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2363,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2364,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2365,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2366,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2367,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2368,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2369,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2370,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2371,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2372,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2373,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2374,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2375,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2376,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2377,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2378,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2379,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2380,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2381,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2382,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2383,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2384,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2385,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2386,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2387,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2388,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2389,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2390,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2391,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2392,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2393,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2394,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2395,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2396,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2397,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2398,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2399,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2400,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2401,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2402,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2403,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2404,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2405,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2406,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2407,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2408,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2409,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2410,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2411,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2412,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2413,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2414,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2415,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2416,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2417,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2418,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2419,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2420,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2421,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2422,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2423,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2424,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2425,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2426,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2427,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2428,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2429,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2430,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2431,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2432,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2433,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2434,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2435,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2436,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2437,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2438,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2439,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2440,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2441,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2442,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2443,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2444,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2445,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2446,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2447,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2448,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2449,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2450,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2451,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2452,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2453,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2454,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2455,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2456,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2457,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2458,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2459,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2460,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2461,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2462,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2463,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2464,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2465,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2466,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2467,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2468,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2469,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2470,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2471,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2472,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2473,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2474,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2475,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2476,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2477,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2478,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2479,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2480,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2481,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2482,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2483,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2484,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2485,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2486,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2487,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2488,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2489,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2490,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2491,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2492,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2493,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2494,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2495,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2496,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2497,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2498,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2499,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2500,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2501,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2502,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2503,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2504,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2505,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2506,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2507,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2508,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2509,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2510,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2511,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2512,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2513,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2514,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2515,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2516,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2517,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2518,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2519,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2520,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2521,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2522,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2523,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2524,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2525,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2526,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2527,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2528,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2529,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2530,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2531,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2532,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2533,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2534,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2535,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2536,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2537,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2538,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2539,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2540,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2541,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2542,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2543,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2544,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2545,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2546,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2547,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2548,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2549,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2550,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2551,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2552,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2553,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2554,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2555,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2556,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2557,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2558,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2559,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2560,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2561,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2562,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2563,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2564,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2565,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2566,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2567,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2568,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2569,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2570,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2571,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2572,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2573,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2574,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2575,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2576,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2577,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2578,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2579,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2580,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2581,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2582,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2583,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2584,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2585,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2586,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2587,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2588,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2589,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2590,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2591,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2592,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2593,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2594,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2595,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2596,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2597,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2598,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2599,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2600,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2601,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2602,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2603,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2604,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2605,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2606,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2607,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2608,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2609,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2610,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2611,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2612,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2613,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2614,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2615,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2616,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2617,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2618,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2619,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2620,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2621,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2622,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2623,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2624,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2625,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2626,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2627,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2628,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2629,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2630,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2631,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2632,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2633,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2634,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2635,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2636,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2637,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2638,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2639,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2640,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2641,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2642,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2643,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2644,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2645,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2646,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2647,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2648,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2649,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2650,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2651,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2652,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2653,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2654,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2655,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2656,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2657,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2658,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2659,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2660,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2661,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2662,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2663,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2664,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2665,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2666,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2667,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2668,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2669,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2670,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2671,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2672,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2673,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2674,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2675,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2676,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2677,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2678,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2679,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2680,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2681,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2682,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2683,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2684,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2685,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2686,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2687,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2688,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2689,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2690,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2691,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2692,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2693,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2694,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2695,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2696,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2697,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2698,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2699,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2700,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2701,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2702,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2703,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2704,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2705,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2706,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2707,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2708,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2709,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2710,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2711,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2712,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2713,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2714,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2715,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2716,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2717,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2718,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2719,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2720,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2721,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2722,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2723,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2724,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2725,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2726,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2727,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2728,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2729,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2730,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2731,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2732,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2733,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2734,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2735,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2736,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2737,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2738,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2739,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2740,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2741,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2742,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2743,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2744,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2745,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2746,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2747,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2748,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2749,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2750,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2751,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2752,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2753,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2754,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2755,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2756,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2757,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2758,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2759,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2760,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2761,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2762,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2763,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2764,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2765,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2766,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2767,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2768,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2769,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2770,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2771,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2772,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2773,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2774,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2775,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2776,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2777,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2778,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2779,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2780,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2781,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2782,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2783,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2784,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2785,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2786,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2787,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2788,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2789,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2790,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2791,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2792,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2793,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2794,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2795,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2796,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2797,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2798,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2799,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2800,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2801,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2802,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2803,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2804,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2805,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2806,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2807,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2808,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2809,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2810,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2811,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2812,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2813,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2814,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2815,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2816,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2817,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2818,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2819,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2820,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2821,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2822,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2823,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2824,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2825,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2826,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2827,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2828,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2829,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2830,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2831,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2832,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2833,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2834,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2835,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2836,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2837,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2838,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2839,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2840,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2841,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2842,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2843,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2844,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2845,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2846,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2847,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2848,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2849,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2850,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2851,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2852,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2853,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2854,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2855,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2856,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2857,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2858,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2859,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2860,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2861,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2862,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2863,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2864,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2865,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2866,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2867,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2868,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2869,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2870,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2871,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2872,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2873,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2874,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2875,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2876,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2877,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2878,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2879,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2880,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2881,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2882,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2883,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2884,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2885,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2886,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2887,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2888,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2889,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2890,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2891,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2892,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2893,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2894,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2895,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2896,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2897,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2898,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2899,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2900,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2901,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2902,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2903,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2904,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2905,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2906,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2907,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2908,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2909,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2910,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2911,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2912,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2913,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2914,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2915,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2916,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2917,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2918,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2919,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2920,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2921,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2922,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2923,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2924,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2925,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2926,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2927,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2928,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2929,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2930,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2931,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2932,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2933,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2934,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2935,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2936,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2937,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2938,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2939,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2940,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2941,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2942,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2943,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2944,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2945,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2946,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2947,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2948,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2949,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2950,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2951,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2952,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2953,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2954,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2955,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2956,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2957,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2958,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2959,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2960,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2961,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2962,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2963,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2964,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2965,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2966,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2967,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2968,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2969,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2970,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2971,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2972,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2973,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2974,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2975,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2976,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2977,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2978,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2979,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2980,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2981,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2982,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2983,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2984,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2985,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2986,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2987,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2988,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2989,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2990,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2991,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2992,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2993,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2994,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2995,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2996,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2997,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2998,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+2999,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3000,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3001,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3002,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3003,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3004,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3005,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3006,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3007,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3008,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3009,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3010,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3011,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3012,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3013,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3014,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3015,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3016,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3017,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3018,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3019,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3020,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3021,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3022,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3023,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3024,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3025,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3026,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3027,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3028,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3029,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3030,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3031,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3032,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3033,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3034,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3035,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3036,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3037,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3038,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3039,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3040,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3041,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3042,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3043,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3044,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3045,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3046,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3047,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3048,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3049,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3050,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3051,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3052,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3053,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3054,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3055,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3056,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3057,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3058,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3059,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3060,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3061,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3062,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3063,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3064,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3065,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3066,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3067,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3068,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3069,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3070,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3071,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3072,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3073,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3074,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3075,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3076,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3077,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3078,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3079,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3080,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3081,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3082,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3083,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3084,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3085,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3086,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3087,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3088,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3089,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3090,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3091,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3092,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3093,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3094,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3095,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3096,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3097,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3098,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3099,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3100,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3101,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3102,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3103,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3104,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3105,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3106,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3107,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3108,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3109,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3110,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3111,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3112,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3113,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3114,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3115,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3116,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3117,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3118,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3119,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3120,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3121,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3122,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3123,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3124,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3125,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3126,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3127,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3128,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3129,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3130,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3131,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3132,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3133,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3134,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3135,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3136,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3137,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3138,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3139,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3140,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3141,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3142,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3143,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3144,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3145,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3146,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3147,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3148,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3149,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3150,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3151,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3152,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3153,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3154,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3155,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3156,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3157,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3158,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3159,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3160,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3161,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3162,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3163,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3164,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3165,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3166,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3167,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3168,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3169,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3170,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3171,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3172,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3173,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3174,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3175,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3176,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3177,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3178,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3179,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3180,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3181,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3182,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3183,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3184,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3185,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3186,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3187,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3188,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3189,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3190,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3191,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3192,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3193,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3194,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3195,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3196,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3197,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3198,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3199,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3200,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3201,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3202,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3203,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3204,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3205,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3206,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3207,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3208,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3209,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3210,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3211,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3212,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3213,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3214,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3215,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3216,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3217,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3218,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3219,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3220,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3221,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3222,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3223,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3224,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3225,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3226,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3227,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3228,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3229,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3230,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3231,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3232,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3233,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3234,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3235,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3236,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3237,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3238,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3239,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3240,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3241,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3242,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3243,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3244,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3245,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3246,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3247,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3248,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3249,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3250,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3251,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3252,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3253,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3254,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3255,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3256,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3257,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3258,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3259,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3260,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3261,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3262,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3263,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3264,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3265,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3266,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3267,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3268,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3269,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3270,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3271,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3272,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3273,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3274,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3275,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3276,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3277,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3278,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3279,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3280,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3281,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3282,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3283,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3284,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3285,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3286,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3287,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3288,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3289,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3290,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3291,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3292,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3293,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3294,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3295,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3296,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3297,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3298,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3299,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3300,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3301,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3302,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3303,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3304,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3305,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3306,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3307,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3308,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3309,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3310,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3311,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3312,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3313,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3314,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3315,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3316,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3317,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3318,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3319,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3320,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3321,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3322,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3323,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3324,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3325,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3326,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3327,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3328,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3329,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3330,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3331,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3332,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3333,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3334,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3335,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3336,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3337,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3338,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3339,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3340,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3341,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3342,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3343,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3344,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3345,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3346,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3347,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3348,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3349,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3350,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3351,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3352,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3353,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3354,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3355,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3356,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3357,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3358,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3359,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3360,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3361,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3362,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3363,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3364,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3365,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3366,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3367,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3368,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3369,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3370,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3371,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3372,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3373,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3374,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3375,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3376,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3377,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3378,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3379,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3380,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3381,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3382,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3383,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3384,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3385,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3386,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3387,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3388,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3389,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3390,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3391,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3392,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3393,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3394,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3395,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3396,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3397,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3398,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3399,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3400,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3401,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3402,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3403,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3404,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3405,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3406,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3407,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3408,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3409,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3410,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3411,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3412,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3413,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3414,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3415,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3416,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3417,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3418,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3419,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3420,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3421,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3422,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3423,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3424,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3425,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3426,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3427,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3428,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3429,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3430,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3431,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3432,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3433,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3434,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3435,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3436,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3437,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3438,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3439,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3440,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3441,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3442,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3443,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3444,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3445,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3446,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3447,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3448,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3449,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3450,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3451,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3452,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3453,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3454,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3455,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3456,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3457,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3458,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3459,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3460,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3461,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3462,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3463,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3464,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3465,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3466,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3467,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3468,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3469,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3470,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3471,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3472,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3473,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3474,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3475,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3476,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3477,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3478,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3479,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3480,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3481,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3482,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3483,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3484,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3485,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3486,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3487,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3488,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3489,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3490,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3491,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3492,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3493,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3494,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3495,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3496,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3497,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3498,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3499,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+3500,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
diff --git a/admportal/test/eipam/sample.xml b/admportal/test/eipam/sample.xml
new file mode 100644
index 00000000..c058ecf1
--- /dev/null
+++ b/admportal/test/eipam/sample.xml
@@ -0,0 +1,36 @@
+<aw:PurchaseOrder
+ aw:PurchaseOrderNumber="99503"
+ aw:OrderDate="1999-10-20"
+ xmlns:aw="http://www.adventure-works.com">
+ <aw:Address aw:Type="Shipping">
+ <aw:Name>Ellen Adams</aw:Name>
+ <aw:Street>123 Maple Street</aw:Street>
+ <aw:City>Mill Valley</aw:City>
+ <aw:State>CA</aw:State>
+ <aw:Zip>10999</aw:Zip>
+ <aw:Country>USA</aw:Country>
+ </aw:Address>
+ <aw:Address aw:Type="Billing">
+ <aw:Name>Tai Yee</aw:Name>
+ <aw:Street>8 Oak Avenue</aw:Street>
+ <aw:City>Old Town</aw:City>
+ <aw:State>PA</aw:State>
+ <aw:Zip>95819</aw:Zip>
+ <aw:Country>USA</aw:Country>
+ </aw:Address>
+ <aw:DeliveryNotes>Please leave packages in shed by driveway.</aw:DeliveryNotes>
+ <aw:Items>
+ <aw:Item aw:PartNumber="872-AA">
+ <aw:ProductName>Lawnmower</aw:ProductName>
+ <aw:Quantity>1</aw:Quantity>
+ <aw:USPrice>148.95</aw:USPrice>
+ <aw:Comment>Confirm this is electric</aw:Comment>
+ </aw:Item>
+ <aw:Item aw:PartNumber="926-AA">
+ <aw:ProductName>Baby Monitor</aw:ProductName>
+ <aw:Quantity>2</aw:Quantity>
+ <aw:USPrice>39.98</aw:USPrice>
+ <aw:ShipDate>1999-05-21</aw:ShipDate>
+ </aw:Item>
+ </aw:Items>
+</aw:PurchaseOrder>
diff --git a/admportal/test/gen.sh b/admportal/test/gen.sh
new file mode 100755
index 00000000..8c7928df
--- /dev/null
+++ b/admportal/test/gen.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+for i in `seq 2001 3500`;do
+ echo $i,MDTWNJ21A401,a2stx,auttx301vr1,IPAG-CTAG
+done
diff --git a/admportal/uploads/temp b/admportal/uploads/temp
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/admportal/uploads/temp
diff --git a/admportal/views/admin/list_usertrace.ejs b/admportal/views/admin/list_usertrace.ejs
new file mode 100644
index 00000000..799288a7
--- /dev/null
+++ b/admportal/views/admin/list_usertrace.ejs
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <title>SDN-C AdminPortal</title>
+</head>
+
+<body>
+
+<div class="actions" style="padding:0px 25px;">
+<h2>User Trace</h2>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'><%=result.msg %></div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'><%=result.msg %></div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+ <div class="actions" style="padding:15px 0px;">
+
+ </div>
+ <div class="content">
+ <table class="table table-hover">
+ <thead>
+ <tr>
+ <th>Date</th>
+ <th>ATTUID</th>
+ <th>Action</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% if (rows) {
+ rows.forEach(function(row) { %>
+ <tr>
+ <td><%= row.date %></td>
+ <td><%= row.attuid %></td>
+ <td><%= row.action %></td>
+ <td><%= row.description %></td>
+ </tr>
+ <% }); }; %>
+ </tbody>
+ </table>
+ </div>
+
+ <footer>
+ <% include ../partials/footer %>
+ </footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/admin/parameters.ejs b/admportal/views/admin/parameters.ejs
new file mode 100644
index 00000000..247abc58
--- /dev/null
+++ b/admportal/views/admin/parameters.ejs
@@ -0,0 +1,181 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#params').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Parameters</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#new_parameter">
+ Add Parameter
+ </button>
+</div>
+
+ <table id="params" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*Name</th>
+ <th>*Value</th>
+ <th>Category</th>
+ <th>Memo</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.name %></td>
+ <td><%= row.value %></td>
+ <td><%= row.category %></td>
+ <td><%= row.memo %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateParameter('<%=row.name %>','<%= row.value %>','<%= row.category %>','<%= row.memo %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteParameter('<%= row.name %>','<%=row.value %>','<%= row.category %>','<%= row.memo %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+</div>
+
+<% include ../partials/new_parameter %>
+<% include ../partials/update_parameter %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitParam(form)
+{
+ var errorMsg='';
+ var name = '';
+ var value = '';
+ var category = '';
+ var memo = '';
+
+ if ( form.name == 'addForm' )
+ {
+ name = form.nf_name;
+ value = form.nf_value;
+ category = form.nf_category;
+ memo = form.nf_memo;
+ }
+ else
+ {
+ name = form.uf_name;
+ value = form.uf_value;
+ category = form.uf_category;
+ memo = form.uf_memo;
+ }
+
+ if ( (name.value == null) || (name.value == "") || isblank(name.value) )
+ {
+ errorMsg += 'Name is required.<br>';
+ }
+ if ( (value.value == null) || (value.value == "") || isblank(value.value) )
+ {
+ errorMsg += 'Value is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ form.submit();
+}
+
+
+function updateParameter(name,value,category,memo) {
+
+ document.getElementById('uf_name').value=name;
+ document.getElementById('uf_value').value=value
+ document.getElementById('uf_category').value=category;
+ document.getElementById('uf_memo').value=memo;
+
+ document.getElementById('uf_key_name').value=name;
+
+ $('#update_parameter').modal('show');
+}
+
+function deleteParameter(name,value,category,memo) {
+
+ var url_string = encodeURI("/admin/deleteParameter?name=" + name
+ + "&value=" + value
+ + "&category=" + category
+ + "&memo=" + memo);
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete PARAMETER [" + name + "][" + value + "] ?",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/css_delete/bootstrap-theme.min.css b/admportal/views/css_delete/bootstrap-theme.min.css
new file mode 100644
index 00000000..4c3e7bad
--- /dev/null
+++ b/admportal/views/css_delete/bootstrap-theme.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:hover,.btn-primary:focus{background-color:#265a88;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#265a88;border-color:#245580}.btn-primary:disabled,.btn-primary[disabled]{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file
diff --git a/admportal/views/css_delete/bootstrap.min.css b/admportal/views/css_delete/bootstrap.min.css
new file mode 100644
index 00000000..b6fe4e0f
--- /dev/null
+++ b/admportal/views/css_delete/bootstrap.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:before,:after{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important;visibility:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file
diff --git a/admportal/views/error.ejs b/admportal/views/error.ejs
new file mode 100644
index 00000000..7cf94edf
--- /dev/null
+++ b/admportal/views/error.ejs
@@ -0,0 +1,3 @@
+<h1><%= message %></h1>
+<h2><%= error.status %></h2>
+<pre><%= error.stack %></pre>
diff --git a/admportal/views/gamma/list.ejs b/admportal/views/gamma/list.ejs
new file mode 100644
index 00000000..cf89a093
--- /dev/null
+++ b/admportal/views/gamma/list.ejs
@@ -0,0 +1,162 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vlan_id_pool').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>NoD VLAN ID POOL</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+<div class="container-fluid">
+ <table id="vlan_id_pool" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>AIC Site ID</th>
+ <th>Purpose</th>
+ <th>VLAN ID</th>
+ <th>VLPSPE Name</th>
+ <th>Availability Zone</th>
+ <th>Status</th>
+ <th>Svc Instance ID</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.aic_site_id %></td>
+ <td><%= row.purpose %></td>
+ <td><%= row.vlan_id %></td>
+ <td><%= row.vplspe_name %></td>
+ <td><%= row.availability_zone %></td>
+ <td><%= row.status %></td>
+ <td><%= row.svc_instance_id %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateVlanPool('<%=row.aic_site_id %>','<%= row.availability_zone %>',
+ '<%= row.purpose %>','<%= row.vlan_id %>','<%= row.status %>',
+ '<%= row.svc_instance_id %>','<%= row.vplspe_name %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteVlanPool('<%=row.aic_site_id %>', '<%= row.purpose %>',
+ '<%= row.vlan_id %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+<!--
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/gamma/uploadVLAN" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <% if(priv == 'A') { %>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } else { %>
+ <button type="button" class="btn btn-default disabled"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } %>
+ </form>
+ </div>
+ <% } %>
+-->
+</div>
+
+<% include ../partials/update_vlan_id_pool %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function updateVlanPool(aic_site_id,availability_zone,purpose,vlan_id,status,svc_instance_id,vplspe_name) {
+
+ document.getElementById('uf_aic_site_id').value=aic_site_id;
+ document.getElementById('uf_availability_zone').value=availability_zone
+ document.getElementById('uf_purpose').value=purpose;
+ document.getElementById('uf_vlan_id').value=vlan_id;
+ document.getElementById('uf_status').value=status;
+ document.getElementById('uf_svc_instance_id').value=svc_instance_id;
+ document.getElementById('uf_vplspe_name').value=vplspe_name;
+
+ document.getElementById('uf_key_aic_site_id').value=aic_site_id;
+ document.getElementById('uf_key_purpose').value=purpose;
+ document.getElementById('uf_key_vlan_id').value=vlan_id;
+ $('#update_vlan_id_pool_modal').modal('show');
+}
+
+function deleteVlanPool(aic_site_id,purpose,vlan_id) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete VLAN Id [" + aic_site_id + "][" + purpose + "][" + vlan_id + "] ?",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/gamma/deleteVlanPool?aic_site_id=" + aic_site_id + "&purpose=" + purpose + "&vlan_id=" + vlan_id);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/gamma/listAicAvailZone.ejs b/admportal/views/gamma/listAicAvailZone.ejs
new file mode 100644
index 00000000..7d0b7bde
--- /dev/null
+++ b/admportal/views/gamma/listAicAvailZone.ejs
@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+
+<script class="init">
+ $(document).ready(function() {
+ $('#availability_zone').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>AIC Availabilty Zone Pool</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+ <table id="availability_zone" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>AIC Site ID</th>
+ <th>Availability Zone</th>
+ <th>Token</th>
+ <th>Service Type</th>
+ <th>Status</th>
+ <th>VNF ID</th>
+ <th>VNF Type</th>
+ <th>Hypervisor</th>
+ <% if(priv == 'A') { %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.aic_site_id %></td>
+ <td><%= row.availability_zone %></td>
+ <td><%= row.token %></td>
+ <td><%= row.service_type %></td>
+ <td><%= row.status %></td>
+ <td><%= row.vnf_id %></td>
+ <td><%= row.vnf_type %></td>
+ <td><%= row.hypervisor %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateAicAvailZone('<%=row.aic_site_id %>','<%= row.availability_zone %>','<%= row.token %>','<%= row.service_type %>','<%= row.status %>','<%= row.vnf_id %>','<%= row.vnf_type %>','<%= row.hypervisor %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteZone('<%=row.aic_site_id %>','<%= row.availability_zone %>', '<%= row.token %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+
+<!--
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/gamma/uploadAicAvailZone" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <% if(priv == 'A') { %>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } else { %>
+ <button type="button" class="btn btn-default disabled"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } %>
+ </form>
+ </div>
+ <% } %>
+-->
+</div>
+
+<% include ../partials/update_aic_avail_zone %>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function updateAicAvailZone(aic_site_id,availability_zone,token,service_type,status,vnf_id,vnf_type,hypervisor) {
+
+ document.getElementById('uf_aic_site_id').value=aic_site_id;
+ document.getElementById('uf_availability_zone').value=availability_zone
+ document.getElementById('uf_token').value=token;
+ document.getElementById('uf_service_type').value=service_type;
+ document.getElementById('uf_status').value=status;
+ document.getElementById('uf_vnf_id').value=vnf_id;
+ document.getElementById('uf_vnf_type').value=vnf_type;
+ document.getElementById('uf_hypervisor').value=hypervisor;
+ document.getElementById('uf_key_aic_site_id').value=aic_site_id;
+ document.getElementById('uf_key_availability_zone').value=availability_zone
+ document.getElementById('uf_key_token').value=token;
+ $('#update_aic_avail_zone_modal').modal('show');
+}
+
+function deleteZone(siteid,azone,token) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete zone [" + siteid + "][" + azone + "][" + token + "] ?",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/gamma/deleteZone?siteid=" + siteid + "&azone=" + azone + "&token=" + token);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+</script>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/gamma/listAicSwitch.ejs b/admportal/views/gamma/listAicSwitch.ejs
new file mode 100644
index 00000000..659652c3
--- /dev/null
+++ b/admportal/views/gamma/listAicSwitch.ejs
@@ -0,0 +1,156 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+
+ <script class="init">
+ $(document).ready(function() {
+ $('#switch').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+ } );
+ </script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>AIC Switch</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+ <table id="switch" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Physical Network Name</th>
+ <th>Switch Name</th>
+ <th>AIC Site ID</th>
+ <th>UUID</th>
+ <th>Availability Zone</th>
+ <% if(priv == 'A') { %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.physical_network_name %></td>
+ <td><%= row.switch_name %></td>
+ <td><%= row.aic_site_id %></td>
+ <td><%= row.uuid %></td>
+ <td><%= row.availability_zone %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateAicSwitch('<%= row.physical_network_name %>','<%= row.switch_name %>','<%=row.aic_site_id %>','<%= row.uuid %>','<%=row.availability_zone %>');">Update</button>
+
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteSwitch('<%=row.physical_network_name %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+
+<!--
+ <% if(priv == 'A') { %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/gamma/uploadAicSwitch" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+
+ <% if(priv == 'A') { %>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } else { %>
+ <button type="button" class="btn btn-default disabled"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } %>
+ </form>
+ </div>
+ <% } %>
+-->
+</div>
+
+<% include ../partials/update_aic_switch %>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function updateAicSwitch(physical_network_name,switch_name,aic_site_id,uuid,availability_zone) {
+
+ document.getElementById('uf_physical_network_name').value=physical_network_name;
+ document.getElementById('uf_switch_name').value=switch_name;
+ document.getElementById('uf_aic_site_id').value=aic_site_id;
+ document.getElementById('uf_uuid').value=uuid;
+ document.getElementById('uf_availability_zone').value=availability_zone;
+ document.getElementById('uf_key_physical_network_name').value=physical_network_name;
+ $('#update_aic_switch_modal').modal('show');
+}
+function deleteSwitch(pnetwork_name) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete this switch [" + pnetwork_name + "] ?",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/gamma/deleteSwitch?phy_network_name=" + pnetwork_name);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/gamma/listServiceHoming.ejs b/admportal/views/gamma/listServiceHoming.ejs
new file mode 100644
index 00000000..e25777a9
--- /dev/null
+++ b/admportal/views/gamma/listServiceHoming.ejs
@@ -0,0 +1,241 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Service Homing</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_service_homing">
+ Add Service Homing
+ </button>
+ </div>
+ <% } %>
+
+ <table class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*Service Type</th>
+ <th>*LATA</th>
+ <th>*Hubbing City Type</th>
+ <th>Latitude</th>
+ <th>Longitude</th>
+ <th>*Primary Site Name</th>
+ <th>Secondary Site Name</th>
+ <th>Tertiary Site Name</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% var i=0; rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.service_type %></td>
+ <td><%= row.lata %></td>
+ <td><%= row.hubbing_city_type%></td>
+ <td><%= row.latitude %></td>
+ <td><%= row.longitude %></td>
+ <td><%= row.primary_aic_site_name %></td>
+ <td><%= row.secondary_aic_site_name %></td>
+ <td><%= row.tertiary_aic_site_name %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateServiceHoming('<%=row.service_type %>','<%= row.lata %>','<%= row.hubbing_city_type %>','<%= row.latitude %>','<%= row.longitude %>','<%= row.primary_aic_site_name %>','<%= row.secondary_aic_site_name %>','<%= row.tertiary_aic_site_name %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteServiceHoming('<%= row.service_type %>','<%=row.lata %>','<%= row.hubbing_city_type %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% i++; }); %>
+ </tbody>
+ </table>
+
+ <div class container>
+ <p><%= i %> rows in table.</p>
+ </div>
+
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/gamma/uploadServiceHoming" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <% if(priv == 'A') { %>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } else { %>
+ <button type="button" class="btn btn-default disabled"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } %>
+
+ </form>
+ </div>
+ <% } %>
+</div>
+
+<% include ../partials/add_service_homing %>
+<% include ../partials/update_service_homing %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+
+function submitServiceHoming(form)
+{
+ var errorMsg='';
+ var lata='';
+ var hubbing_city_type='';
+ var primary_aic_site_name='';
+ var latitude='';
+ var longitude='';
+
+ if ( form.name == 'addForm' )
+ {
+ lata = form.nf_lata;
+ hubbing_city_type = form.nf_hubbing_city_type;
+ primary_aic_site_name = form.nf_primary_aic_site_name;
+ latitude = form.nf_latitude;
+ longitude = form.nf_longitude;
+ }
+ else
+ {
+ lata = form.uf_lata;
+ hubbing_city_type = form.uf_hubbing_city_type;
+ primary_aic_site_name = form.uf_primary_aic_site_name;
+ latitude = form.uf_latitude;
+ longitude = form.uf_longitude;
+ }
+
+
+ if ( (lata.value == null) || (lata.value == "") || isblank(lata.value) )
+ {
+ errorMsg += 'LATA is required.<br>';
+ }
+ if ( (hubbing_city_type.value == null) || (hubbing_city_type.value == "") || isblank(hubbing_city_type.value) )
+ {
+ errorMsg += 'Hubbing City Type is required.<br>';
+ }
+ if ( (primary_aic_site_name.value == null) || (primary_aic_site_name.value == "") || isblank(primary_aic_site_name.value) ){
+ errorMsg += 'Primary Site Name is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+
+ if ( !isDigit(lata.value) )
+ {
+ bootbox.alert('LATA must be a number.');
+ return;
+ }
+ if ( latitude.length > 0 )
+ {
+ if ( !isFloat(latitude.value) )
+ {
+ bootbox.alert('Latitude must be a float.');
+ return;
+ }
+ }
+ if ( longitude.length > 0 )
+ {
+ if ( !isFloat(longitude.value) )
+ {
+ bootbox.alert('Longitude must be a float.');
+ return;
+ }
+ }
+ form.submit();
+}
+
+function updateServiceHoming(service_type,lata,hubbing_city_type,latitude,longitude,primary_aic_site_name,secondary_aic_site_name,tertiary_aic_site_name) {
+
+ document.getElementById('uf_service_type').value=service_type;
+ document.getElementById('uf_lata').value=lata
+ document.getElementById('uf_hubbing_city_type').value=hubbing_city_type;
+ document.getElementById('uf_latitude').value=latitude;
+ document.getElementById('uf_longitude').value=longitude;
+ document.getElementById('uf_primary_aic_site_name').value=primary_aic_site_name;
+ document.getElementById('uf_secondary_aic_site_name').value=secondary_aic_site_name;
+ document.getElementById('uf_tertiary_aic_site_name').value=tertiary_aic_site_name;
+
+ document.getElementById('uf_key_service_type').value=service_type;
+ document.getElementById('uf_key_lata').value=lata
+ document.getElementById('uf_key_hubbing_city_type').value=hubbing_city_type;
+
+ $('#update_service_homing').modal('show');
+}
+
+function deleteServiceHoming(service_type,lata,hubbing_city_type) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete SERVICE_HOMING [" + service_type + "]" + "[" + lata + "][" + hubbing_city_type + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/gamma/deleteServiceHoming?service_type=" + service_type + "&lata=" + lata + "&hubbing_city_type=" + hubbing_city_type);
+
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/gamma/listServiceHomingRollback.ejs b/admportal/views/gamma/listServiceHomingRollback.ejs
new file mode 100644
index 00000000..a7b5ef5a
--- /dev/null
+++ b/admportal/views/gamma/listServiceHomingRollback.ejs
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Service Homing Rollback</h3>
+<p>(This table data was saved during the last import of SERVICE_HOMING data.)</p>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+ <table class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Service Type</th>
+ <th>LATA</th>
+ <th>Hubbing City Type</th>
+ <th>Latitude</th>
+ <th>Longitude</th>
+ <th>Primary Site Name</th>
+ <th>Secondary Site Name</th>
+ <th>Tertiary Site Name</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% var i=0; rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.service_type %></td>
+ <td><%= row.lata %></td>
+ <td><%= row.hubbing_city_type%></td>
+ <td><%= row.latitude %></td>
+ <td><%= row.longitude %></td>
+ <td><%= row.primary_aic_site_name %></td>
+ <td><%= row.secondary_aic_site_name %></td>
+ <td><%= row.tertiary_aic_site_name %></td>
+ </tr>
+ <% i++; }); %>
+ </tbody>
+ </table>
+
+ <div class container>
+ <p><%= i %> rows in table.</p>
+ </div>
+
+ <% if (priv == 'A') { %>
+ <button type="button" class="btn btn-default"
+ onclick="rollback();">Rollback</button>
+ <% } %>
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+<script type="text/javascript">
+
+function rollback()
+{
+ bootbox.confirm({
+ message: "This Rollback will overlay the current SERVICE_HOMING table. Are you sure you want to Rollback the SERVICE_HOMING table?",
+ callback: function(result){
+ if(result)
+ {
+ location.assign("/gamma/rollbackServiceHoming");
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm:{
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/gamma/listSite.ejs b/admportal/views/gamma/listSite.ejs
new file mode 100644
index 00000000..9287ad5c
--- /dev/null
+++ b/admportal/views/gamma/listSite.ejs
@@ -0,0 +1,171 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#site').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+ <h3>AIC Site</h3>
+</div>
+<!--
+<div class="actions" style="padding:0px 25px;">
+<h2>AIC SITE</h2>
+</div>
+-->
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+<div class="container-fluid">
+ <table id="site" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>AIC Site ID</th>
+ <th>VCenter URL</th>
+ <th>OAM Gateway Address</th>
+ <th>VCenter User</th>
+ <th>VCenter Passwd</th>
+ <th>City</th>
+ <th>State</th>
+ <th>Status</th>
+ <% if(priv == 'A') { %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.name %></td>
+ <td><%= row.aic_site_id %></td>
+ <td><%= row.vcenter_url %></td>
+ <td><%= row.oam_gateway_addr %></td>
+ <td><%= row.vcenter_username %></td>
+ <td>*****</td>
+ <td><%= row.city %></td>
+ <td><%= row.state %></td>
+ <td><%= row.operational_status %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateAicSite('<%= row.name %>','<%=row.aic_site_id %>',
+ '<%= row.vcenter_url %>','<%= JSON.stringify(row.vcenter_username).replace(/\"/g,'') %>',
+ '<%= row.vcenter_passwd %>', '<%= row.city %>','<%= row.state %>',
+ '<%= row.operational_status %>', '<%= row.oam_gateway_addr %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteSite('<%=row.aic_site_id %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+<!--
+ <% if(priv == 'A') { %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/gamma/uploadAicSite" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <% if(priv == 'A') { %>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } else { %>
+ <button type="button" class="btn btn-default disabled"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } %>
+ </form>
+ </div>
+ <% } %>
+-->
+</div>
+
+<% include ../partials/update_aic_site %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function updateAicSite(name,aic_site_id,vcenter_url,vcenter_username,vcenter_passwd,city,state,operational_status,oam_gateway_addr)
+{
+ document.getElementById('uf_name').value=name
+ document.getElementById('uf_aic_site_id').value=aic_site_id;
+ document.getElementById('uf_vcenter_url').value=vcenter_url;
+ document.getElementById('uf_vcenter_username').value=vcenter_username;
+ document.getElementById('uf_vcenter_passwd').value=vcenter_passwd;
+ document.getElementById('uf_city').value=city;
+ document.getElementById('uf_state').value=state;
+ document.getElementById('uf_operational_status').value=operational_status;
+ document.getElementById('uf_oam_gateway_addr').value=oam_gateway_addr;
+
+ document.getElementById('uf_key_aic_site_id').value=aic_site_id;
+ $('#update_aic_site_modal').modal('show');
+}
+
+function deleteSite(siteId) {
+
+ bootbox.confirm({
+ message: "Their may be SERVICE_HOMING entry pointing to this site. Are you sure you want to delete site [" + siteId + "] ?",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/gamma/deleteSite?siteid=" + siteId);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/gamma/listVpePool.ejs b/admportal/views/gamma/listVpePool.ejs
new file mode 100644
index 00000000..51c2dfec
--- /dev/null
+++ b/admportal/views/gamma/listVpePool.ejs
@@ -0,0 +1,194 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+
+<script class="init">
+ $(document).ready(function() {
+ $('#vpe_pool').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>VPE Pool</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+ <table id="vpe_pool" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>AIC Site ID</th>
+ <th>VPE Name</th>
+ <th>Availability Zone</th>
+ <th>IPV4 OAM Address</th>
+ <th>Loopback IPV4 Address</th>
+ <th>Prov Status</th>
+ <th>VLAN ID Outer</th>
+ <th>Vendor</th>
+ <th>Interface Name</th>
+ <th>Interface Speed</th>
+ <th>Interface Units</th>
+ <th>VPE UUID</th>
+ <th>VPE ID</th>
+ <th>AS_NUMBER</th>
+ <th>Image Filename</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.aic_site_id %></td>
+ <td><%= row.vpe_name %></td>
+ <td><%= row.availability_zone %></td>
+ <td><%= row.ipv4_oam_address %></td>
+ <td><%= row.loopback0_ipv4_address %></td>
+ <td><%= row.provisioning_status %></td>
+ <td><%= row.vlan_id_outer %></td>
+ <td><%= row.vendor %></td>
+ <td><%= row.physical_intf_name %></td>
+ <td><%= row.physical_intf_speed %></td>
+ <td><%= row.physical_intf_units %></td>
+ <td><%= row.vpe_uuid %></td>
+ <td><%= row.vpe_id %></td>
+ <td><%= row.as_number %></td>
+ <td><%= row.image_filename %></td>
+ <td>
+<!--
+ <form name="rowform">
+ <input type="hidden" name="rf_aic_site_id" id="rf_aic_site_id" value="<%= row.aic_site_id %>"</input>
+ <input type="hidden" name="rf_vpe_name" id="rf_vpe_name" value="<%= row.vpe_name %>"</input>
+ <input type="hidden" name="rf_availability_zone" id="rf_availability_zone" value="<%= row.availability_zone %>"</input>
+ </form>
+-->
+ <!-- <% var _attuid = row.attuid %> -->
+ <% if(priv == 'A') { %>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateVpePool('<%=row.aic_site_id %>','<%=row.vpe_name %>', '<%=row.availability_zone %>','<%=row.provisioning_status %>','<%= row.ipv4_oam_address %>','<%= row.loopback0_ipv4_address %>','<%= row.vlan_id_outer %>','<%= row.vendor %>','<%= row.physical_intf_name %>','<%= row.physical_intf_speed %>','<%= row.physical_intf_units %>','<%= row.vpe_uuid %>','<%= row.vpe_id %>', '<%= row.image_filename %>', '<%= row.as_number %>' );">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteVpePool('<%= row.vpe_name %>','<%=row.aic_site_id %>','<%= row.availability_zone %>');">Delete</button>
+ <% } %>
+ </td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+<!--
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/gamma/uploadVpePool" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <% if(priv == 'A') { %>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } else { %>
+ <button type="button" class="btn btn-default disabled"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } %>
+ </form>
+ </div>
+ <% } %>
+-->
+</div>
+
+<% include ../partials/update_vpe_pool %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function updateVpePool(aic_site_id,vpe_name,availability_zone,provisioning_status,ipv4_oam_address,loopback0_ipv4_address,vlan_id_outer,vendor,physical_intf_name,physical_intf_speed,physical_intf_units,vpe_uuid,vpe_id,image_filename, as_number) {
+
+ document.getElementById('uf_aic_site_id').value=aic_site_id;
+ document.getElementById('uf_vpe_name').value=vpe_name;
+ document.getElementById('uf_availability_zone').value=availability_zone;
+ document.getElementById('uf_provisioning_status').value=provisioning_status;
+ document.getElementById('uf_ipv4_oam_address').value=ipv4_oam_address;
+ document.getElementById('uf_loopback0_ipv4_address').value=loopback0_ipv4_address;
+ document.getElementById('uf_vlan_id_outer').value=vlan_id_outer;
+ document.getElementById('uf_vendor').value=vendor;
+ document.getElementById('uf_physical_intf_name').value=physical_intf_name;
+ document.getElementById('uf_physical_intf_speed').value=physical_intf_speed;
+ document.getElementById('uf_physical_intf_units').value=physical_intf_units;
+ document.getElementById('uf_vpe_uuid').value=vpe_uuid;
+ document.getElementById('uf_vpe_id').value=vpe_id;
+ document.getElementById('uf_as_number').value=as_number;
+ document.getElementById('uf_image_filename').value=image_filename;
+
+ document.getElementById('uf_key_availability_zone').value=availability_zone;
+ document.getElementById('uf_key_aic_site_id').value=aic_site_id;
+ document.getElementById('uf_key_vpe_name').value=vpe_name;
+ $('#update_vpe_pool_modal').modal('show');
+
+}
+function deleteVpePool(vpe_name,aic_site_id,availability_zone) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete VPE [" + aic_site_id + "][" + vpe_name + "][" + availability_zone + "] ?",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/gamma/deleteVpePool?aic_site_id=" + aic_site_id + "&vpe_name=" + vpe_name + "&availability_zone=" + availability_zone);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/gamma/listVplspePool.ejs b/admportal/views/gamma/listVplspePool.ejs
new file mode 100644
index 00000000..b49c2a37
--- /dev/null
+++ b/admportal/views/gamma/listVplspePool.ejs
@@ -0,0 +1,178 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+
+<script class="init">
+ $(document).ready(function() {
+ $('#vplspe_pool').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>VPLSPE Pool</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+<div class="container-fluid">
+ <table id="vplspe_pool" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>VPLSPE Name</th>
+ <th>AIC Site ID</th>
+ <th>Availability Zone</th>
+ <th>Interface Name</th>
+ <th>Interface Speed</th>
+ <th>Interface Units</th>
+ <th>Loopback IPV4 Address</th>
+ <th>VLAN ID Outer</th>
+ <th>VPLSPE UUID</th>
+ <th>Image Filename</th>
+ <th>Prov Status</th>
+ <th>Vendor</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.vplspe_name %></td>
+ <td><%= row.aic_site_id %></td>
+ <td><%= row.availability_zone %></td>
+ <td><%= row.physical_intf_name %></td>
+ <td><%= row.physical_intf_speed %></td>
+ <td><%= row.physical_intf_units %></td>
+ <td><%= row.loopback0_ipv4_address %></td>
+ <td><%= row.vlan_id_outer %></td>
+ <td><%= row.vplspe_uuid %></td>
+ <td><%= row.image_filename %></td>
+ <td><%= row.provisioning_status %></td>
+ <td><%= row.vendor %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateVplspePool('<%=row.aic_site_id %>','<%= row.availability_zone %>','<%= row.vplspe_name %>','<%= row.physical_intf_name %>','<%= row.physical_intf_speed %>','<%= row.physical_intf_units %>','<%= row.loopback0_ipv4_address %>','<%= row.vlan_id_outer %>','<%= row.vplspe_uuid %>','<%= row.image_filename %>','<%= row.provisioning_status %>','<%= row.vendor %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteVplspePool('<%= row.vplspe_name %>','<%=row.aic_site_id %>','<%= row.availability_zone %>','<%= row.physical_intf_name %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+<!--
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/gamma/uploadVplspePool" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <% if(priv == 'A') { %>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } else { %>
+ <button type="button" class="btn btn-default disabled"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } %>
+
+ </form>
+ </div>
+ <% } %>
+-->
+</div>
+
+<% include ../partials/update_vplspe_pool %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function updateVplspePool(aic_site_id,availability_zone,vplspe_name,physical_intf_name,physical_intf_speed,physical_intf_units,loopback0_ipv4_address,vlan_id_outer,vplspe_uuid,image_filename,provisioning_status,vendor) {
+
+ document.getElementById('uf_aic_site_id').value=aic_site_id;
+ document.getElementById('uf_availability_zone').value=availability_zone
+ document.getElementById('uf_vplspe_name').value=vplspe_name;
+ document.getElementById('uf_physical_intf_name').value=physical_intf_name;
+ document.getElementById('uf_physical_intf_speed').value=physical_intf_speed;
+ document.getElementById('uf_physical_intf_units').value=physical_intf_units;
+ document.getElementById('uf_loopback0_ipv4_address').value=loopback0_ipv4_address;
+ document.getElementById('uf_vlan_id_outer').value=vlan_id_outer;
+ document.getElementById('uf_vplspe_uuid').value=vplspe_uuid;
+ document.getElementById('uf_image_filename').value=image_filename;
+ document.getElementById('uf_provisioning_status').value=provisioning_status;
+ document.getElementById('uf_vendor').value=vendor;
+
+ document.getElementById('uf_key_aic_site_id').value=aic_site_id;
+ document.getElementById('uf_key_vplspe_name').value=vplspe_name;
+ document.getElementById('uf_key_availability_zone').value=availability_zone
+ document.getElementById('uf_key_physical_intf_name').value=physical_intf_name;
+ $('#update_vplspe_pool_modal').modal('show');
+}
+
+function deleteVplspePool(vplspe_name,aic_site_id,availability_zone,physical_intf_name) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete VPLSPE [" + vplspe_name + "][" + aic_site_id + "][" + availability_zone + "][" + physical_intf_name + "] ?",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/gamma/deleteVplspePool?aic_site_id=" + aic_site_id + "&vplspe_name=" + vplspe_name + "&availability_zone=" + availability_zone + "&physical_intf_name=" + physical_intf_name);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/gamma/nbVlanPool.ejs b/admportal/views/gamma/nbVlanPool.ejs
new file mode 100644
index 00000000..9d3a8d1b
--- /dev/null
+++ b/admportal/views/gamma/nbVlanPool.ejs
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+
+<script class="init">
+ $(document).ready(function() {
+ $('#nb_vlan_pool').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>NetBond VLAN Pools</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+<div class="container-fluid">
+
+ <table id="nb_vlan_pool" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>AIC Site Id</th>
+ <th>Availability Zone</th>
+ <th>VLAN Plan Id</th>
+ <th>Plan Type</th>
+ <th>Purpose</th>
+ <th>VLAN Id</th>
+ <th>Status</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.aic_site_id %></td>
+ <td><%= row.availability_zone %></td>
+ <td><%= row.vlan_plan_id %></td>
+ <td><%= row.plan_type %></td>
+ <td><%= row.purpose %></td>
+ <td><%= row.vlan_id %></td>
+ <td><%= row.status %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateNbVlanPool('<%= row.aic_site_id %>', '<%= row.availability_zone %>',
+ '<%= row.vlan_plan_id %>', '<%= row.plan_type %>', '<%= row.purpose %>',
+ '<%= row.vlan_id %>', '<%= row.status %>');">Update</button>
+ </td>
+ <% } else { %>
+ <td>&nbsp;</td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+</div>
+
+<% include ../partials/nb_vlan_pool %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+
+function updateNbVlanPool(aic_site_id,availability_zone,vlan_plan_id,plan_type,purpose,vlan_id,pstatus) {
+
+ document.getElementById('uf_key_aic_site_id').value=aic_site_id;
+ document.getElementById('uf_key_availability_zone').value=availability_zone;
+ document.getElementById('uf_key_vlan_plan_id').value=vlan_plan_id;
+ document.getElementById('uf_key_plan_type').value=plan_type;
+ document.getElementById('uf_key_purpose').value=purpose;
+ document.getElementById('uf_key_vlan_id').value=vlan_id;
+ document.getElementById('uf_status').value=pstatus;
+
+ $('#update_nb_vlan_pool').modal('show');
+}
+
+function saveNbVlanPool(form)
+{
+ form.submit();
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/gamma/nbVlanRange.ejs b/admportal/views/gamma/nbVlanRange.ejs
new file mode 100644
index 00000000..748dbbe3
--- /dev/null
+++ b/admportal/views/gamma/nbVlanRange.ejs
@@ -0,0 +1,205 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+
+<script class="init">
+ $(document).ready(function() {
+ $('#nb_vlan_ranges').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>NetBond VLAN Ranges</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vlan_range">
+ Add Range
+ </button>
+ </div>
+ <% } %>
+
+ <table id="nb_vlan_ranges" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Vlan Plan Id</th>
+ <th>Purpose</th>
+ <th>Range Start</th>
+ <th>Range End</th>
+ <th>Plan Type</th>
+ <th>Pool Generated</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.vlan_plan_id %></td>
+ <td><%= row.purpose %></td>
+ <td><%= row.range_start %></td>
+ <td><%= row.range_end %></td>
+ <td><%= row.plan_type %></td>
+ <td><%= row.generated %></td>
+ <td>
+ <% if (row.generated == 'N' && priv == 'A'){ %>
+ <button type="button" class="btn btn-default btn-xs" onclick="generateVlanPool();">Generate Pool</button>
+ <% } else { %>
+ <button type="button" class="btn btn-default btn-xs disabled"
+ onclick="generateVlanPool('<%= row.purpose %>', '<%= row.vlan_plan_id %>',
+ '<%= row.range_start %>', '<%= row.range_end %>',
+ '<%= row.plan_type %>');">Generate Pool</button>
+ <% } %>
+ <% if (row.generated == 'N'){ %>
+ <button type="button" class="btn btn-default btn-xs disabled" onclick="viewNbVlanPool('<%= row.vlan_plan_id %>','<%= row.range_start %>', '<%= row.range_end %>');">View Pool</button>
+ <% } else { %>
+ <button type="button" class="btn btn-default btn-xs" onclick="viewNbVlanPool('<%= row.vlan_plan_id %>','<%= row.range_start %>', '<%= row.range_end %>');">View Pool</button>
+ <% } %>
+ <% if(priv == 'A') { %>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteNbVlanRange('<%= row.vlan_plan_id %>',
+ '<%= row.plan_type %>', '<%= row.purpose %>', '<%= row.range_start %>',
+ '<%= row.range_end %>');">Delete</button>
+ <% } %>
+ </td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+</div>
+
+<% include ../partials/nb_vlan_range %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+
+function generateVlanPool(purpose,vlan_plan_id,range_start,range_end,plan_type)
+{
+ var url_string = encodeURI("/gamma/generateNbVlanPool?vlan_plan_id=" + vlan_plan_id
+ + "&range_start=" + range_start + "&range_end=" + range_end
+ + "&plan_type=" + plan_type + "&purpose=" + purpose);
+ location.assign(url_string);
+ return;
+}
+function viewNbVlanPool(vlan_plan_id, range_start, range_end)
+{
+ var url_string = encodeURI("/gamma/getNbVlanPool?vlan_plan_id=" + vlan_plan_id
+ + "&range_start=" + range_start + "&range_end=" + range_end);
+ location.assign(url_string);
+ return;
+}
+function deleteNbVlanRange(vlan_plan_id,plan_type,purpose,range_start,range_end) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete this VLAN Range[" + vlan_plan_id + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ var url_string = encodeURI(
+ "/gamma/deleteNbVlanRange?vlan_plan_id=" + vlan_plan_id
+ + "&plan_type=" + plan_type + "&purpose=" + purpose
+ + "&range_start=" + range_start + "&range_end=" + range_end);
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+function saveNbVlanRange(form)
+{
+ var errorMsg='';
+ var plan_type = form.nf_plan_type.value;
+ var purpose = form.nf_purpose.value;
+ var range_start = form.nf_range_start.value;
+ var range_end = form.nf_range_end.value;
+
+ if ( (range_start == null) || (range_start == "") || isblank(range_start) )
+ {
+ errorMsg += 'Range Start is required.<br>';
+ }
+ if ( (range_end == null) || (range_end == "") || isblank(range_start) )
+ {
+ errorMsg += 'Range End is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+
+ if ( !$.isNumeric(range_start) ) {
+ bootbox.alert('Range Start is not a number.');
+ return;
+ }
+ if ( !$.isNumeric(range_end) ) {
+ bootbox.alert('Range End is not a number.');
+ return;
+ }
+ var r_start = Number(range_start);
+ var r_end = Number(range_end);
+
+ if ( r_end < r_start )
+ {
+ bootbox.alert('Range End must be greater than Range Start.');
+ return;
+ }
+
+ form.submit();
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/gamma/networkProfile.ejs b/admportal/views/gamma/networkProfile.ejs
new file mode 100644
index 00000000..1b54d671
--- /dev/null
+++ b/admportal/views/gamma/networkProfile.ejs
@@ -0,0 +1,164 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+
+<script class="init">
+ $(document).ready(function() {
+ $('#network_profile').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Network Profile</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_network_profile">
+ Add Profile
+ </button>
+ </div>
+ <% } %>
+
+ <table id="network_profile" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*Network Type</th>
+ <th>Technology</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.network_type %></td>
+ <td><%= row.technology %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <% if (priv == 'A') { %>
+ <button type="button" class="btn btn-default btn-xs" onclick="updateNetworkProfile('<%= row.network_type %>', '<%= row.technology %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs" onclick="deleteNetworkProfile('<%= row.network_type %>');">Delete</button>
+ <% } %>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+</div>
+
+<% include ../partials/network_profile %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function saveNetworkProfile(form)
+{
+ var errorMsg='';
+ var network_type = '';
+ var technology = '';
+
+ if ( form.name == 'addForm' )
+ {
+ network_type = form.nf_network_type;
+ technology = form.nf_technology;
+ }
+ else
+ {
+ network_type = form.uf_network_type;
+ technology = form.uf_technology;
+ }
+
+
+ if ( (network_type.value == null) || (network_type.value == "") || isblank(network_type.value) )
+ {
+ errorMsg += 'Network Type is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ form.submit();
+}
+
+function updateNetworkProfile(network_type,technology) {
+
+ document.getElementById('uf_network_type').value=network_type;
+ document.getElementById('uf_technology').value=technology;
+
+ document.getElementById('uf_key_network_type').value=network_type;
+
+ $('#update_network_profile').modal('show');
+}
+
+function deleteNetworkProfile(network_type) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete this Network Profile [" + network_type + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/gamma/deleteNetworkProfile?network_type=" + network_type);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/javascript_delete/jquery.min.js b/admportal/views/javascript_delete/jquery.min.js
new file mode 100644
index 00000000..ab28a247
--- /dev/null
+++ b/admportal/views/javascript_delete/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
+if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")
+},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/admportal/views/javascript_delete/sla.js b/admportal/views/javascript_delete/sla.js
new file mode 100644
index 00000000..e3819a80
--- /dev/null
+++ b/admportal/views/javascript_delete/sla.js
@@ -0,0 +1,11 @@
+<script>
+function uploadDG(form)
+{
+ if ( form.filename.value.length == 0)
+ {
+ alert('Must select a file.');
+ return false;
+ }
+ else { form.submit(); return; }
+}
+</script>
diff --git a/admportal/views/logs/accesslog.ejs b/admportal/views/logs/accesslog.ejs
new file mode 100644
index 00000000..0b4ea56f
--- /dev/null
+++ b/admportal/views/logs/accesslog.ejs
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#access').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>HTTP Server Access Log</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+ <table id="access" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Date (UTC)</th>
+ <th>Method</th>
+ <th>Version</th>
+ <th>Status</th>
+ <th>URL</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% for(var x=0; x < rows.length; x++) { %>
+ <tr>
+ <td><%= rows[x].date %></td>
+ <td><%= rows[x].method %></td>
+ <td><%= rows[x].version %></td>
+ <td><%= rows[x].status %></td>
+ <td><%= rows[x].url %></td>
+ </tr>
+ <% } %>
+ </tbody>
+ </table>
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/logs/accesslog.ejs.0223 b/admportal/views/logs/accesslog.ejs.0223
new file mode 100644
index 00000000..77ece8f9
--- /dev/null
+++ b/admportal/views/logs/accesslog.ejs.0223
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#access').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>HTTP Server Access Log</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+ <table id="access" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Date (UTC)</th>
+ <th>Method</th>
+ <th>Version</th>
+ <th>Status</th>
+ <th>URL</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% for(var x=0; x<pageInfo.rows.length; x++) { %>
+ <tr>
+ <td><%= pageInfo.rows[x].date %></td>
+ <td><%= pageInfo.rows[x].method %></td>
+ <td><%= pageInfo.rows[x].version %></td>
+ <td><%= pageInfo.rows[x].status %></td>
+ <td><%= pageInfo.rows[x].url %></td>
+ </tr>
+ <% } %>
+ </tbody>
+ </table>
+</div>
+
+ <div class="container-fluid">
+ <div class="row">
+ <div class="col-md-1 text-left">
+ <p>&nbsp;&nbsp;Page <%= pageInfo.currentPage %> of <%= pageInfo.pageCount %></p>
+ </div>
+ <div class="col-md-11 text-left">
+ <% if (pageInfo.pageCount > 1) { %>
+ <ul class="pagination">
+ <% if (pageInfo.currentPage > 1) { %>
+ <li><a href="/logs/pageAccessLog?page=1">&laquo;</a></li>
+ <% } %>
+ <% var i = 1;
+ if (pageInfo.currentPage > 10) {
+ i = +pageInfo.currentPage - 9;
+ } %>
+ <% if (i !== 1) { %>
+ <!--<li class="disabled"><a href="#">...</a></li>-->
+ <% } %>
+ <% for (i; i<=pageInfo.pageCount; i++) { %>
+ <% if (pageInfo.currentPage == i) { %>
+ <li class="active"><span><%= i %> <span class="sr-only">(current)</span></span></li>
+ <% } else { %>
+ <li><a href="/logs/pageAccessLog?page=<%= i %>"><%= i %></a></li>
+ <% } %>
+ <% if (i == (+pageInfo.currentPage + 9)) { %>
+ <!--<li class="disabled"><a href="#">...</a></li>-->
+ <% break; } %>
+ <% } %>
+ <% if (pageInfo.currentPage != pageInfo.pageCount) { %>
+ <li><a href="/logs/pageAccessLog?page=<%= pageInfo.pageCount %>">&raquo;</a></li>
+ <% } %>
+ </ul>
+ <% } %>
+ </div><!-- col-md-10 -->
+ </div><!-- row -->
+ </div><!-- container-fluid -->
+
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/logs/usertrace.ejs b/admportal/views/logs/usertrace.ejs
new file mode 100644
index 00000000..cca003b0
--- /dev/null
+++ b/admportal/views/logs/usertrace.ejs
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#usertrace').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>User Trace</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+ <div class="table-responsive">
+ <table id="usertrace" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Date (UTC)</th>
+ <th>ATTUID</th>
+ <th>Action</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody id="myTable">
+ <% for (var x=0; x < rows.length; x++) { %>
+ <tr>
+ <td><%= rows[x].date %></td>
+ <td><%= rows[x].attuid %></td>
+ <td><%= rows[x].action %></td>
+ <td><%= rows[x].desc %></td>
+ </tr>
+ <% } %>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/logs/usertrace.ejs.0223 b/admportal/views/logs/usertrace.ejs.0223
new file mode 100644
index 00000000..8a099edd
--- /dev/null
+++ b/admportal/views/logs/usertrace.ejs.0223
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#usertrace').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>User Trace</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+ <div class="table-responsive">
+ <table id="usertrace" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Date (UTC)</th>
+ <th>ATTUID</th>
+ <th>Action</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody id="myTable">
+ <% for (var x=0; x<pageInfo.rows.length; x++) { %>
+ <tr>
+ <td><%= pageInfo.rows[x].date %></td>
+ <td><%= pageInfo.rows[x].attuid %></td>
+ <td><%= pageInfo.rows[x].action %></td>
+ <td><%= pageInfo.rows[x].desc %></td>
+ </tr>
+ <% } %>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+
+
+ <div class="container-fluid">
+ <div class="row">
+ <div class="col-md-1 text-left">
+ <p>&nbsp;&nbsp;Page <%= pageInfo.currentPage %> of <%= pageInfo.pageCount %></p>
+ </div>
+ <div class="col-md-11 text-left">
+ <% if (pageInfo.pageCount > 1) { %>
+ <ul class="pagination">
+ <% if (pageInfo.currentPage > 1) { %>
+ <li><a href="/logs/pageUserTrace?page=1">&laquo;</a></li>
+ <% } %>
+ <% var i = 1;
+ if (pageInfo.currentPage > 10) {
+ i = +pageInfo.currentPage - 9;
+ } %>
+ <% if (i !== 1) { %>
+ <!--<li class="disabled"><a href="#">...</a></li>-->
+ <% } %>
+ <% for (i; i<=pageInfo.pageCount; i++) { %>
+ <% if (pageInfo.currentPage == i) { %>
+ <li class="active"><span><%= i %> <span class="sr-only">(current)</span></span></li>
+ <% } else { %>
+ <li><a href="/logs/pageUserTrace?page=<%= i %>"><%= i %></a></li>
+ <% } %>
+ <% if (i == (+pageInfo.currentPage + 9)) { %>
+ <!--<li class="disabled"><a href="#">...</a></li>-->
+ <% break; } %>
+ <% } %>
+ <% if (pageInfo.currentPage != pageInfo.pageCount) { %>
+ <li><a href="/logs/pageUserTrace?page=<%= pageInfo.pageCount %>">&raquo;</a></li>
+ <% } %>
+ </ul>
+ <% } %>
+ </div><!-- col-md-10 -->
+ </div><!-- row -->
+ </div><!-- container-fluid -->
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/mobility/displayVnfData.ejs b/admportal/views/mobility/displayVnfData.ejs
new file mode 100644
index 00000000..596feb66
--- /dev/null
+++ b/admportal/views/mobility/displayVnfData.ejs
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>SDN-C AdminPortal</title>
+ <meta charset="UTF-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+</head>
+<body>
+
+
+<div class="actions" style="padding:0px 25px;">
+<h2>VNF Data</h2>
+</div>
+
+<div class="container-fluid">
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <pre class='alert alert-success' role='alert'><%=JSON.stringify(result.msg,null,4) %></pre>
+ <% } else { %>
+ <pre class='alert alert-danger' role='danger'><%=result.msg %></pre>
+ <% } %>
+ <% } %>
+<% } %>
+</div>
+
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/mobility/displayVnfNetworkData.ejs b/admportal/views/mobility/displayVnfNetworkData.ejs
new file mode 100644
index 00000000..e2bcd637
--- /dev/null
+++ b/admportal/views/mobility/displayVnfNetworkData.ejs
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>SDN-C AdminPortal</title>
+ <meta charset="UTF-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+</head>
+<body>
+
+
+<div class="actions" style="padding:0px 25px;">
+<h2>VNF Network Data</h2>
+</div>
+
+<div class="container-fluid">
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <pre class='alert alert-success' role='alert'><%=JSON.stringify(result.msg,null,4) %></pre>
+ <% } else { %>
+ <pre class='alert alert-danger' role='danger'><%=result.msg %></pre>
+ <% } %>
+ <% } %>
+<% } %>
+</div>
+
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/mobility/vmNetworks.ejs b/admportal/views/mobility/vmNetworks.ejs
new file mode 100644
index 00000000..6394c44d
--- /dev/null
+++ b/admportal/views/mobility/vmNetworks.ejs
@@ -0,0 +1,198 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vm_networks').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>VM Networks </h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_vm_network">
+ Add VM Network
+ </button>
+ </div>
+ <% } %>
+
+ <table id="vm_networks" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*VNF_TYPE</th>
+ <th>*VM_TYPE</th>
+ <th>*NETWORK_ROLE</th>
+ <th>IP_COUNT</th>
+ <th>ASSIGN_IPS</th>
+ <th>ASSIGN_MACS</th>
+ <th>ASSIGN_FLOATING_IP</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.vnf_type %></td>
+ <td><%= row.vm_type %></td>
+ <td><%= row.network_role %></td>
+ <td><%= row.ip_count %></td>
+ <td><%= (row.assign_ips == '1') ? 'true' : 'false' %></td>
+ <td><%= (row.assign_macs == '1') ? 'true' : 'false' %></td>
+ <td><%= (row.assign_floating_ip == '1') ? 'true' : 'false' %></td>
+ <% if(priv == 'A' ) { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteVmNetwork('<%= row.vnf_type %>', '<%= row.vm_type %>', '<%= row.network_role %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/mobility/uploadVmNetworks" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ </form>
+ </div>
+ <% } %>
+</div>
+
+<% include ../partials/vm_networks %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+
+function addVmNetwork(form)
+{
+ var errorMsg='';
+ var vnf_type='';
+ var vm_type='';
+ var network_role='';
+ var ip_count = '';
+ var assign_ips='';
+ var assign_macs='';
+ var assign_floating_ip='';
+
+ if ( form.name == 'addForm' )
+ {
+ vnf_type = form.nf_vnf_type;
+ vm_type = form.nf_vm_type;
+ network_role = form.nf_network_role;
+ ip_count = form.nf_ip_count;
+ assign_ips = form.nf_assign_ips;
+ assign_macs = form.nf_assign_macs;
+ assign_floating_ip = form.nf_assign_floating_ip;
+ }
+
+ if ( (vnf_type.value == null) || (vnf_type.value == "") || isblank(vnf_type.value) )
+ {
+ errorMsg += 'VNF Type is required.<br>';
+ }
+ if ( (vm_type.value == null) || (vm_type.value == "") || isblank(vm_type.value) )
+ {
+ errorMsg += 'VM Type is required.<br>';
+ }
+ if ( (network_role.value == null) || (network_role.value == "") || isblank(network_role.value) ){
+ errorMsg += 'Network Role is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ if (ip_count.value.length >0 && !isDigit(ip_count.value) )
+ {
+ bootbox.alert('VM Count must be a number.');
+ return;
+ }
+ if (assign_ips.value == 'true' && ip_count.value.length == 0)
+ {
+ bootbox.alert("If ASSIGN IPS equals 'true', IP COUNT must be populated with a number.");
+ return;
+ }
+
+ form.submit();
+}
+
+function deleteVmNetwork(vnf_type,vm_type,network_role) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete VM_NETWORK [" + vnf_type + "]" + "[" + vm_type + "][" + network_role + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/mobility/deleteVmNetwork?vnf_type=" + vnf_type + "&vm_type=" + vm_type + "&network_role=" + network_role);
+
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/mobility/vmProfile.ejs b/admportal/views/mobility/vmProfile.ejs
new file mode 100644
index 00000000..f702e51a
--- /dev/null
+++ b/admportal/views/mobility/vmProfile.ejs
@@ -0,0 +1,173 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vm_profile').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>VM Profile </h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_vm_profile">
+ Add VM Profile
+ </button>
+ </div>
+ <% } %>
+
+ <table id="vm_profile" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*VNF_TYPE</th>
+ <th>*VM_TYPE</th>
+ <th>VM_COUNT</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.vnf_type %></td>
+ <td><%= row.vm_type %></td>
+ <td><%= row.vm_count %></td>
+ <% if(priv == 'A' ) { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteVmProfile('<%= row.vnf_type %>', '<%= row.vm_type %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/mobility/uploadVmProfile" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ </form>
+ </div>
+ <% } %>
+</div>
+
+<% include ../partials/vm_profile %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+
+function addVmProfile(form)
+{
+ var errorMsg='';
+ var vnf_type='';
+ var vm_type='';
+ var vm_count='';
+
+ if ( form.name == 'addForm' )
+ {
+ vnf_type = form.nf_vnf_type;
+ vm_type = form.nf_vm_type;
+ vm_count = form.nf_vm_count;
+ }
+
+ if ( (vnf_type.value == null) || (vnf_type.value == "") || isblank(vnf_type.value) )
+ {
+ errorMsg += 'VNF Type is required.<br>';
+ }
+ if ( (vm_type.value == null) || (vm_type.value == "") || isblank(vm_type.value) )
+ {
+ errorMsg += 'VM Type is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+
+ if ( vm_count.value.length > 0 && !isDigit(vm_count.value) )
+ {
+ bootbox.alert('VM Count must be a number.');
+ return;
+ }
+ form.submit();
+}
+
+function deleteVmProfile(vnf_type, vm_type) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete VM_PROFILE [" + vnf_type + "][" + vm_type + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/mobility/deleteVmProfile?vnf_type=" + vnf_type + "&vm_type=" + vm_type);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/mobility/vnfNetworks.ejs b/admportal/views/mobility/vnfNetworks.ejs
new file mode 100644
index 00000000..a4a9f170
--- /dev/null
+++ b/admportal/views/mobility/vnfNetworks.ejs
@@ -0,0 +1,163 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vnf_networks').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>VNF Networks </h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_vnf_network">
+ Add VNF Network
+ </button>
+ </div>
+ <% } %>
+
+ <table id="vnf_networks" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*VNF_TYPE</th>
+ <th>*NETWORK_ROLE</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.vnf_type %></td>
+ <td><%= row.network_role %></td>
+ <% if(priv == 'A' ) { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteVnfNetwork('<%= row.vnf_type %>', '<%= row.network_role %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/mobility/uploadVnfNetworks" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ </form>
+ </div>
+ <% } %>
+</div>
+
+<% include ../partials/vnf_network %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+
+function addVnfNetwork(form)
+{
+ var errorMsg='';
+ var vnf_type='';
+ var network_role='';
+
+ if ( form.name == 'addForm' )
+ {
+ vnf_type = form.nf_vnf_type;
+ network_role = form.nf_network_role;
+ }
+
+ if ( (vnf_type.value == null) || (vnf_type.value == "") || isblank(vnf_type.value) )
+ {
+ errorMsg += 'VNF Type is required.<br>';
+ }
+ if ( (network_role.value == null) || (network_role.value == "") || isblank(network_role.value) )
+ {
+ errorMsg += 'Network Role is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ form.submit();
+}
+
+function deleteVnfNetwork(vnf_type, network_role) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete VNF_NETWORK [" + vnf_type + "][" + network_role + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/mobility/deleteVnfNetwork?vnf_type=" + vnf_type + "&network_role=" + network_role);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/mobility/vnfPreloadData.ejs b/admportal/views/mobility/vnfPreloadData.ejs
new file mode 100644
index 00000000..69f02e59
--- /dev/null
+++ b/admportal/views/mobility/vnfPreloadData.ejs
@@ -0,0 +1,244 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vnf_data').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Pre-load VNF Data</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <table id="vnf_data" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>ID</th>
+ <th>SVC_REQUEST_ID</th>
+ <th>VNF_NAME</th>
+ <th>VNF_TYPE</th>
+ <th>SVC_ACTION</th>
+ <th>UPLOAD STATUS</th>
+ <th>FILENAME</th>
+ <th>IMPORT/UPLOAD TIMESTAMP</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% var i=0; retData.forEach( function(rowObj) { %>
+ <tr>
+ <td><%= rowObj.row.id %></td>
+ <td><a href="javascript:getVnfData('<%= rowObj.vnf_name %>','<%= rowObj.vnf_type %>');"><%= rowObj.row.svc_request_id %></a></td>
+ <td><%= rowObj.vnf_name %></td>
+ <td><%= rowObj.vnf_type %></td>
+ <td><%= rowObj.row.svc_action %></td>
+ <td><%= rowObj.row.status %></td>
+ <td>
+ <a data-toggle="collapse"
+ href="#collapseExample<%= i %>" aria-expanded="false"
+ aria-controls="collapseExample"><%= rowObj.row.filename %>
+ </a>
+ <div class="collapse" id="collapseExample<%= i %>">
+ <div class="well">
+ <pre><%= JSON.stringify(rowObj.filecontent,null,4) %></pre>
+ </div>
+ </div>
+ </td>
+
+ <td><%= rowObj.row.ts %></td>
+ <% if(priv == 'A' ) { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteVnfData('<%= rowObj.row.id %>','<%= rowObj.row.svc_request_id %>','<%= rowObj.row.filename %>','<%= rowObj.row.status %>','<%= rowObj.vnf_name %>','<%= rowObj.vnf_type %>');">Delete</button>
+ <% if (typeof rowObj.vnf_name != 'undefined' || typeof rowObj.vnf_type != 'undefined'){ %>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="loadVnfData('<%= rowObj.row.id %>','<%= rowObj.row.svc_request_id %>','<%= rowObj.row.svc_action %>','<%= rowObj.row.status %>','<%= rowObj.row.filename %>','<%= rowObj.row.ts %>');">Load Data</button>
+ <% } %>
+ </td>
+ <% } %>
+ </tr>
+ <% i++; }); %>
+ </tbody>
+ </table>
+
+ <% if(priv == 'A'){ %>
+ <div class="row">
+ <div class="col-md-8 col-md-push-4">
+ <form method="POST" action="/mobility/uploadVnfData" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">Upload pre processed JSON file.</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a JSON file to upload.</p>
+ <button type="button" class="btn btn-default"
+ data-toggle="tooltip" data-placement="bottom"
+ title="Upload a JSON file that has already been pre processed."
+ onclick="uploadFile(this.form);">Upload JSON File</button>
+ </div>
+ </form>
+ </div>
+ <div class="col-md-4 col-md-pull-8">
+ <form method="POST" action="/preload/uploadVnfCsv" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">Upload Worksheet CSV files from the <%= preloadImportDirectory %> directory.</label>
+ <input name="filename" type="file" id="dest" multiple>
+ <p class="help-block">Choose Worksheet CSV files to upload.</p>
+ <button type="button" class="btn btn-default"
+ data-toggle="tooltip" data-placement="bottom"
+ title="Must upload all the VNF CSV files from <%= preloadImportDirectory %>"
+ onclick="importWorksheet(this.form);">Upload VNF Worksheet CSV files
+ </button>
+ </div>
+ </form>
+ </div>
+ </div>
+ <% } %>
+</div>
+
+<% include ../partials/add_service_homing %>
+<% include ../partials/update_service_homing %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+
+function importWorksheet(form)
+{
+ if ( form.filename.value.length == 0)
+ {
+ bootbox.alert('Must select a file.');
+ return false;
+ }
+ else {
+
+ bootbox.confirm({
+ message: "Are you sure you want to import VNF WORKSHEET .csv files from <%= preloadImportDirectory %>",
+ callback: function(result) {
+ if ( result )
+ {
+ form.submit();
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+ }
+}
+
+
+function getVnfData(vnf_name,vnf_type,svc_request_id)
+{
+ location.assign("/mobility/viewVnfData?vnf_name=" + vnf_name + "&vnf_type=" + vnf_type );
+ return;
+}
+function loadVnfData(id,svc_request_id,svc_action,status,filename,ts)
+{
+ if ( status != 'pending' )
+ {
+ bootbox.alert("Upload Status must be in 'pending' state.");
+ return;
+ }
+ bootbox.confirm({
+ message: "Are you sure you want to load file [" + filename + "]? ",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/mobility/loadVnfData?id=" + id + "&svc_request_id=" + svc_request_id + "&filename=" + filename + "&status=" + status);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+function deleteVnfData(id,svc_request_id,filename,status,vnf_name,vnf_type) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete uploaded file [" + filename + "]? ",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/mobility/deleteVnfData?id="
+ + id
+ + "&svc_request_id=" + svc_request_id
+ + "&filename=" + filename
+ + "&status=" + status
+ + "&vnf_name=" + vnf_name
+ + "&vnf_type=" + vnf_type);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/mobility/vnfPreloadNetworkData.ejs b/admportal/views/mobility/vnfPreloadNetworkData.ejs
new file mode 100644
index 00000000..099dcba5
--- /dev/null
+++ b/admportal/views/mobility/vnfPreloadNetworkData.ejs
@@ -0,0 +1,242 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#preload_vnf_data').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Pre-load VNF Network Data</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <table id="preload_vnf_data" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>ID</th>
+ <th>SVC_REQUEST_ID</th>
+ <th>NETWORK_NAME</th>
+ <th>NETWORK_TYPE</th>
+ <th>SVC_ACTION</th>
+ <th>UPLOAD STATUS</th>
+ <th>FILENAME</th>
+ <th>IMPORT/UPLOAD TIMESTAMP</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% var i=0; retData.forEach( function(rowObj) { %>
+ <tr>
+ <td><%= rowObj.row.id %></td>
+ <td><a href="javascript:getVnfNetworkData('<%= rowObj.network_name %>','<%= rowObj.network_type %>');"><%= rowObj.row.svc_request_id %></a></td>
+ <td><%= rowObj.network_name %></td>
+ <td><%= rowObj.network_type %></td>
+ <td><%= rowObj.row.svc_action %></td>
+ <td><%= rowObj.row.status %></td>
+ <td>
+ <a data-toggle="collapse"
+ href="#collapseExample<%= i %>" aria-expanded="false"
+ aria-controls="collapseExample"><%= rowObj.row.filename %>
+ </a>
+ <div class="collapse" id="collapseExample<%= i %>">
+ <div class="well">
+ <pre><%= JSON.stringify(rowObj.filecontent,null,4) %></pre>
+ </div>
+ </div>
+ </td>
+
+ <td><%= rowObj.row.ts %></td>
+ <% if(priv == 'A' ) { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteVnfNetworkData('<%= rowObj.row.id %>','<%= rowObj.row.svc_request_id %>','<%= rowObj.row.filename %>','<%= rowObj.row.status %>','<%= rowObj.network_name %>','<%= rowObj.network_type %>');">Delete</button>
+ <% if (typeof rowObj.network_name != 'undefined' || typeof rowObj.network_type != 'undefined'){ %>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="loadVnfNetworkData('<%= rowObj.row.id %>','<%= rowObj.row.svc_request_id %>','<%= rowObj.row.svc_action %>','<%= rowObj.row.status %>','<%= rowObj.row.filename %>','<%= rowObj.row.ts %>');">Load Data</button>
+ <% } %>
+ </td>
+ <% } %>
+ </tr>
+ <% i++; }); %>
+ </tbody>
+ </table>
+
+ <% if(priv == 'A'){ %>
+<div class="row">
+ <div class="col-md-8 col-md-push-4">
+ <form method="POST" action="/mobility/uploadVnfNetworkData" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">Upload pre processed JSON file.</label>
+ <input name="filename" type="file" id="dest"></input>
+ <p class="help-block">Choose a JSON file to upload.</p>
+ <button type="button" class="btn btn-default"
+ data-toggle="tooltip" data-placement="bottom"
+ title="Upload a JSON file that has already been pre processed."
+ onclick="uploadFile(this.form);">Upload JSON File
+ </button>
+ </div>
+ </form>
+ </div>
+ <div class="col-md-4 col-md-pull-8">
+ <form method="POST" action="/preload/uploadNetworkCsv" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">Upload Worksheet CSV files from the <%= preloadImportDirectory %> directory.</label>
+ <input name="filename" type="file" id="dest" multiple></input>
+ <p class="help-block">Choose Worksheet CSV files to upload.</p>
+ <button type="button" class="btn btn-default"
+ data-toggle="tooltip" data-placement="bottom"
+ title="Must upload all the VNF CSV files from <%= preloadImportDirectory %>"
+ onclick="importWorksheet(this.form);">Upload Network Worksheet CSV files
+ </button>
+ </div>
+ </form>
+ </div>
+</div>
+ <% } %>
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+
+function importWorksheet(form)
+{
+ if ( form.filename.value.length == 0)
+ {
+ bootbox.alert('Must select a file.');
+ return false;
+ }
+ else {
+
+ bootbox.confirm({
+ message: "Are you sure you want to import Network WORKSHEET .csv files from <%= preloadImportDirectory %>",
+ callback: function(result) {
+ if ( result )
+ {
+ form.submit();
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+ }
+}
+
+function getVnfNetworkData(network_name,network_type)
+{
+ location.assign("/mobility/viewVnfNetworkData?network_name=" + network_name + "&network_type=" + network_type );
+ return;
+}
+function loadVnfNetworkData(id,svc_request_id,svc_action,status,filename,ts)
+{
+ if ( status != 'pending' )
+ {
+ bootbox.alert("Upload Status must be in 'pending' state.");
+ return;
+ }
+ bootbox.confirm({
+ message: "Are you sure you want to load file [" + filename + "]? ",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/mobility/loadVnfNetworkData?id=" + id + "&svc_request_id=" + svc_request_id + "&filename=" + filename + "&status=" + status);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+function deleteVnfNetworkData(id,svc_request_id,filename,status,network_name,network_type) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete uploaded file [" + filename + "]? ",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/mobility/deleteVnfNetworkData?id="
+ + id
+ + "&svc_request_id=" + svc_request_id
+ + "&filename=" + filename
+ + "&status=" + status
+ + "&network_name=" + network_name
+ + "&network_type=" + network_type);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/mobility/vnfProfile.ejs b/admportal/views/mobility/vnfProfile.ejs
new file mode 100644
index 00000000..1a494985
--- /dev/null
+++ b/admportal/views/mobility/vnfProfile.ejs
@@ -0,0 +1,177 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vnf_profile').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>VNF Profile </h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+
+ <table id="vnf_profile" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*VNF_TYPE</th>
+ <th>AVAILABILITY_ZONE_COUNT</th>
+ <th>EQUIPMENT_ROLE</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.vnf_type %></td>
+ <td><%= row.availability_zone_count %></td>
+ <td><%= row.equipment_role %></td>
+ <% if(priv == 'A' ) { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteVnfProfile('<%= row.vnf_type %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/mobility/uploadVnfProfile" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ </form>
+ </div>
+ <% } %>
+</div>
+
+<% include ../partials/vnf_profile %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+
+function addVnfProfile(form)
+{
+ var errorMsg='';
+ var vnf_type='';
+ var availability_zone_count='';
+ var equipment_role='';
+
+ if ( form.name == 'addForm' )
+ {
+ vnf_type = form.nf_vnf_type;
+ availability_zone_count = form.nf_availability_zone_count;
+ equipment_role = form.nf_equipment_role;
+ }
+
+ if ( (vnf_type.value == null) || (vnf_type.value == "") || isblank(vnf_type.value) )
+ {
+ errorMsg += 'VNF Type is required.<br>';
+ }
+ if ( (availability_zone_count.value == null) || (availability_zone_count.value == "") || isblank(availability_zone_count.value) )
+ {
+ errorMsg += 'Availability Zone Count is a required field.<br>';
+ }
+ if ( (equipment_role.value == null) || (equipment_role.value == "") || isblank(equipment_role.value) )
+ {
+ errorMsg += 'Equipment Role is a required field.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ if ( availability_zone_count.value.length > 0 && !isDigit(availability_zone_count.value) )
+ {
+ bootbox.alert('Availability Zone Count must be a number.');
+ return;
+ }
+ form.submit();
+}
+
+function deleteVnfProfile(vnf_type) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete VNF_PROFILE [" + vnf_type + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/mobility/deleteVnfProfile?vnf_type=" + vnf_type);
+
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/odl/cluster_status.ejs b/admportal/views/odl/cluster_status.ejs
new file mode 100644
index 00000000..e7590dfe
--- /dev/null
+++ b/admportal/views/odl/cluster_status.ejs
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>SDN-C Cluster Status</h3>
+</div>
+
+
+<div class="container-fluid">
+ <table class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>ShardName</th>
+ <th>Status</th>
+ <th>Leader</th>
+ <th>RaftState</th>
+ <th>View Response</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% var i=0; if (response_obj != 'undefined' ) {
+ response_obj.forEach(function(request) { %>
+
+ <% if ( request.status == '200' ){ %>
+
+ <tr>
+ <td><%= request['value']['ShardName'] %></td>
+ <td><%= request.status %></td>
+ <td><%= request['value']['Leader'] %></td>
+ <td><%= request['value']['RaftState'] %></td>
+ <td>
+ <a class="btn btn-link" data-toggle="collapse"
+ href="#collapseExample<%= i %>" aria-expanded="false"
+ aria-controls="collapseExample"><%= request['value']['ShardName'] %>
+ </a>
+ <div class="collapse" id="collapseExample<%= i %>">
+ <div class="well">
+ <pre><%= JSON.stringify(request,null,4) %></pre>
+ </div>
+ </div>
+ </td>
+ </tr>
+ <% } else { %>
+ <tr>
+ <td>&nbsp;</td>
+ <td><%= request.status %></td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>
+ <a class="btn btn-link" data-toggle="collapse"
+ href="#collapseExample<%= i %>" aria-expanded="false"
+ aria-controls="collapseExample">View
+ </a>
+ <div class="collapse" id="collapseExample<%= i %>">
+ <div class="well">
+ <pre><%= JSON.stringify(request,null,4) %></pre>
+ </div>
+ </div>
+ </td>
+ </tr>
+
+ <% } %>
+ <% i++; }); }; %>
+
+ </tbody>
+ </table>
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/odl/listVRlan.ejs b/admportal/views/odl/listVRlan.ejs
new file mode 100644
index 00000000..93eedace
--- /dev/null
+++ b/admportal/views/odl/listVRlan.ejs
@@ -0,0 +1,1069 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>SDN-C AdminPortal</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+</head>
+<body>
+
+<h2>VR-LAN</h2>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+<div class="container-fluid">
+<div class="content">
+
+<% if ( typeof response_obj['vr-lan']['routing-protocol'] != 'undefined' ){ %>
+ <div class="content">
+ service-instance-id: <%= svc_instance_id %><br>
+ routing-protocol : <%= response_obj['vr-lan']['routing-protocol'] %>
+ </div>
+<% } %>
+
+<table class="tree">
+
+<% var i=1; root_node=1;
+if ( typeof response_obj['vr-lan'] != 'undefined' )
+{
+ if( typeof response_obj['vr-lan']['vr-lan-interface'] != 'undefined' )
+ {
+ response_obj['vr-lan']['vr-lan-interface'].forEach(function(request) {
+ var root_node = i %>
+
+ <tr class="treegrid-<%= i %>">
+ <td>vr-lan-interface</td>
+ </tr>
+ <% i++; %>
+
+ <% if ( request['vr-designation'] != 'undefined')
+ {
+ var vr_designation = request['vr-designation'];
+ } %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>">
+ <td>
+ <a href="javascript:vrlan_interface(
+ '<%= svc_instance_id %>',
+ '<%= request['vr-designation'] %>',
+ '<%= request['v6-vr-lan-prefix'] %>',
+ '<%= request['v6-vr-lan-prefix-length'] %>',
+ '<%= request['v6-vce-wan-address'] %>',
+ '<%= request['v4-vr-lan-prefix-length'] %>',
+ '<%= request['v4-vr-lan-prefix'] %>',
+ '<%= request['t-defaulted-v6-vrlan'] %>',
+ '<%= request['v4-vce-loopback-address'] %>');">vr-lan-interface</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( (typeof request['v6-public-lan-prefixes'] != 'undefined') && (typeof request['v6-public-lan-prefixes']['t-provided-v6-lan-public-prefixes'] != 'undefined') )
+ { %>
+ <% request['v6-public-lan-prefixes']['t-provided-v6-lan-public-prefixes'].forEach(function(trequest){ var t_v6_root = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>">
+ <td>v6-public-lan-prefixes</td>
+ </tr>
+ <% i++; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= t_v6_root %>">
+ <td>
+ <a href="javascript:t_provided_v6_prefixes(
+ '<%= svc_instance_id %>',
+ '<%= trequest['request-index'] %>',
+ '<%= trequest['v6-next-hop-address'] %>',
+ '<%= trequest['v6-lan-public-prefix-length'] %>',
+ '<%= trequest['v6-lan-public-prefix'] %>');">t-provided-v6-lan-public-prefixes</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+
+ <% if ( typeof request['dhcp'] != 'undefined' )
+ { %>
+ <% var dhcp_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>">
+ <td>dhcp</td>
+ </tr>
+ <% i++; %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>
+ <a href="javascript:dhcp(
+ '<%= svc_instance_id %>',
+ '<%= request['dhcp']['use-v4-default-pool'] %>',
+ '<%= request['dhcp']['use-v6-default-pool'] %>',
+ '<%= request['dhcp']['v4-dhcp-server-enabled'] %>',
+ '<%= request['dhcp']['v6-dhcp-server-enabled'] %>',
+ '<%= request['dhcp']['v6-dhcp-default-pool-prefix'] %>',
+ '<%= request['dhcp']['v6-dhcp-default-pool-prefix-length'] %>',
+ '<%= request['dhcp']['v4-dhcp-default-pool-prefix'] %>',
+ '<%= request['dhcp']['v4-dhcp-default-pool-prefix-length'] %>');">dhcp</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['dhcp']['v4-dhcp-pools'] != 'undefined' )
+ { %>
+ <% var v4_dhcp_pools_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>v4-dhcp-pool</td>
+ </tr>
+ <% i++; %>
+
+ <% request['dhcp']['v4-dhcp-pools'].forEach(function(v4request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>
+ <a href="javascript:v4_dhcp_pools(
+ '<%= svc_instance_id %>',
+ '<%= v4request['v4-dhcp-relay-next-hop-address'] %>',
+ '<%= v4request['v4-dhcp-pool-prefix'] %>',
+ '<%= v4request['v4-dhcp-pool-prefix-length'] %>',
+ '<%= v4request['v4-dhcp-relay-gateway-address'] %>');">v4-dhcp-pools</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof v4request['excluded-v4-address'] != 'undefined' )
+ { %>
+ <% var excluded_v4_address_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_dhcp_node %>">
+ <td>exluded-v4-address</td>
+ </tr>
+ <% i++; %>
+
+ <% v4request['excluded-v4-addresses'].forEach(function(ex_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= excluded_v4_address_node %>">
+ <td>
+ <a href="javascript:excluded_v4_address(
+ '<%= svc_instance_id %>',
+ '<%= ex_request['excluded-v4-address'] %>');">excluded-v4-address</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% }); %>
+ <% } %>
+
+ <% if ( typeof request['dhcp']['excluded-v4-dhcp-addresses-from-default-pool'] != 'undefined' )
+ { %>
+ <% var exc_v4_address_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>excluded-v4-dhcp-addresses-from-default-pool</td>
+ </tr>
+ <% i++; %>
+
+ <% request['dhcp']['excluded-v4-dhcp-addresses-from-default-pool'].forEach(function(ex_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= exc_v4_address_node %>">
+ <td>
+ <a href="javascript:excluded_v4_addresses_from_default_pool(
+ '<%= svc_instance_id %>',
+ '<%= ex_request['excluded-v4-address'] %>');">excluded-v4-dhcp-addresses-from-default-pool</a>
+ </td>
+ </tr>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+
+ <% if ( typeof request['dhcp']['v6-dhcp-pools'] != 'undefined' )
+ { %>
+ <% var v6_dhcp_pools_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>v6-dhcp-pool</td>
+ </tr>
+ <% i++; %>
+
+ <% request['dhcp']['v6-dhcp-pools'].forEach(function(v6request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>
+ <a href="javascript:v6_dhcp_pools(
+ '<%= svc_instance_id %>',
+ '<%= v6request['v6-dhcp-relay-next-hop-address'] %>',
+ '<%= v6request['v6-dhcp-pool-prefix'] %>',
+ '<%= v6request['v6-dhcp-pool-prefix-length'] %>',
+ '<%= v6request['v6-dhcp-relay-gateway-address'] %>');">v6-dhcp-pools</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof v4request['excluded-v6-addresses'] != 'undefined' )
+ { %>
+ <% var excluded_v6_address_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_dhcp_node %>">
+ <td>exluded-v6-address</td>
+ </tr>
+ <% i++; %>
+
+ <% v6request['excluded-v6-addresses'].forEach(function(ex_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= excluded_v6_address_node %>">
+ <td>
+ <a href="javascript:excluded_v6_address(
+ '<%= svc_instance_id %>',
+ '<%= ex_request['excluded-v6-address'] %>');">excluded-v6-address</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% }); %>
+ <% } %>
+
+ <% if ( typeof request['dhcp']['excluded-v6-dhcp-addresses-from-default-pool'] != 'undefined' )
+ { %>
+ <% var exc_v6_address_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>excluded-v6-dhcp-addresses-from-default-pool</td>
+ </tr>
+ <% i++; %>
+
+ <% request['dhcp']['excluded-v6-dhcp-addresses-from-default-pool'].forEach(function(ex_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= exc_v6_address_node %>">
+ <td>
+ <a href="javascript:excluded_v6_addresses_from_default_pool(
+ '<%= svc_instance_id %>',
+ '<%= ex_request['excluded-v6-address'] %>');">excluded-v6-dhcp-addresses-from-default-pool</a>
+ </td>
+ </tr>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% } %>
+
+ <% if ( typeof request['firewall-lite'] != 'undefined' )
+ { %>
+ <% var firewall_lite_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>">
+ <td>firewall-lite</td>
+ </tr>
+ <% i++; %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>">
+ <td>
+ <a href="javascript:firewall_lite(
+ '<%= svc_instance_id %>',
+ '<%= vr_designation %>',
+ '<%= request['firewall-lite']['stateful-firewall-lite-v6-enabled'] %>',
+ '<%= request['firewall-lite']['stateful-firewall-lite-v4-enabled'] %>');">firewall-lite</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['firewall-lite']['v6-firewall-packet-filters'] != 'undefined' )
+ {
+ var v6_firewall_packet_filters_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>">
+ <td>v6-firewall-packet-filters</td>
+ </tr>
+ <% i++; %>
+
+ <% request['firewall-lite']['v6-firewall-packet-filters'].forEach(function(v6request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>">
+ <td>
+ <a href="javascript:v6_firewall_packet_filters(
+ '<%= svc_instance_id %>',
+ '<%= v6request['v6-firewall-prefix'] %>',
+ '<%= v6request['v6-firewall-prefix-length'] %>',
+ '<%= v6request['allow-icmp-ping'] %>');">v6-firewall-packet-filters</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof v6request['udp-port-list'] != 'undefined' )
+ { %>
+ <% v6request['udp-port-list'].forEach(function(udp_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>">
+ <td>
+ <a href="javascript:udp_port_list(
+ '<%= svc_instance_id %>',
+ '<%= udp_request['port-number'] %>');">udp-port-list</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% if ( typeof v6p_request['tcp-port-list'] != 'undefined' )
+ { %>
+ <% v6request['tcp-port-list'].forEach(function(tcp_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>">
+ <td>
+ <a href="javascript:tcp_port_list(
+ '<%= svc_instance_id %>',
+ '<%= tcp_request['port-number'] %>');">tcp-port-list</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% }); %>
+ <% } %>
+ <% if ( typeof request['firewall-lite']['v4-firewall-packet-filters'] != 'undefined' )
+ {
+ var v4_firewall_packet_filters_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>">
+ <td>v4-firewall-packet-filters</td>
+ </tr>
+ <% i++; %>
+
+ <% request['firewall-lite']['v4-firewall-packet-filters'].forEach(function(v4request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>">
+ <td>
+ <a href="javascript:v4_firewall_packet_filters(
+ '<%= svc_instance_id %>',
+ '<%= v4request['v4-firewall-prefix'] %>',
+ '<%= v4request['v4-firewall-prefix-length'] %>',
+ '<%= v4request['allow-icmp-ping'] %>');">v4-firewall-packet-filters</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof v4request['udp-port-list'] != 'undefined' )
+ { %>
+ <% v4request['udp-port-list'].forEach(function(udp_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>">
+ <td>
+ <a href="javascript:udp_port_list(
+ '<%= svc_instance_id %>',
+ '<%= udp_request['port-number'] %>');">udp-port-list</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% if ( typeof v4p_request['tcp-port-list'] != 'undefined' )
+ { %>
+ <% v4request['tcp-port-list'].forEach(function(tcp_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>">
+ <td>
+ <a href="javascript:tcp_port_list(
+ '<%= svc_instance_id %>',
+ '<%= tcp_request['port-number'] %>');">tcp-port-list</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% }); %>
+ <% } %>
+
+ <% } %>
+
+ <% if ( typeof request['static-routes'] != 'undefined' )
+ {
+ var static_route_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>">
+ <td>static-routes</td>
+ </tr>
+ <% i++; %>
+ <% if ( typeof request['static-routes']['v6-static-routes'] != 'undefined' )
+ { %>
+ <% v6_static_route = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= static_route_node %>">
+ <td>v6-static-routes</td>
+ </tr>
+ <% i++; %>
+
+ <% request['static-routes']['v6-static-routes'].forEach(function(strequest){ %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_static_route %>">
+ <td>
+ <a href="javascript:v6_static_routes(
+ '<%= svc_instance_id %>',
+ '<%= strequest['v6-static-route-prefix'] %>',
+ '<%= strequest['v6-next-hop-address'] %>',
+ '<%= strequest['v6-static-route-prefix-length'] %>');">v6-static-routes</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% if ( typeof request['static-routes']['v4-static-routes'] != 'undefined' )
+ { %>
+ <% v4_static_route = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= static_route_node %>">
+ <td>v4-static-routes</td>
+ </tr>
+ <% i++; %>
+ <% request['static-routes']['v4-static-routes'].forEach(function(v4request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_static_route %>">
+ <td>
+ <a href="javascript:v4_static_routes(
+ '<%= svc_instance_id %>',
+ '<%= v4request['v4-static-route-prefix'] %>',
+ '<%= v4request['v4-next-hop-address'] %>',
+ '<%= v4request['v4-static-route-prefix-length'] %>');">v4-static-routes</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% } %>
+ <% if ( typeof request['pat'] != 'undefined' )
+ { %>
+ <% var pat_node = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>">
+ <td>pat</td>
+ </tr>
+ <% i++; %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_node %>">
+ <td>
+ <a href="javascript:pat(
+ '<%= svc_instance_id %>',
+ '<%= request['pat']['v4-pat-default-pool-prefix-length'] %>',
+ '<%= request['pat']['use-v4-default-pool'] %>',
+ '<%= request['pat']['v4-pat-enabled'] %>',
+ '<%= request['pat']['v4-pat-default-pool-prefix'] %>');">pat</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['pat']['v4-pat-pools'] != 'undefined' )
+ {
+ var pat_pools_node = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_node %>">
+ <td>v4-pat-pools</td>
+ </tr>
+ <% i++; %>
+
+ <% request['pat']['v4-pat-pools'].forEach(function(trequest)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_pools_node %>">
+ <td>
+ <a href="javascript:pat_pools(
+ '<%= svc_instance_id %>',
+ '<%= trequest['v4-pat-pool-next-hop-address'] %>',
+ '<%= trequest['v4-pat-pool-prefix-length'] %>',
+ '<%= trequest['v4-pat-pool-prefix'] %>');">v4-pat-pools</a>
+ </td>
+ </tr>
+ <% }); %>
+ <% i++; %>
+
+ <% } %>
+ <% } %>
+ <% if ( typeof request['nat'] != 'undefined' )
+ { %>
+ <% var nat_node = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>">
+ <td>nat</td>
+ </tr>
+ <% i++; %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_node %>">
+ <td>
+ <a href="javascript:nat(
+ '<%= svc_instance_id %>',
+ '<%= request['pat']['v4-nat-enabled'] %>');">nat</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['nat']['v4-nat-mapping-entries'] != 'undefined' )
+ {
+ var nat_mapping_node = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_node %>">
+ <td>v4-nat-mapping-entries</td>
+ </tr>
+ <% i++; %>
+
+ <% request['nat']['v4-nat-mapping-entries'].forEach(function(trequest)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_mapping_node %>">
+ <td>
+ <a href="javascript:v4_nat_mapping_entries(
+ '<%= svc_instance_id %>',
+ '<%= trequest['v4-nat-external'] %>',
+ '<%= trequest['v4-nat-next-hop-address'] %>',
+ '<%= trequest['v4-nat-internal'] %>');">v4-nat-mapping-entries</a>
+ </td>
+ </tr>
+ <% }); %>
+ <% i++; %>
+
+ <% } %>
+ <% } %>
+
+ <% if ( (typeof request['v4-public-lan-prefixes'] != 'undefined') && (typeof request['v4-public-lan-prefixes']['t-provided-v4-lan-public-prefixes'] != 'undefined') )
+ { %>
+ <% request['v4-public-lan-prefixes']['t-provided-v4-lan-public-prefixes'].forEach(function(trequest){
+ var v4_public_root = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>">
+ <td>v4-public-lan-prefixes</td>
+ </tr>
+ <% i++; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_public_root %>">
+ <td>
+ <a href="javascript:t_provided_v4_prefixes(
+ '<%= svc_instance_id %>',
+ '<%= trequest['request-index'] %>',
+ '<%= trequest['v4-lan-public-prefix-length'] %>',
+ '<%= trequest['v4-lan-public-prefix'] %>');">t-provided-v4-lan-public-prefixes</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% });
+ }
+} else { %>
+ <div><pre>no data</pre></div>
+<% } %>
+</table>
+</div>
+</div>
+
+ <% include ../partials/vr_lan_interface %>
+ <% include ../partials/dhcp %>
+ <% include ../partials/v4_dhcp_pools %>
+ <% include ../partials/v6_dhcp_pools %>
+ <% include ../partials/excluded_v4_address %>
+ <% include ../partials/excluded_v4_address_from_default_pool %>
+ <% include ../partials/excluded_v6_address_from_default_pool %>
+ <% include ../partials/t_provided_v6_lan_public_prefixes %>
+ <% include ../partials/firewall_lite %>
+ <% include ../partials/v6_static_routes %>
+ <% include ../partials/v4_static_routes %>
+ <% include ../partials/pat %>
+ <% include ../partials/pat_pools %>
+ <% include ../partials/nat %>
+ <% include ../partials/v4_nat_mapping_entries %>
+ <% include ../partials/t_provided_v4_lan_public_prefixes %>
+ <% include ../partials/v6_firewall_packet_filters %>
+ <% include ../partials/v4_firewall_packet_filters %>
+ <% include ../partials/udp_port_list %>
+ <% include ../partials/tcp_port_list %>
+ <footer>
+ <% include ../partials/footer %>
+ </footer>
+
+<script type="text/javascript">
+
+$(document).ready(function() {
+ $('.tree').treegrid( { initialState: 'collapsed' } );
+});
+
+function excluded_v4_addresses_from_default_pool(svc_instance_id, excluded_v4_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('excluded_v4_address_from_default_pool');
+ if( excluded_v4_address != 'undefined' ){
+ lvalue.value=excluded_v4_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#excluded-v4-address-from-default-pool-modal').modal('show');
+}
+function excluded_v6_addresses_from_default_pool(svc_instance_id, excluded_v6_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('excluded_v6_address');
+ if( excluded_v6_address != 'undefined' ){
+ lvalue.value=excluded_v6_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#excluded-v6-address-modal').modal('show');
+}
+function excluded_v4_addresses_from_default_pool(svc_instance_id, excluded_v4_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('excluded_v4_address');
+ if( excluded_v4_address != 'undefined' ){
+ lvalue.value=excluded_v4_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#excluded-v4-address-modal').modal('show');
+}
+function exluded_v4_address(svc_instance_id, excluded_v4_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('excluded_v4_address');
+ if( excluded_v4_address != 'undefined' ){
+ lvalue.value=excluded_v4_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#excluded-v4-address-modal').modal('show');
+}
+
+function v6_dhcp_pools(svc_instance_id,v6_dhcp_relay_next_hop_address,v6_dhcp_pool_prefix,v6_dhcp_pool_prefix_length,v6_dhcp_relay_gateway_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v6_dhcp_relay_next_hop_address');
+ if( v6_dhcp_relay_next_hop_address != 'undefined' ){
+ lvalue.value=v6_dhcp_relay_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_pool_prefix');
+ if( v6_dhcp_pool_prefix != 'undefined' ){
+ lvalue.value=v6_dhcp_pool_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_pool_prefix_length');
+ if( v6_dhcp_pool_prefix_length != 'undefined' ){
+ lvalue.value=v6_dhcp_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_relay_gateway_address');
+ if( v6_dhcp_relay_gateway_address != 'undefined' ){
+ lvalue.value=v6_dhcp_relay_gateway_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#v6-dhcp-pools-modal').modal('show');
+}
+
+function v4_dhcp_pools(svc_instance_id,v4_dhcp_relay_next_hop_address,v4_dhcp_pool_prefix,v4_dhcp_pool_prefix_length,v4_dhcp_relay_gateway_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_dhcp_relay_next_hop_address');
+ if( v4_dhcp_relay_next_hop_address != 'undefined' ){
+ lvalue.value=v4_dhcp_relay_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_pool_prefix');
+ if( v4_dhcp_pool_prefix != 'undefined' ){
+ lvalue.value=v4_dhcp_pool_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_pool_prefix_length');
+ if( v4_dhcp_pool_prefix_length != 'undefined' ){
+ lvalue.value=v4_dhcp_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_relay_gateway_address');
+ if( v4_dhcp_relay_gateway_address != 'undefined' ){
+ lvalue.value=v4_dhcp_relay_gateway_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#v4-dhcp-pools-modal').modal('show');
+}
+
+function dhcp(svc_instance_id,use_v4_default_pool,use_v6_default_pool,v4_dhcp_server_enabled,v6_dhcp_server_enabled,v6_dhcp_default_pool_prefix,v6_dhcp_default_pool_prefix_length,v4_dhcp_default_pool_prefix,v4_dhcp_default_pool_prefix_length)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('use_v4_default_pool');
+ if( use_v4_default_pool != 'undefined' ){
+ lvalue.value=use_v4_default_pool;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('use_v6_default_pool');
+ if( use_v6_default_pool != 'undefined' ){
+ lvalue.value=use_v6_default_pool;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_server_enabled');
+ if( v4_dhcp_server_enabled != 'undefined' ){
+ lvalue.value=v4_dhcp_server_enabled;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_server_enabled');
+ if( v6_dhcp_server_enabled != 'undefined' ){
+ lvalue.value=v6_dhcp_server_enabled;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_default_pool_prefix');
+ if( v6_dhcp_default_pool_prefix != 'undefined' ){
+ lvalue.value=v6_dhcp_default_pool_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_default_pool_prefix_length');
+ if( v6_dhcp_default_pool_prefix_length != 'undefined' ){
+ lvalue.value=v6_dhcp_default_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_default_pool_prefix');
+ if( v4_dhcp_default_pool_prefix != 'undefined' ){
+ lvalue.value=v4_dhcp_default_pool_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_default_pool_prefix_length');
+ if( v4_dhcp_default_pool_prefix_length != 'undefined' ){
+ lvalue.value=v4_dhcp_default_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ $('#dhcp-modal').modal('show');
+}
+
+function tcp_port_list(svc_instance_id,tcp_port_number)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('tcp_port_number');
+ if( tcp_port_number != 'undefined' ){
+ lvalue.value=tcp_port_number;
+ } else {
+ lvalue.value='';
+ }
+ $('#tcp-port-list-modal').modal('show');
+}
+function udp_port_list(svc_instance_id,udp_port_number)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('udp_port_number');
+ if( udp_port_number != 'undefined' ){
+ lvalue.value=udp_port_number;
+ } else {
+ lvalue.value='';
+ }
+ $('#udp-port-list-modal').modal('show');
+}
+function v4_firewall_packet_filters(svc_instance_id,v4_firewall_prefix,v4_firewall_prefix_length,v4_allow_icmp_ping)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_firewall_prefix');
+ if( v4_firewall_prefix != 'undefined' ){
+ lvalue.value=v4_firewall_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_firewall_prefix_length');
+ if( v4_firewall_prefix_length != 'undefined' ){
+ lvalue.value=v4_firewall_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_allow_icmp_ping');
+ if( v4_allow_icmp_ping != 'undefined' ){
+ lvalue.value=v4_allow_icmp_ping;
+ } else {
+ lvalue.value='';
+ }
+ $('#v4-firewall-packet-filters-modal').modal('show');
+}
+
+function v6_firewall_packet_filters(svc_instance_id,v6_firewall_prefix,v6_firewall_prefix_length,v6_allow_icmp_ping)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v6_firewall_prefix');
+ if( v6_firewall_prefix != 'undefined' ){
+ lvalue.value=v6_firewall_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_firewall_prefix_length');
+ if( v6_firewall_prefix_length != 'undefined' ){
+ lvalue.value=v6_firewall_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_allow_icmp_ping');
+ if( v6_allow_icmp_ping != 'undefined' ){
+ lvalue.value=v6_allow_icmp_ping;
+ } else {
+ lvalue.value='';
+ }
+ $('#v6-firewall-packet-filters-modal').modal('show');
+} function nat(svc_instance_id,v4_nat_enabled) {
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_nat_enabled');
+ if( v4_nat_enabled != 'undefined' ){
+ lvalue.value=v4_nat_enabled;
+ } else {
+ lvalue.value='';
+ }
+ $('#nat-modal').modal('show');
+}
+function v4_nat_mapping_entries(svc_instance_id,v4_nat_external,v4_nat_next_hop_address,v4_nat_internal)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_nat_external');
+ if( v4_nat_external != 'undefined' ){
+ lvalue.value=v4_nat_external;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_nat_next_hop_address');
+ if( v4_nat_next_hop_address != 'undefined' ){
+ lvalue.value=v4_nat_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_nat_internal');
+ if( v4_nat_internal != 'undefined' ){
+ lvalue.value=v4_nat_internal;
+ } else {
+ lvalue.value='';
+ }
+ $('#v4-nat-mapping-entries-modal').modal('show');
+}
+function pat_pools(svc_instance_id,v4_pat_pool_next_hop_address,v4_pat_pool_prefix_length,v4_pat_pool_prefix)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_pat_pool_next_hop_address');
+ if( v4_pat_pool_next_hop_address != 'undefined' ){
+ lvalue.value=v4_pat_pool_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_pat_pool_prefix_length');
+ if( v4_pat_pool_prefix_length != 'undefined' ){
+ lvalue.value=v4_pat_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_pat_pool_prefix');
+ if( v4_pat_pool_prefix != 'undefined' ){
+ lvalue.value=v4_pat_pool_prefix;
+ } else {
+ lvalue.value='';
+ }
+ $('#pat-pools-modal').modal('show');
+}
+function pat(svc_instance_id,v4_pat_default_pool_prefix_length,use_v4_default_pool,v4_pat_enabled,v4_pat_default_pool_prefix)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_pat_default_pool_prefix_length');
+ if( v4_pat_default_pool_prefix_length != 'undefined' ){
+ lvalue.value=v4_pat_default_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+
+ lvalue = document.getElementById('use_v4_default_pool');
+ if( use_v4_default_pool != 'undefined' ){
+ lvalue.value = use_v4_default_pool;
+ } else {
+ lvalue.value = '';
+ }
+
+ lvalue = document.getElementById('v4_pat_enabled');
+ if( v4_pat_enabled != 'undefined' ){
+ lvalue.value = v4_pat_enabled;
+ } else {
+ lvalue.value = '';
+ }
+
+ lvalue = document.getElementById('v4_pat_default_pool_prefix');
+ if( v4_pat_default_pool_prefix != 'undefined' ){
+ lvalue.value = v4_pat_default_pool_prefix;
+ } else {
+ lvalue.value = '';
+ }
+ $('#pat-modal').modal('show');
+}
+function v4_static_routes(svc_instance_id,v4_static_route_prefix,static_v4_next_hop_address,v4_static_route_prefix_length)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_static_route_prefix');
+ if( v4_static_route_prefix != 'undefined' ){
+ lvalue.value=v4_static_route_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('static_v4_next_hop_address');
+ if( static_v4_next_hop_address != 'undefined' ){
+ lvalue.value=static_v4_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_static_route_prefix_length');
+ if( v4_static_route_prefix_length != 'undefined' ){
+ lvalue.value=v4_static_route_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ $('#v4-static-routes-modal').modal('show');
+}
+
+function v6_static_routes(svc_instance_id,v6_static_route_prefix,static_v6_next_hop_address,v6_static_route_prefix_length)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v6_static_route_prefix');
+ if( v6_static_route_prefix != 'undefined' ){
+ lvalue.value=v6_static_route_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('static_v6_next_hop_address');
+ if( static_v6_next_hop_address != 'undefined' ){
+ lvalue.value=static_v6_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_static_route_prefix_length');
+ if( v6_static_route_prefix_length != 'undefined' ){
+ lvalue.value=v6_static_route_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ $('#v6-static-routes-modal').modal('show');
+}
+function firewall_lite(svc_instance_id,firewall_lite_vr_designation,stateful_firewall_lite_v4_enabled,stateful_firewall_lite_v6_enabled)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ document.getElementById('firewall_lite_vr_designation').value = firewall_lite_vr_designation;
+ var lvalue = document.getElementById('stateful_firewall_lite_v4_enabled');
+ if( stateful_firewall_lite_v4_enabled != 'undefined' ){
+ lvalue.value=stateful_firewall_lite_v4_enabled;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('stateful_firewall_lite_v6_enabled');
+ if( stateful_firewall_lite_v6_enabled != 'undefined' ){
+ lvalue.value=stateful_firewall_lite_v6_enabled;
+ } else {
+ lvalue.value='';
+ }
+ $('#firewall-lite-modal').modal('show');
+}
+function t_provided_v6_prefixes(svc_instance_id,v6_request_index,v6_lan_public_prefix_length,v6_lan_public_prefix)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v6_request_index');
+ if( v6_request_index != 'undefined' ){
+ lvalue.value=v6_request_index;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_lan_public_prefix_length');
+ if( v6_lan_public_prefix_length != 'undefined' ){
+ lvalue.value=v6_lan_public_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_lan_public_prefix');
+ if( v6_lan_public_prefix != 'undefined' ){
+ lvalue.value=v6_lan_public_prefix;
+ } else {
+ lvalue.value='';
+ }
+ $('#t-provided-v6-lan-public-prefixes-modal').modal('show');
+}
+function t_provided_v4_prefixes(svc_instance_id,v4_request_index,v4_lan_public_prefix_length,v4_lan_public_prefix)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_request_index');
+ if( v4_request_index != 'undefined' ){
+ lvalue.value=v4_request_index;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_lan_public_prefix_length');
+ if( v4_lan_public_prefix_length != 'undefined' ){
+ lvalue.value=v4_lan_public_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_lan_public_prefix');
+ if( v4_lan_public_prefix != 'undefined' ){
+ lvalue.value=v4_lan_public_prefix;
+ } else {
+ lvalue.value='';
+ }
+ $('#t-provided-v4-lan-public-prefixes-modal').modal('show');
+}
+
+function vrlan_interface(svc_instance_id,vr_designation,v6_vr_lan_prefix, v6_vr_lan_prefix_length, v6_vce_wan_address, v4_vr_lan_prefix_length, v4_vr_lan_prefix, t_defaulted_v6_vrlan,v4_vce_loopback_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('vr_designation');
+ if( vr_designation != 'undefined' ){
+ lvalue.value=vr_designation;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_vr_lan_prefix');
+ if( v6_vr_lan_prefix != 'undefined' ){
+ lvalue.value=v6_vr_lan_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_vr_lan_prefix_length');
+ if( v6_vr_lan_prefix_length != 'undefined' ){
+ lvalue.value=v6_vr_lan_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_vce_wan_address');
+ if( v6_vce_wan_address != 'undefined' ){
+ lvalue.value=v6_vce_wan_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_vr_lan_prefix_length');
+ if( v4_vr_lan_prefix_length != 'undefined' ){
+ lvalue.value=v4_vr_lan_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_vr_lan_prefix');
+ if( v4_vr_lan_prefix != 'undefined' ){
+ lvalue.value=v4_vr_lan_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_vce_loopback_address');
+ if( v4_vce_loopback_address != 'undefined' ){
+ lvalue.value=v4_vce_loopback_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('t_defaulted_v6_vrlan');
+ if( t_defaulted_v6_vrlan != 'undefined' ){
+ lvalue.value=t_defaulted_v6_vrlan;
+ } else {
+ lvalue.value='';
+ }
+ $('#vr-lan-interface-modal').modal('show');
+}
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/odl/listWklst.ejs b/admportal/views/odl/listWklst.ejs
new file mode 100644
index 00000000..432c2071
--- /dev/null
+++ b/admportal/views/odl/listWklst.ejs
@@ -0,0 +1,2224 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>SDN-C AdminPortal</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+
+<script type="text/javascript">
+$(document).ready(function() {
+ $('.tree').treegrid( { initialState: 'collapsed' } );
+});
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>L3SDN-API Services</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'><%=result.msg %></div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'><%=result.msg %></div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<div class="container-fluid">
+<div class="content">
+
+<table class="table tree table-hover table-condensed">
+<% var i=1; root_node=1;
+pageInfo.rows.forEach(function(request)
+{
+ root_node = i; %>
+
+ <tr class="treegrid-<%= i %>">
+ <td><%= request['service-instance-id'] %></td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['service-status'] != 'undefined' )
+ { %>
+ <tr class="treegrid-<%= i %>> treegrid-parent-<%= root_node %>">
+ <td>
+ <a class=""
+ href="javascript:serviceStatus(
+ '<%= request['service-status']['rpc-name'] %>',
+ '<%= request['service-status']['final-indicator'] %>',
+ '<%= request['service-status']['request-status'] %>',
+ '<%= request['service-status']['rpc-action'] %>',
+ '<%= request['service-status']['l3sdn-action'] %>',
+ '<%= request['service-status']['l3sdn-subaction'] %>',
+ '<%= request['service-status']['response-message'] %>',
+ '<%= request['service-status']['response-code'] %>',
+ '<%= request['service-status']['response-timestamp'] %>' );">service-status</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% } %>
+ <% if ( typeof request['service-data'] != 'undefined' )
+ { %>
+ <% var service_data_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= root_node %>">
+ <td> service-data</td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['service-data']['internet-evc-access-information'] != 'undefined' )
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td>
+ <a class=""
+ href="javascript:internetInfo(
+ '<%= request['service-data']['internet-evc-access-information']['ip-version'] %>',
+ '<%= request['service-data']['internet-evc-access-information']['internet-evc-speed-value'] %>',
+ '<%= request['service-data']['internet-evc-access-information']['internet-evc-speed-units'] %>');">internet-evc-access-information</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% } %>
+ <% if ( typeof request['service-data']['oper-status'] != 'undefined' )
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td>
+ <a class=""
+ href="javascript:operStatus(
+ '<%= request['service-data']['oper-status']['order-status'] %>',
+ '<%= request['service-data']['oper-status']['modify-timestamp'] %>',
+ '<%= request['service-data']['oper-status']['last-svc-request-id'] %>',
+ '<%= request['service-data']['oper-status']['last-sub-action'] %>',
+ '<%= request['service-data']['oper-status']['t-defaulted-v6-vrlan'] %>',
+ '<%= request['service-data']['oper-status']['last-action'] %>',
+ '<%= request['service-data']['oper-status']['create-timestamp'] %>',
+ '<%= request['service-data']['oper-status']['maintenance-indicator'] %>',
+ '<%= request['service-data']['oper-status']['last-order-status'] %>');">oper-status</a>
+ </td>
+ </tr>
+ <% i = i+1; %>
+ <% } %>
+ <% if ( typeof request['service-data']['svc-topology-additional-data'] != 'undefined' )
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td>
+ <a class=""
+ href="javascript:svcTopo(
+ '<%= request['service-data']['svc-topology-additional-data']['svc-vnf-type'] %>');">svc-topology-additional-data</a>
+ </td>
+ </tr>
+ <% i = i+1; %>
+ <% } %>
+ <% if ( typeof request['service-data']['request-information'] != 'undefined' )
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td>
+ <a class=""
+ href="javascript:reqInfo(
+ '<%= request['service-data']['request-information']['notification-url'] %>',
+ '<%= request['service-data']['request-information']['source'] %>',
+ '<%= request['service-data']['request-information']['order-number'] %>',
+ '<%= request['service-data']['request-information']['request-id'] %>',
+ '<%= request['service-data']['request-information']['order-version'] %>',
+ '<%= request['service-data']['request-information']['request-action'] %>',
+ '<%= request['service-data']['request-information']['request-sub-action'] %>');">request-information</a>
+ </td>
+ </tr>
+ <% i = i+1; %>
+ <% } %>
+ <% if ( typeof request['service-data']['sdnc-request-header'] != 'undefined' )
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td>
+ <a class=""
+ href="javascript:reqHeader(
+ '<%= request['service-data']['sdnc-request-header']['svc-notification-url'] %>',
+ '<%= request['service-data']['sdnc-request-header']['svc-request-id'] %>',
+ '<%= request['service-data']['sdnc-request-header']['svc-action'] %>');">sdnc-request-header</a>
+ </td>
+ </tr>
+ <% i = i+1; %>
+ <% } %>
+ <% if ( typeof request['service-data']['l2-homing-information'] != 'undefined' )
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td>
+ <a class=""
+ href="javascript:l2Homing(
+ '<%= request['service-data']['l2-homing-information']['evc-name'] %>',
+ '<%= request['service-data']['l2-homing-information']['preferred-aic-clli'] %>',
+ '<%= request['service-data']['l2-homing-information']['topology'] %>');">l2-homing-information</a>
+ </td>
+ </tr>
+ <% i = i+1; %>
+ <% } %>
+ <% if ( typeof request['service-data']['service-information'] != 'undefined' )
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td>
+ <a class=""
+ href="javascript:svcInfo(
+ '<%= request['service-data']['service-information']['service-instance-id'] %>',
+ '<%= request['service-data']['service-information']['subscriber-name'] %>',
+ '<%= request['service-data']['service-information']['service-type'] %>');">service-information</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% } %>
+ <% if ( typeof request['service-data']['feature-list'] != 'undefined' )
+ { %>
+ <% var feature_list_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td> feature-list</td>
+ </tr>
+ <% i++; %>
+
+ <% request['service-data']['feature-list'].forEach(function(request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= feature_list_node %>">
+ <td>
+ <a class=""
+ href="javascript:feature_list(
+ '<%= request['feature-instance-id'] %>',
+ '<%= request['feature-instance-xpath'] %>',
+ '<%= request['feature-sub-type'] %>',
+ '<%= request['feature-type'] %>');">feature-list</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% if ( typeof request['service-data']['svc-config-additional-data'] != 'undefined' )
+ { %>
+ <% var svc_config_additional_data_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td> svc-config-additional-data</td>
+ </tr>
+ <% i++; %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= svc_config_additional_data_node %>">
+ <td>
+ <a class=""
+ href="javascript:svc_config_additional_data(
+ '<%= request['service-data']['svc-config-additional-data']['management-ip'] %>');">management-ip</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% } %>
+ <% if ( typeof request['service-data']['equipment'] != 'undefined' )
+ { %>
+ <% var equipment_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td> equipment</td>
+ </tr>
+ <% i++; %>
+
+ <% request['service-data']['equipment'].forEach(function(equip)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= equipment_node %>">
+ <td>
+ <a class=""
+ href="javascript:equipment(
+ '<%= equip['equipment-role'] %>',
+ '<%= equip['ipv4-oam-address'] %>',
+ '<%= equip['ipv4-oam-gateway-address-prefix-length'] %>',
+ '<%= equip['ptnii-name'] %>',
+ '<%= equip['v4-loopback0-ip-address'] %>',
+ '<%= equip['ipv4-oam-gateway-address'] %>');">equipment</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof equip['ipv4-infrastructure-static-route'] != 'undefined' )
+ { %>
+ <% ipv4_infrastructure_static_route_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= equipment_node %>">
+ <td> ipv4-infrastructure-static-route</td>
+ </tr>
+ <% i++; %>
+
+ <% equip['ipv4-infrastructure-static-route'].forEach(function(eroute)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= ipv4_infrastructure_static_route_node %>">
+ <td>
+ <a class=""
+ href="javascript:ipv4_infrastructure_static_route(
+ '<%= eroute['ipv4-outgoing-interface'] %>',
+ '<%= eroute['ipv4-next-hop-address'] %>',
+ '<%= eroute['ipv4-dest-prefix'] %>',
+ '<%= eroute['ipv4-dest-prefix-length'] %>');">ipv4_infrastructure_static_route</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% if ( typeof equip['ipv6-infrastructure-static-route'] != 'undefined' )
+ { %>
+ <% ipv6_infrastructure_static_route_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= equipment_node %>">
+ <td> ipv6-infrastructure-static-route</td>
+ </tr>
+ <% i++; %>
+
+ <% equip['ipv6-infrastructure-static-route'].forEach(function(eroute)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= ipv6_infrastructure_static_route_node %>">
+ <td>
+ <a class=""
+ href="javascript:ipv6_infrastructure_static_route(
+ '<%= eroute['ipv6-outgoing-interface'] %>',
+ '<%= eroute['ipv6-next-hop-address'] %>',
+ '<%= eroute['ipv6-dest-prefix'] %>',
+ '<%= eroute['ipv6-dest-prefix-length'] %>');">ipv6_infrastructure_static_route</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% if ( typeof equip['interface'] != 'undefined' )
+ { %>
+ <% interface_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= equipment_node %>">
+ <td> interface</td>
+ </tr>
+ <% i++; %>
+
+ <% equip['interface'].forEach(function(interface)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= interface_node %>">
+ <td>
+ <a class=""
+ href="javascript:interface(
+ '<%= interface['interface-name'] %>',
+ '<%= interface['interface-role'] %>');">interface</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof interface['vlan'] != 'undefined' )
+ { %>
+ <% vlan_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= interface_node %>">
+ <td> vlan</td>
+ </tr>
+ <% i++; %>
+
+ <% interface['vlan'].forEach(function(vlan)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vlan_node %>">
+ <td>
+ <a class=""
+ href="javascript:vlan(
+ '<%= vlan['vlan-interface'] %>',
+ '<%= vlan['vlan-id-outer'] %>',
+ '<%= vlan['vlan-id-inner'] %>');">vlan</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof vlan['l3-interface-ipv4-address-list'] != 'undefined' )
+ { %>
+ <% ipv4_address_list_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= interface_node %>">
+ <td> l3-interface-ipv4-address-list</td>
+ </tr>
+ <% i++; %>
+
+ <% vlan['l3-interface-ipv4-address-list'].forEach(function(v4)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= ipv4_address_list_node %>">
+ <td>
+ <a class=""
+ href="javascript:l3_interface_ipv4_address_list(
+ '<%= v4['l3-interface-ipv4-address'] %>',
+ '<%= v4['l3-interface-ipv4-prefix-length'] %>');">l3-interface-ipv4-address-list</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% }); %>
+ <% }; %>
+
+ <% if ( typeof vlan['l3-interface-ipv6-address-list'] != 'undefined' )
+ { %>
+ <% ipv6_address_list_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= interface_node %>">
+ <td> l3-interface-ipv6-address-list</td>
+ </tr>
+ <% i++; %>
+
+ <% vlan['l3-interface-ipv6-address-list'].forEach(function(v6)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= ipv6_address_list_node %>">
+ <td>
+ <a class=""
+ href="javascript:l3_interface_ipv6_address_list(
+ '<%= v6['l3-interface-ipv6-address'] %>',
+ '<%= v6['l3-interface-ipv6-prefix-length'] %>');">l3-interface-ipv6-address-list</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% }; %>
+ <% }); %>
+ <% }; %>
+ <% }); %>
+ <% } %>
+
+
+
+ <% }); %>
+ <% } %>
+
+ <% if ( typeof request['service-data']['l3sdn-vnf-fields'] != 'undefined' )
+ { %>
+ <% l3sdn_vnf_fields_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td> l3sdn-vnf-fields</td>
+ </tr>
+ <% i++; %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= l3sdn_vnf_fields_node %>">
+ <td>
+ <a class=""
+ href="javascript:l3sdn_vnf_fields(
+ '<%= request['service-data']['l3sdn-vnf-fields']['availability-zone'] %>',
+ '<%= request['service-data']['l3sdn-vnf-fields']['vnf-stack-id'] %>',
+ '<%= request['service-data']['l3sdn-vnf-fields']['vnf-name'] %>',
+ '<%= request['service-data']['l3sdn-vnf-fields']['vnf-name2'] %>',
+ '<%= request['service-data']['l3sdn-vnf-fields']['vnf-type'] %>',
+ '<%= request['service-data']['l3sdn-vnf-fields']['vnf-status'] %>',
+ '<%= request['service-data']['l3sdn-vnf-fields']['vnf-id'] %>',
+ '<%= request['service-data']['l3sdn-vnf-fields']['oam-network-name'] %>',
+ '<%= request['service-data']['l3sdn-vnf-fields']['aic_site_id'] %>');">l3sdn-vnf-fields</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['service-data']['l3sdn-vnf-fields']['network-connections'] != 'undefined' )
+ { %>
+ <% network_connections_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= l3sdn_vnf_fields_node %>">
+ <td> network-connections</td>
+ </tr>
+ <% i++; %>
+
+ <% request['service-data']['l3sdn-vnf-fields']['network-connections'].forEach(function(nconn)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= network_connections_node %>">
+ <td>
+ <a class=""
+ href="javascript:network_connections(
+ '<%= nconn['stack-id'] %>',
+ '<%= nconn['net-status'] %>',
+ '<%= nconn['connection-type'] %>',
+ '<%= nconn['provider-network'] %>',
+ '<%= nconn['interface-id'] %>',
+ '<%= nconn['vlan'] %>',
+ '<%= nconn['port-group-name'] %>',
+ '<%= nconn['neutron-network-id'] %>');">network-connections</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+
+ <% if ( typeof request['service-data']['l3sdn-vnf-fields']['vnf-vm-information'] != 'undefined' )
+ { %>
+ <% vnf_vm_information_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= l3sdn_vnf_fields_node %>">
+ <td> vnf-vm-information</td>
+ </tr>
+ <% i++; %>
+
+ <% request['service-data']['l3sdn-vnf-fields']['vnf-vm-information'].forEach(function(info)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vnf_vm_information_node %>">
+ <td>
+ <a class=""
+ href="javascript:vnf_vm_information(
+ '<%= info['vserver-type'] %>',
+ '<%= info['vserver-name'] %>');">vnf-vm-information</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+
+
+ <% } %>
+
+ <% if ( typeof request['service-data']['vr-lan'] != 'undefined' )
+ { %>
+ <% if ( typeof request['service-instance-id'] != 'undefined' )
+ {
+ var svc_instance_id = request['service-instance-id'];
+ } %>
+
+ <% vr_lan_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= service_data_node %>">
+ <td> vr-lan</td>
+ </tr>
+ <% i++; %>
+
+
+ <% if ( request['service-data']['vr-lan']['routing-protocol'] != 'undefined' )
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_node %>">
+ <td>
+ <a href="javascript:routing_protocol('<%= svc_instance_id %>',
+ '<%= request['service-data']['vr-lan']['routing-protocol'] %>');">routing-protocol</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% } %>
+ <% vr_lan_interface_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_node %>">
+ <td> vr-lan-interface</td>
+ </tr>
+ <% i++; %>
+
+ <% if( typeof request['service-data']['vr-lan']['vr-lan-interface'] != 'undefined' )
+ { %>
+
+ <% request['service-data']['vr-lan']['vr-lan-interface'].forEach(function(request)
+ { %>
+
+ <% if ( request['vr-designation'] != 'undefined')
+ {
+ var vr_designation = request['vr-designation'];
+ } %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>">
+ <td>
+ <a href="javascript:vrlan_interface(
+ '<%= svc_instance_id %>',
+ '<%= request['vr-designation'] %>',
+ '<%= request['v6-vr-lan-prefix'] %>',
+ '<%= request['v6-vr-lan-prefix-length'] %>',
+ '<%= request['v6-vce-wan-address'] %>',
+ '<%= request['v4-vr-lan-prefix-length'] %>',
+ '<%= request['v4-vr-lan-prefix'] %>',
+ '<%= request['t-defaulted-v6-vrlan'] %>',
+ '<%= request['v4-vce-loopback-address'] %>');">vr-lan-interface</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['dhcp'] != 'undefined' )
+ { %>
+ <% var dhcp_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>">
+ <td> dhcp</td>
+ </tr>
+ <% i++; %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>
+ <a href="javascript:dhcp(
+ '<%= svc_instance_id %>',
+ '<%= request['dhcp']['use-v4-default-pool'] %>',
+ '<%= request['dhcp']['use-v6-default-pool'] %>',
+ '<%= request['dhcp']['v4-dhcp-server-enabled'] %>',
+ '<%= request['dhcp']['v6-dhcp-server-enabled'] %>',
+ '<%= request['dhcp']['v6-dhcp-default-pool-prefix'] %>',
+ '<%= request['dhcp']['v6-dhcp-default-pool-prefix-length'] %>',
+ '<%= request['dhcp']['v4-dhcp-default-pool-prefix'] %>',
+ '<%= request['dhcp']['v4-dhcp-default-pool-prefix-length'] %>');">dhcp</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['dhcp']['v4-dhcp-pools'] != 'undefined' )
+ { %>
+ <% var v4_dhcp_pools_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>v4-dhcp-pool</td>
+ </tr>
+ <% i++; %>
+
+ <% request['dhcp']['v4-dhcp-pools'].forEach(function(v4request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_dhcp_pools_node %>">
+ <td>
+ <a href="javascript:v4_dhcp_pools(
+ '<%= svc_instance_id %>',
+ '<%= v4request['v4-dhcp-relay-next-hop-address'] %>',
+ '<%= v4request['v4-dhcp-pool-prefix'] %>',
+ '<%= v4request['v4-dhcp-pool-prefix-length'] %>',
+ '<%= v4request['v4-dhcp-relay-gateway-address'] %>');">v4-dhcp-pools</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof v4request['excluded-v4-address'] != 'undefined' )
+ { %>
+ <% var excluded_v4_address_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_dhcp_pools_node %>">
+ <td>exluded-v4-address</td>
+ </tr>
+ <% i++; %>
+
+ <% v4request['excluded-v4-addresses'].forEach(function(ex_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= excluded_v4_address_node %>">
+ <td>
+ <a href="javascript:excluded_v4_address(
+ '<%= svc_instance_id %>',
+ '<%= ex_request['excluded-v4-address'] %>');">excluded-v4-address</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% }); %>
+ <% } %>
+
+ <% if ( typeof request['dhcp']['excluded-v4-dhcp-addresses-from-default-pool'] != 'undefined' )
+ { %>
+ <% var exc_v4_address_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>excluded-v4-dhcp-addresses-from-default-pool</td>
+ </tr>
+ <% i++; %>
+
+ <% request['dhcp']['excluded-v4-dhcp-addresses-from-default-pool'].forEach(function(ex_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= exc_v4_address_node %>">
+ <td>
+ <a href="javascript:excluded_v4_addresses_from_default_pool(
+ '<%= svc_instance_id %>',
+ '<%= ex_request['excluded-v4-address'] %>');">excluded-v4-dhcp-addresses-from-default-pool</a>
+ </td>
+ </tr>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% if ( typeof request['dhcp']['v6-dhcp-pools'] != 'undefined' )
+ { %>
+ <% var v6_dhcp_pools_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>v6-dhcp-pool</td>
+ </tr>
+ <% i++; %>
+
+ <% request['dhcp']['v6-dhcp-pools'].forEach(function(v6request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_dhcp_pools_node %>">
+ <td>
+ <a href="javascript:v6_dhcp_pools(
+ '<%= svc_instance_id %>',
+ '<%= v6request['v6-dhcp-relay-next-hop-address'] %>',
+ '<%= v6request['v6-dhcp-pool-prefix'] %>',
+ '<%= v6request['v6-dhcp-pool-prefix-length'] %>',
+ '<%= v6request['v6-dhcp-relay-gateway-address'] %>');">v6-dhcp-pools</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof v6request['excluded-v6-addresses'] != 'undefined' )
+ { %>
+ <% var excluded_v6_address_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_dhcp_pools_node %>">
+ <td>exluded-v6-address</td>
+ </tr>
+ <% i++; %>
+
+ <% v6request['excluded-v6-addresses'].forEach(function(ex_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= excluded_v6_address_node %>">
+ <td>
+ <a href="javascript:excluded_v6_addresses(
+ '<%= svc_instance_id %>',
+ '<%= ex_request['excluded-v6-address'] %>');">excluded-v6-address</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% }); %>
+ <% } %>
+
+ <% if ( typeof request['dhcp']['excluded-v6-dhcp-addresses-from-default-pool'] != 'undefined' )
+ { %>
+ <% var exc_v6_address_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= dhcp_node %>">
+ <td>excluded-v6-dhcp-addresses-from-default-pool</td>
+ </tr>
+ <% i++; %>
+
+ <% request['dhcp']['excluded-v6-dhcp-addresses-from-default-pool'].forEach(function(ex_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= exc_v6_address_node %>">
+ <td>
+ <a href="javascript:excluded_v6_addresses_from_default_pool(
+ '<%= svc_instance_id %>',
+ '<%= ex_request['excluded-v6-address'] %>');">excluded-v6-dhcp-addresses-from-default-pool</a>
+ </td>
+ </tr>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% } %>
+ <% if ( typeof request['firewall-lite'] != 'undefined' )
+ { %>
+ <% var firewall_lite_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>">
+ <td> firewall-lite</td>
+ </tr>
+ <% i++; %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>">
+ <td>
+ <a href="javascript:firewall_lite(
+ '<%= svc_instance_id %>',
+ '<%= vr_designation %>',
+ '<%= request['firewall-lite']['stateful-firewall-lite-v6-enabled'] %>',
+ '<%= request['firewall-lite']['stateful-firewall-lite-v4-enabled'] %>');">firewall-lite</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['firewall-lite']['v6-firewall-packet-filters'] != 'undefined' )
+ { %>
+ <% var v6_firewall_packet_filters_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>">
+ <td>v6_firewall_packet_filters</td>
+ </tr>
+ <% i++; %>
+
+ <% request['firewall-lite']['v6-firewall-packet-filters'].forEach(function(v6request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>">
+ <td>
+ <a href="javascript:v6_firewall_packet_filters(
+ '<%= svc_instance_id %>',
+ '<%= v6request['v6-firewall-prefix'] %>',
+ '<%= v6request['v6-firewall-prefix-length'] %>',
+ '<%= v6request['allow-icmp-ping'] %>');">v6-firewall-packet-filters</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof v6request['udp-port-list'] != 'undefined' )
+ { %>
+ <% var udp_port_list_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>">
+ <td>udp_port_list</td>
+ </tr>
+ <% i++; %>
+
+ <% v6request['udp-port-list'].forEach(function(udp_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= udp_port_list_node %>">
+ <td>
+ <a href="javascript:udp_port_list(
+ '<%= svc_instance_id %>',
+ '<%= udp_request['port-number'] %>');">udp-port-list</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% if ( typeof v6request['tcp-port-list'] != 'undefined' )
+ { %>
+ <% var tcp_port_list_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_firewall_packet_filters_node %>">
+ <td>tcp_port_list</td>
+ </tr>
+ <% i++; %>
+ <% v6request['tcp-port-list'].forEach(function(tcp_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= tcp_port_list_node %>">
+ <td>
+ <a href="javascript:tcp_port_list(
+ '<%= svc_instance_id %>',
+ '<%= tcp_request['port-number'] %>');">tcp-port-list</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% }); %>
+
+ <% } %>
+ <% if ( typeof request['firewall-lite']['v4-firewall-packet-filters'] != 'undefined' )
+ { %>
+ <% var v4_firewall_packet_filters_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= firewall_lite_node %>">
+ <td>v4_firewall_packet_filters</td>
+ </tr>
+ <% i++; %>
+
+ <% request['firewall-lite']['v4-firewall-packet-filters'].forEach(function(v4request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>">
+ <td>
+ <a href="javascript:v4_firewall_packet_filters(
+ '<%= svc_instance_id %>',
+ '<%= v4request['v4-firewall-prefix'] %>',
+ '<%= v4request['v4-firewall-prefix-length'] %>',
+ '<%= v4request['allow-icmp-ping'] %>');">v4-firewall-packet-filters</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof v4request['udp-port-list'] != 'undefined' )
+ { %>
+ <% var udp_port_list_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>">
+ <td>udp_port_list</td>
+ </tr>
+ <% i++; %>
+
+ <% v4request['udp-port-list'].forEach(function(udp_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= udp_port_list_node %>">
+ <td>
+ <a href="javascript:udp_port_list(
+ '<%= svc_instance_id %>',
+ '<%= udp_request['port-number'] %>');">udp-port-list</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% if ( typeof v4request['tcp-port-list'] != 'undefined' )
+ { %>
+ <% var tcp_port_list_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_firewall_packet_filters_node %>">
+ <td>tcp_port_list</td>
+ </tr>
+ <% i++; %>
+ <% v4request['tcp-port-list'].forEach(function(tcp_request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= tcp_port_list_node %>">
+ <td>
+ <a href="javascript:tcp_port_list(
+ '<%= svc_instance_id %>',
+ '<%= tcp_request['port-number'] %>');">tcp-port-list</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% }); %>
+
+ <% } %>
+
+ <% } %>
+
+
+ <% if ( typeof request['v4-public-lan-prefixes'] != 'undefined')
+ { %>
+ <% var v4_public_lan_prefixes_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>">
+ <td> v4-public-lan-prefixes</td>
+ </tr>
+ <% i++; %>
+
+ <% if (typeof request['v4-public-lan-prefixes']['t-provided-v4-lan-public-prefixes'] != 'undefined')
+ { %>
+
+ <% request['v4-public-lan-prefixes']['t-provided-v4-lan-public-prefixes'].forEach(function(trequest)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_public_lan_prefixes_node %>">
+ <td>
+ <a href="javascript:t_provided_v4_prefixes(
+ '<%= svc_instance_id %>',
+ '<%= trequest['request-index'] %>',
+ '<%= trequest['v4-lan-public-prefix-length'] %>',
+ '<%= trequest['v4-lan-public-prefix'] %>');">t-provided-v4-lan-public-prefixes</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% } %>
+ <% if ( typeof request['v6-public-lan-prefixes'] != 'undefined')
+ { %>
+ <% var v6_public_lan_prefixes_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>">
+ <td> v6-public-lan-prefixes</td>
+ </tr>
+ <% i++; %>
+
+ <% if (typeof request['v6-public-lan-prefixes']['t-provided-v6-lan-public-prefixes'] != 'undefined')
+ { %>
+
+ <% request['v6-public-lan-prefixes']['t-provided-v6-lan-public-prefixes'].forEach(function(trequest)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_public_lan_prefixes_node %>">
+ <td>
+ <a href="javascript:t_provided_v6_prefixes(
+ '<%= svc_instance_id %>',
+ '<%= trequest['request-index'] %>',
+ '<%= trequest['v6-lan-public-prefix-length'] %>',
+ '<%= trequest['v6-lan-public-prefix'] %>');">t-provided-v6-lan-public-prefixes</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% } %>
+
+ <% if ( typeof request['nat'] != 'undefined' )
+ { %>
+ <% var nat_node = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>">
+ <td> nat</td>
+ </tr>
+ <% i++; %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_node %>">
+ <td>
+ <a href="javascript:nat(
+ '<%= svc_instance_id %>',
+ '<%= request['nat']['v4-nat-enabled'] %>');">nat</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['nat']['v4-nat-mapping-entries'] != 'undefined' )
+ {
+ var nat_mapping_node = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_node %>">
+ <td>v4-nat-mapping-entries</td>
+ </tr>
+ <% i++; %>
+
+ <% request['nat']['v4-nat-mapping-entries'].forEach(function(trequest)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= nat_mapping_node %>">
+ <td>
+ <a href="javascript:v4_nat_mapping_entries(
+ '<%= svc_instance_id %>',
+ '<%= trequest['v4-nat-external'] %>',
+ '<%= trequest['v4-nat-next-hop-address'] %>',
+ '<%= trequest['v4-nat-internal'] %>');">v4-nat-mapping-entries</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% } %>
+
+ <% if ( typeof request['static-routes'] != 'undefined' )
+ { %>
+ <% var static_route_node = i; %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>">
+ <td> static-routes</td>
+ </tr>
+ <% i++; %>
+ <% if ( typeof request['static-routes']['v6-static-routes'] != 'undefined' )
+ { %>
+ <% v6_static_route = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= static_route_node %>">
+ <td>v6-static-routes</td>
+ </tr>
+ <% i++; %>
+
+ <% request['static-routes']['v6-static-routes'].forEach(function(strequest){ %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v6_static_route %>">
+ <td>
+ <a href="javascript:v6_static_routes(
+ '<%= svc_instance_id %>',
+ '<%= strequest['v6-static-route-prefix'] %>',
+ '<%= strequest['v6-next-hop-address'] %>',
+ '<%= strequest['v6-static-route-prefix-length'] %>');">v6-static-routes</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% if ( typeof request['static-routes']['v4-static-routes'] != 'undefined' )
+ { %>
+ <% v4_static_route = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= static_route_node %>">
+ <td> v4-static-routes</td>
+ </tr>
+ <% i++; %>
+ <% request['static-routes']['v4-static-routes'].forEach(function(v4request)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= v4_static_route %>">
+ <td>
+ <a href="javascript:v4_static_routes(
+ '<%= svc_instance_id %>',
+ '<%= v4request['v4-static-route-prefix'] %>',
+ '<%= v4request['v4-next-hop-address'] %>',
+ '<%= v4request['v4-static-route-prefix-length'] %>');">v4-static-routes</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% } %>
+
+ <% if ( typeof request['pat'] != 'undefined' )
+ { %>
+ <% var pat_node = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= vr_lan_interface_node %>">
+ <td> pat</td>
+ </tr>
+ <% i++; %>
+
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_node %>">
+ <td>
+ <a href="javascript:pat(
+ '<%= svc_instance_id %>',
+ '<%= request['pat']['v4-pat-default-pool-prefix-length'] %>',
+ '<%= request['pat']['use-v4-default-pool'] %>',
+ '<%= request['pat']['v4-pat-enabled'] %>',
+ '<%= request['pat']['v4-pat-default-pool-prefix'] %>');">pat</a>
+ </td>
+ </tr>
+ <% i++; %>
+
+ <% if ( typeof request['pat']['v4-pat-pools'] != 'undefined' )
+ { %>
+ <% var pat_pools_node = i %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_node %>">
+ <td> v4-pat-pools</td>
+ </tr>
+ <% i++; %>
+
+ <% request['pat']['v4-pat-pools'].forEach(function(trequest)
+ { %>
+ <tr class="treegrid-<%= i %> treegrid-parent-<%= pat_pools_node %>">
+ <td>
+ <a href="javascript:pat_pools(
+ '<%= svc_instance_id %>',
+ '<%= trequest['v4-pat-pool-next-hop-address'] %>',
+ '<%= trequest['v4-pat-pool-prefix-length'] %>',
+ '<%= trequest['v4-pat-pool-prefix'] %>');">v4-pat-pools</a>
+ </td>
+ </tr>
+ <% i++; %>
+ <% }); %>
+ <% } %>
+ <% } %>
+
+
+
+
+
+
+ <% }); %>
+ <% } %>
+ <% } %>
+
+ <% } %>
+ <% }); %>
+</table>
+</div>
+</div>
+
+<div class="container-fluid">
+ <div class="row">
+ <div class="col-md-1 text-left">
+ <p>&nbsp;&nbsp;Page <%= pageInfo.currentPage %> of <%= pageInfo.pageCount %></p>
+ </div>
+ <div class="col-md-11 text-left">
+ <% if (pageInfo.pageCount > 1) { %>
+ <ul class="pagination">
+ <% if (pageInfo.currentPage > 1) { %>
+ <li><a href="/odl/pageWklst?page=1">&laquo;</a></li>
+ <% } %>
+ <% var i = 1;
+ if (pageInfo.currentPage > 10) {
+ i = +pageInfo.currentPage - 9;
+ } %>
+ <% if (i !== 1) { %>
+ <!--<li class="disabled"><a href="#">...</a></li>-->
+ <% } %>
+ <% for (i; i<=pageInfo.pageCount; i++) { %>
+ <% if (pageInfo.currentPage == i) { %>
+ <li class="active"><span><%= i %> <span class="sr-only">(current)</span></span></li>
+ <% } else { %>
+ <li><a href="/odl/pageWklst?page=<%= i %>"><%= i %></a></li>
+ <% } %>
+ <% if (i == (+pageInfo.currentPage + 9)) { %>
+ <!--<li class="disabled"><a href="#">...</a></li>-->
+ <% break; } %>
+ <% } %>
+ <% if (pageInfo.currentPage != pageInfo.pageCount) { %>
+ <li><a href="/odl/pageWklst?page=<%= pageInfo.pageCount %>">&raquo;</a></li>
+ <% } %>
+ </ul>
+ <% } %>
+ </div><!-- col-md-10 -->
+ </div><!-- row -->
+ </div><!-- container-fluid -->
+
+
+
+<% include ../partials/vnf_vm_information %>
+<% include ../partials/network_connections %>
+<% include ../partials/l3sdn_vnf_fields %>
+<% include ../partials/l3_interface_ipv4_address_list %>
+<% include ../partials/l3_interface_ipv6_address_list %>
+<% include ../partials/vlan %>
+<% include ../partials/interface %>
+<% include ../partials/ipv6_infrastructure_static_route %>
+<% include ../partials/ipv4_infrastructure_static_route %>
+<% include ../partials/equipment %>
+<% include ../partials/svc_config_additional_data %>
+<% include ../partials/feature_list %>
+<% include ../partials/pat %>
+<% include ../partials/pat_pools %>
+<% include ../partials/v6_static_routes %>
+<% include ../partials/v4_static_routes %>
+<% include ../partials/nat %>
+<% include ../partials/v4_nat_mapping_entries %>
+<% include ../partials/t_provided_v4_lan_public_prefixes %>
+<% include ../partials/v4_firewall_packet_filters %>
+<% include ../partials/udp_port_list %>
+<% include ../partials/tcp_port_list %>
+<% include ../partials/v6_firewall_packet_filters %>
+<% include ../partials/firewall_lite %>
+<% include ../partials/excluded_v6_addresses %>
+<% include ../partials/excluded_v6_address_from_default_pool %>
+<% include ../partials/v6_dhcp_pools %>
+<% include ../partials/excluded_v4_address_from_default_pool %>
+<% include ../partials/excluded_v4_address %>
+<% include ../partials/v4_dhcp_pools %>
+<% include ../partials/dhcp %>
+<% include ../partials/routing_protocol %>
+<% include ../partials/t_provided_v6_lan_public_prefixes %>
+<% include ../partials/vr_lan_interface %>
+<% include ../partials/service_information_modal %>
+<% include ../partials/l2_homing_information_modal %>
+<% include ../partials/sdnc_request_header_modal %>
+<% include ../partials/request_information_modal %>
+<% include ../partials/svc_topology_additional_data_modal %>
+<% include ../partials/service_status_modal %>
+<% include ../partials/oper_status_modal %>
+<% include ../partials/internet_evc_modal %>
+
+<footer>
+<% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+
+
+
+function vnf_vm_information(vserver_type,vserver_name)
+{
+ var lvalue = document.getElementById('vserver_type');
+ if( vserver_type != 'undefined' ){
+ lvalue.value=vserver_type;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('vserver_name');
+ if( vserver_name != 'undefined' ){
+ lvalue.value=vserver_name;
+ } else {
+ lvalue.value='';
+ }
+ $('#vnf-vm-information-modal').modal('show');
+}
+function network_connections (stack_id,net_status,connection_type,provider_network,interface_id,vlan,port_group_name,neutron_network_id)
+{
+ var lvalue = document.getElementById('stack_id');
+ if( stack_id != 'undefined' ){
+ lvalue.value=stack_id;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('net_status');
+ if( net_status != 'undefined' ){
+ lvalue.value=net_status;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('connection_type');
+ if( connection_type != 'undefined' ){
+ lvalue.value=connection_type;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('provider_network');
+ if( provider_network != 'undefined' ){
+ lvalue.value=provider_network;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('interface_id');
+ if( interface_id != 'undefined' ){
+ lvalue.value=interface_id;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('vlan');
+ if( vlan != 'undefined' ){
+ lvalue.value=vlan;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('port_group_name');
+ if( port_group_name != 'undefined' ){
+ lvalue.value=port_group_name;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('neutron_network_id');
+ if( neutron_network_id != 'undefined' ){
+ lvalue.value=neutron_network_id;
+ } else {
+ lvalue.value='';
+ }
+ $('#network-connections-modal').modal('show');
+}
+
+function l3sdn_vnf_fields(availability_zone,vnf_stack_id,vnf_name,vnf_name2,vnf_type,vnf_status,vnf_id,oam_network_name,aic_site_id)
+{
+ var lvalue = document.getElementById('availability_zone');
+ if( availability_zone != 'undefined' ){
+ lvalue.value=availability_zone;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('vnf_stack_id');
+ if( vnf_stack_id != 'undefined' ){
+ lvalue.value=vnf_stack_id;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('vnf_name');
+ if( vnf_name != 'undefined' ){
+ lvalue.value=vnf_name;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('vnf_name2');
+ if( vnf_name2 != 'undefined' ){
+ lvalue.value=vnf_name2;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('vnf_type');
+ if( vnf_type != 'undefined' ){
+ lvalue.value=vnf_type;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('vnf_status');
+ if( vnf_status != 'undefined' ){
+ lvalue.value=vnf_status;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('vnf_id');
+ if( vnf_id != 'undefined' ){
+ lvalue.value=vnf_id;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('oam_network_name');
+ if( oam_network_name != 'undefined' ){
+ lvalue.value=oam_network_name;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('aic_site_id');
+ if( aic_site_id != 'undefined' ){
+ lvalue.value=aic_site_id;
+ } else {
+ lvalue.value='';
+ }
+ $('#l3sdn-vnf-fields-modal').modal('show');
+}
+function l3_interface_ipv4_address_list(l3_interface_ipv4_address,l3_interface_ipv4_prefix_length)
+{
+ var lvalue = document.getElementById('l3_interface_ipv4_address');
+ if( l3_interface_ipv4_address != 'undefined' ){
+ lvalue.value=l3_interface_ipv4_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('l3_interface_ipv4_prefix_length');
+ if( l3_interface_ipv4_prefix_length != 'undefined' ){
+ lvalue.value=l3_interface_ipv4_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ $('#l3-interface-ipv4-address-list-modal').modal('show');
+}
+
+function l3_interface_ipv6_address_list(l3_interface_ipv6_address,l3_interface_ipv6_prefix_length)
+{
+ var lvalue = document.getElementById('l3_interface_ipv6_address');
+ if( l3_interface_ipv6_address != 'undefined' ){
+ lvalue.value=l3_interface_ipv6_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('l3_interface_ipv6_prefix_length');
+ if( l3_interface_ipv6_prefix_length != 'undefined' ){
+ lvalue.value=l3_interface_ipv6_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ $('#l3-interface-ipv6-address-list-modal').modal('show');
+}
+
+
+function vlan(vlan_interface,vlan_id_inner,vlan_id_outer)
+{
+ var lvalue = document.getElementById('vlan_interface');
+ if( vlan_interface != 'undefined' ){
+ lvalue.value=vlan_interface;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('vlan_id_inner');
+ if( vlan_id_inner != 'undefined' ){
+ lvalue.value=vlan_id_inner;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('vlan_id_outer');
+ if( vlan_id_outer != 'undefined' ){
+ lvalue.value=vlan_id_outer;
+ } else {
+ lvalue.value='';
+ }
+ $('#vlan-modal').modal('show');
+}
+
+function interface(interface_name,interface_role)
+{
+ var lvalue = document.getElementById('interface_name');
+ if( interface_name != 'undefined' ){
+ lvalue.value=interface_name;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('interface_role');
+ if( interface_role != 'undefined' ){
+ lvalue.value=interface_role;
+ } else {
+ lvalue.value='';
+ }
+ $('#interface-modal').modal('show');
+}
+
+function ipv4_infrastructure_static_route(ipv4_outgoing_interface,ipv4_next_hop_address,ipv4_dest_prefix,ipv4_dest_prefix_length)
+{
+ var lvalue = document.getElementById('ipv4_outgoing_interface');
+ if( ipv4_outgoing_interface != 'undefined' ){
+ lvalue.value=ipv4_outgoing_interface;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('ipv4_next_hop_address');
+ if( ipv4_next_hop_address != 'undefined' ){
+ lvalue.value=ipv4_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('ipv4_dest_prefix');
+ if( ipv4_dest_prefix != 'undefined' ){
+ lvalue.value=ipv4_dest_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('ipv4_dest_prefix_length');
+ if( ipv4_dest_prefix_length != 'undefined' ){
+ lvalue.value=ipv4_dest_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ $('#ipv4-infrastructure-static-route-modal').modal('show');
+}
+
+function ipv6_infrastructure_static_route(ipv6_outgoing_interface,ipv6_next_hop_address,ipv6_dest_prefix,ipv6_dest_prefix_length)
+{
+ var lvalue = document.getElementById('ipv6_outgoing_interface');
+ if( ipv6_outgoing_interface != 'undefined' ){
+ lvalue.value=ipv6_outgoing_interface;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('ipv6_next_hop_address');
+ if( ipv6_next_hop_address != 'undefined' ){
+ lvalue.value=ipv6_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('ipv6_dest_prefix');
+ if( ipv6_dest_prefix != 'undefined' ){
+ lvalue.value=ipv6_dest_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('ipv6_dest_prefix_length');
+ if( ipv6_dest_prefix_length != 'undefined' ){
+ lvalue.value=ipv6_dest_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ $('#ipv6-infrastructure-static-route-modal').modal('show');
+}
+
+function equipment(equipment_role,ipv4_oam_address,ipv4_oam_gateway_address_prefix_length,ptnii_name,v4_loopback0_ip_address,ipv4_oam_gateway_address)
+{
+ var lvalue = document.getElementById('equipment_role');
+ if( equipment_role != 'undefined' ){
+ lvalue.value=equipment_role;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('ipv4_oam_address');
+ if( ipv4_oam_address != 'undefined' ){
+ lvalue.value=ipv4_oam_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('ipv4_oam_gateway_address_prefix_length');
+ if( ipv4_oam_gateway_address_prefix_length != 'undefined' ){
+ lvalue.value=ipv4_oam_gateway_address_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('ptnii_name');
+ if( ptnii_name != 'undefined' ){
+ lvalue.value=ptnii_name;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_loopback0_ip_address');
+ if( v4_loopback0_ip_address != 'undefined' ){
+ lvalue.value=v4_loopback0_ip_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('ipv4_oam_gateway_address');
+ if( ipv4_oam_gateway_address != 'undefined' ){
+ lvalue.value=ipv4_oam_gateway_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#equipment-modal').modal('show');
+}
+function svc_config_additional_data(management_ip)
+{
+ var lvalue = document.getElementById('management_ip');
+ if( management_ip != 'undefined' ){
+ lvalue.value=management_ip;
+ } else {
+ lvalue.value='';
+ }
+ $('#svc-config-additional-data-modal').modal('show');
+}
+function feature_list(feature_instance_id,feature_instance_xpath,feature_sub_type,feature_type)
+{
+ var lvalue = document.getElementById('feature_instance_id');
+ if( feature_instance_id != 'undefined' ){
+ lvalue.value=feature_instance_id;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('feature_instance_xpath');
+ if( feature_instance_xpath != 'undefined' ){
+ lvalue.value=feature_instance_xpath;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('feature_sub_type');
+ if( feature_sub_type != 'undefined' ){
+ lvalue.value=feature_sub_type;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('feature_type');
+ if( feature_type != 'undefined' ){
+ lvalue.value=feature_type;
+ } else {
+ lvalue.value='';
+ }
+ $('#feature-list-modal').modal('show');
+}
+function pat_pools(svc_instance_id,v4_pat_pool_next_hop_address,v4_pat_pool_prefix_length,v4_pat_pool_prefix)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_pat_pool_next_hop_address');
+ if( v4_pat_pool_next_hop_address != 'undefined' ){
+ lvalue.value=v4_pat_pool_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_pat_pool_prefix_length');
+ if( v4_pat_pool_prefix_length != 'undefined' ){
+ lvalue.value=v4_pat_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_pat_pool_prefix');
+ if( v4_pat_pool_prefix != 'undefined' ){
+ lvalue.value=v4_pat_pool_prefix;
+ } else {
+ lvalue.value='';
+ }
+ $('#pat-pools-modal').modal('show');
+}
+function pat(svc_instance_id,v4_pat_default_pool_prefix_length,use_v4_default_pool,v4_pat_enabled,v4_pat_default_pool_prefix)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_pat_default_pool_prefix_length');
+ if( v4_pat_default_pool_prefix_length != 'undefined' ){
+ lvalue.value=v4_pat_default_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+
+ lvalue = document.getElementById('use_v4_default_pool');
+ if( use_v4_default_pool != 'undefined' ){
+ lvalue.value = use_v4_default_pool;
+ } else {
+ lvalue.value = '';
+ }
+
+ lvalue = document.getElementById('v4_pat_enabled');
+ if( v4_pat_enabled != 'undefined' ){
+ lvalue.value = v4_pat_enabled;
+ } else {
+ lvalue.value = '';
+ }
+
+ lvalue = document.getElementById('v4_pat_default_pool_prefix');
+ if( v4_pat_default_pool_prefix != 'undefined' ){
+ lvalue.value = v4_pat_default_pool_prefix;
+ } else {
+ lvalue.value = '';
+ }
+ $('#pat-modal').modal('show');
+}
+
+function v4_static_routes(svc_instance_id,v4_static_route_prefix,static_v4_next_hop_address,v4_static_route_prefix_length)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_static_route_prefix');
+ if( v4_static_route_prefix != 'undefined' ){
+ lvalue.value=v4_static_route_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('static_v4_next_hop_address');
+ if( static_v4_next_hop_address != 'undefined' ){
+ lvalue.value=static_v4_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_static_route_prefix_length');
+ if( v4_static_route_prefix_length != 'undefined' ){
+ lvalue.value=v4_static_route_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ $('#v4-static-routes-modal').modal('show');
+}
+
+function v6_static_routes(svc_instance_id,v6_static_route_prefix,static_v6_next_hop_address,v6_static_route_prefix_length)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v6_static_route_prefix');
+ if( v6_static_route_prefix != 'undefined' ){
+ lvalue.value=v6_static_route_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('static_v6_next_hop_address');
+ if( static_v6_next_hop_address != 'undefined' ){
+ lvalue.value=static_v6_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_static_route_prefix_length');
+ if( v6_static_route_prefix_length != 'undefined' ){
+ lvalue.value=v6_static_route_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ $('#v6-static-routes-modal').modal('show');
+}
+
+function nat(svc_instance_id,v4_nat_enabled) {
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_nat_enabled');
+ if( v4_nat_enabled != 'undefined' ){
+ lvalue.value=v4_nat_enabled;
+ } else {
+ lvalue.value='';
+ }
+ $('#nat-modal').modal('show');
+}
+function v4_nat_mapping_entries(svc_instance_id,v4_nat_external,v4_nat_next_hop_address,v4_nat_internal)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_nat_external');
+ if( v4_nat_external != 'undefined' ){
+ lvalue.value=v4_nat_external;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_nat_next_hop_address');
+ if( v4_nat_next_hop_address != 'undefined' ){
+ lvalue.value=v4_nat_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_nat_internal');
+ if( v4_nat_internal != 'undefined' ){
+ lvalue.value=v4_nat_internal;
+ } else {
+ lvalue.value='';
+ }
+ $('#v4-nat-mapping-entries-modal').modal('show');
+}
+
+function v4_firewall_packet_filters(svc_instance_id,v4_firewall_prefix,v4_firewall_prefix_length,v4_allow_icmp_ping)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_firewall_prefix');
+ if( v4_firewall_prefix != 'undefined' ){
+ lvalue.value=v4_firewall_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_firewall_prefix_length');
+ if( v4_firewall_prefix_length != 'undefined' ){
+ lvalue.value=v4_firewall_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_allow_icmp_ping');
+ if( v4_allow_icmp_ping != 'undefined' ){
+ lvalue.value=v4_allow_icmp_ping;
+ } else {
+ lvalue.value='';
+ }
+ $('#v4-firewall-packet-filters-modal').modal('show');
+}
+
+function v6_firewall_packet_filters(svc_instance_id,v6_firewall_prefix,v6_firewall_prefix_length,v6_allow_icmp_ping)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v6_firewall_prefix');
+ if( v6_firewall_prefix != 'undefined' ){
+ lvalue.value=v6_firewall_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_firewall_prefix_length');
+ if( v6_firewall_prefix_length != 'undefined' ){
+ lvalue.value=v6_firewall_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_allow_icmp_ping');
+ if( v6_allow_icmp_ping != 'undefined' ){
+ lvalue.value=v6_allow_icmp_ping;
+ } else {
+ lvalue.value='';
+ }
+ $('#v6-firewall-packet-filters-modal').modal('show');
+}
+
+function tcp_port_list(svc_instance_id,tcp_port_number)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('tcp_port_number');
+ if( tcp_port_number != 'undefined' ){
+ lvalue.value=tcp_port_number;
+ } else {
+ lvalue.value='';
+ }
+ $('#tcp-port-list-modal').modal('show');
+}
+function udp_port_list(svc_instance_id,udp_port_number)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('udp_port_number');
+ if( udp_port_number != 'undefined' ){
+ lvalue.value=udp_port_number;
+ } else {
+ lvalue.value='';
+ }
+ $('#udp-port-list-modal').modal('show');
+}
+
+function firewall_lite(svc_instance_id,firewall_lite_vr_designation,stateful_firewall_lite_v4_enabled,stateful_firewall_lite_v6_enabled)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ document.getElementById('firewall_lite_vr_designation').value = firewall_lite_vr_designation;
+ var lvalue = document.getElementById('stateful_firewall_lite_v4_enabled');
+ if( stateful_firewall_lite_v4_enabled != 'undefined' ){
+ lvalue.value=stateful_firewall_lite_v4_enabled;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('stateful_firewall_lite_v6_enabled');
+ if( stateful_firewall_lite_v6_enabled != 'undefined' ){
+ lvalue.value=stateful_firewall_lite_v6_enabled;
+ } else {
+ lvalue.value='';
+ }
+ $('#firewall-lite-modal').modal('show');
+}
+
+function excluded_v6_addresses(svc_instance_id, excluded_v6_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('excluded_v6_address');
+ if( excluded_v6_address != 'undefined' ){
+ lvalue.value=excluded_v6_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#excluded-v6-addresses-modal').modal('show');
+}
+
+
+function excluded_v6_addresses_from_default_pool(svc_instance_id, excluded_v6_address_from_default_pool)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('excluded_v6_address_from_default_pool');
+ if( excluded_v6_address_from_default_pool != 'undefined' ){
+ lvalue.value=excluded_v6_address_from_default_pool;
+ } else {
+ lvalue.value='';
+ }
+ $('#excluded-v6-address-from-default-pool-modal').modal('show');
+}
+
+
+function v6_dhcp_pools(svc_instance_id,v6_dhcp_relay_next_hop_address,v6_dhcp_pool_prefix,v6_dhcp_pool_prefix_length,v6_dhcp_relay_gateway_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v6_dhcp_relay_next_hop_address');
+ if( v6_dhcp_relay_next_hop_address != 'undefined' ){
+ lvalue.value=v6_dhcp_relay_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_pool_prefix');
+ if( v6_dhcp_pool_prefix != 'undefined' ){
+ lvalue.value=v6_dhcp_pool_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_pool_prefix_length');
+ if( v6_dhcp_pool_prefix_length != 'undefined' ){
+ lvalue.value=v6_dhcp_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_relay_gateway_address');
+ if( v6_dhcp_relay_gateway_address != 'undefined' ){
+ lvalue.value=v6_dhcp_relay_gateway_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#v6-dhcp-pools-modal').modal('show');
+}
+
+function excluded_v4_addresses_from_default_pool(svc_instance_id, excluded_v4_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('excluded_v4_address_from_default_pool');
+ if( excluded_v4_address != 'undefined' ){
+ lvalue.value=excluded_v4_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#excluded-v4-address-from-default-pool-modal').modal('show');
+}
+
+
+function exluded_v4_address(svc_instance_id, excluded_v4_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('excluded_v4_address');
+ if( excluded_v4_address != 'undefined' ){
+ lvalue.value=excluded_v4_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#excluded-v4-address-modal').modal('show');
+}
+
+function v4_dhcp_pools(svc_instance_id,v4_dhcp_relay_next_hop_address,v4_dhcp_pool_prefix,v4_dhcp_pool_prefix_length,v4_dhcp_relay_gateway_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_dhcp_relay_next_hop_address');
+ if( v4_dhcp_relay_next_hop_address != 'undefined' ){
+ lvalue.value=v4_dhcp_relay_next_hop_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_pool_prefix');
+ if( v4_dhcp_pool_prefix != 'undefined' ){
+ lvalue.value=v4_dhcp_pool_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_pool_prefix_length');
+ if( v4_dhcp_pool_prefix_length != 'undefined' ){
+ lvalue.value=v4_dhcp_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_relay_gateway_address');
+ if( v4_dhcp_relay_gateway_address != 'undefined' ){
+ lvalue.value=v4_dhcp_relay_gateway_address;
+ } else {
+ lvalue.value='';
+ }
+ $('#v4-dhcp-pools-modal').modal('show');
+}
+
+function dhcp(svc_instance_id,use_v4_default_pool,use_v6_default_pool,v4_dhcp_server_enabled,v6_dhcp_server_enabled,v6_dhcp_default_pool_prefix,v6_dhcp_default_pool_prefix_length,v4_dhcp_default_pool_prefix,v4_dhcp_default_pool_prefix_length)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('use_v4_default_pool');
+ if( use_v4_default_pool != 'undefined' ){
+ lvalue.value=use_v4_default_pool;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('use_v6_default_pool');
+ if( use_v6_default_pool != 'undefined' ){
+ lvalue.value=use_v6_default_pool;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_server_enabled');
+ if( v4_dhcp_server_enabled != 'undefined' ){
+ lvalue.value=v4_dhcp_server_enabled;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_server_enabled');
+ if( v6_dhcp_server_enabled != 'undefined' ){
+ lvalue.value=v6_dhcp_server_enabled;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_default_pool_prefix');
+ if( v6_dhcp_default_pool_prefix != 'undefined' ){
+ lvalue.value=v6_dhcp_default_pool_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_dhcp_default_pool_prefix_length');
+ if( v6_dhcp_default_pool_prefix_length != 'undefined' ){
+ lvalue.value=v6_dhcp_default_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_default_pool_prefix');
+ if( v4_dhcp_default_pool_prefix != 'undefined' ){
+ lvalue.value=v4_dhcp_default_pool_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_dhcp_default_pool_prefix_length');
+ if( v4_dhcp_default_pool_prefix_length != 'undefined' ){
+ lvalue.value=v4_dhcp_default_pool_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ $('#dhcp-modal').modal('show');
+}
+
+function routing_protocol(svc_instance_id, routing_protocol)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('routing_protocol');
+ if( routing_protocol != 'undefined' ){
+ lvalue.value=routing_protocol;
+ } else {
+ lvalue.value='';
+ }
+ $('#routing-protocol-modal').modal('show');
+}
+function t_provided_v4_prefixes(svc_instance_id,v4_request_index,v4_lan_public_prefix_length,v4_lan_public_prefix)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v4_request_index');
+ if( v4_request_index != 'undefined' ){
+ lvalue.value=v4_request_index;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_lan_public_prefix_length');
+ if( v4_lan_public_prefix_length != 'undefined' ){
+ lvalue.value=v4_lan_public_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_lan_public_prefix');
+ if( v4_lan_public_prefix != 'undefined' ){
+ lvalue.value=v4_lan_public_prefix;
+ } else {
+ lvalue.value='';
+ }
+ $('#t-provided-v4-lan-public-prefixes-modal').modal('show');
+}
+
+function t_provided_v6_prefixes(svc_instance_id,v6_request_index,v6_lan_public_prefix_length,v6_lan_public_prefix)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('v6_request_index');
+ if( v6_request_index != 'undefined' ){
+ lvalue.value=v6_request_index;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_lan_public_prefix_length');
+ if( v6_lan_public_prefix_length != 'undefined' ){
+ lvalue.value=v6_lan_public_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_lan_public_prefix');
+ if( v6_lan_public_prefix != 'undefined' ){
+ lvalue.value=v6_lan_public_prefix;
+ } else {
+ lvalue.value='';
+ }
+ $('#t-provided-v6-lan-public-prefixes-modal').modal('show');
+}
+
+function vrlan_interface(svc_instance_id,vr_designation,v6_vr_lan_prefix, v6_vr_lan_prefix_length, v6_vce_wan_address, v4_vr_lan_prefix_length, v4_vr_lan_prefix, t_defaulted_v6_vrlan,v4_vce_loopback_address)
+{
+ document.getElementById('svc_instance_id').value = svc_instance_id;
+ var lvalue = document.getElementById('vr_designation');
+ if( vr_designation != 'undefined' ){
+ lvalue.value=vr_designation;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_vr_lan_prefix');
+ if( v6_vr_lan_prefix != 'undefined' ){
+ lvalue.value=v6_vr_lan_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_vr_lan_prefix_length');
+ if( v6_vr_lan_prefix_length != 'undefined' ){
+ lvalue.value=v6_vr_lan_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v6_vce_wan_address');
+ if( v6_vce_wan_address != 'undefined' ){
+ lvalue.value=v6_vce_wan_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_vr_lan_prefix_length');
+ if( v4_vr_lan_prefix_length != 'undefined' ){
+ lvalue.value=v4_vr_lan_prefix_length;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_vr_lan_prefix');
+ if( v4_vr_lan_prefix != 'undefined' ){
+ lvalue.value=v4_vr_lan_prefix;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('v4_vce_loopback_address');
+ if( v4_vce_loopback_address != 'undefined' ){
+ lvalue.value=v4_vce_loopback_address;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('t_defaulted_v6_vrlan');
+ if( t_defaulted_v6_vrlan != 'undefined' ){
+ lvalue.value=t_defaulted_v6_vrlan;
+ } else {
+ lvalue.value='';
+ }
+ $('#vr-lan-interface-modal').modal('show');
+}
+
+function getvrlan(svc_instance_id)
+{
+location.assign("/odl/getvrlan?request=" + svc_instance_id);
+return;
+}
+
+function svcInfo(service_instance_id,subscriber_name,service_type){
+ var lvalue = document.getElementById('service_instance_id');
+ if( service_instance_id != 'undefined' ){
+ lvalue.value=service_instance_id;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('subscriber_name');
+ if( subscriber_name != 'undefined' ){
+ lvalue.value=subscriber_name;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('service_type');
+ if( service_type != 'undefined' ){
+ lvalue.value=service_type;
+ } else {
+ lvalue.value='';
+ }
+ $('#service-information-modal').modal('show');
+}
+function l2Homing(evc_name,preferred_aic_clli,topology){
+ var lvalue = document.getElementById('evc_name');
+ if( evc_name != 'undefined' ){
+ lvalue.value=evc_name;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('preferred_aic_clli');
+ if( preferred_aic_clli != 'undefined' ){
+ lvalue.value=preferred_aic_clli;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('topology');
+ if( topology != 'undefined' ){
+ lvalue.value=topology;
+ } else {
+ lvalue.value='';
+ }
+ $('#l2-homing-information-modal').modal('show');
+}
+function reqHeader(svc_notification_url, svc_request_id, svc_action){
+ var lvalue = document.getElementById('svc_notification_url');
+ if( svc_notification_url != 'undefined' ){
+ lvalue.value=svc_notification_url;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('svc_request_id');
+ if( svc_request_id != 'undefined' ){
+ lvalue.value=svc_request_id;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('svc_action');
+ if( svc_action != 'undefined' ){
+ lvalue.value=svc_action;
+ } else {
+ lvalue.value='';
+ }
+ $('#sdnc-request-header-modal').modal('show');
+}
+function reqInfo(notification_url, source, order_number, request_id, order_version,
+ request_action, request_sub_action){
+
+ var lvalue = document.getElementById('notification_url');
+ if( notification_url != 'undefined' ){
+ lvalue.value=notification_url;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('source');
+ if( source != 'undefined' ){
+ lvalue.value=source;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('order_number');
+ if( order_number != 'undefined' ){
+ lvalue.value=order_number;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('request_id');
+ if( request_id != 'undefined' ){
+ lvalue.value=request_id;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('order_version');
+ if( order_version != 'undefined' ){
+ lvalue.value=order_version;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('request_action');
+ if( request_action != 'undefined' ){
+ lvalue.value=request_action;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('request_sub_action');
+ if( request_sub_action != 'undefined' ){
+ lvalue.value=request_sub_action;
+ } else {
+ lvalue.value='';
+ }
+ $('#request-information-modal').modal('show');
+}
+function svcTopo(svc_vnf_type){
+ var lvalue = document.getElementById('svc_vnf_type');
+ if( svc_vnf_type != 'undefined' ){
+ lvalue.value=svc_vnf_type;
+ } else {
+ lvalue.value='';
+ }
+ $('#svc-topology-additional-data-modal').modal('show');
+}
+function operStatus(order_status, modify_timestamp,last_svc_request_id,last_sub_action,
+ t_defaulted_v6_vrlan, last_action, create_timestamp, maintenance_indicator, last_order_status){
+ var lvalue = document.getElementById('order_status');
+ if( order_status != 'undefined' ){
+ lvalue.value=order_status;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('modify_timestamp');
+ if( modify_timestamp != 'undefined' ){
+ lvalue.value=modify_timestamp;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('last_svc_request_id');
+ if( last_svc_request_id != 'undefined' ){
+ lvalue.value=last_svc_request_id;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('last_sub_action');
+ if( last_sub_action != 'undefined' ){
+ lvalue.value=last_sub_action;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('t_defaulted_v6_vrlan');
+ if( t_defaulted_v6_vrlan != 'undefined' ){
+ lvalue.value=t_defaulted_v6_vrlan;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('last_action');
+ if( last_action != 'undefined' ){
+ lvalue.value=last_action;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('create_timestamp');
+ if( create_timestamp != 'undefined' ){
+ lvalue.value=create_timestamp;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('maintenance_indicator');
+ if( maintenance_indicator != 'undefined' ){
+ lvalue.value=maintenance_indicator;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('last_order_status');
+ if( last_order_status != 'undefined' ){
+ lvalue.value=last_order_status;
+ } else {
+ lvalue.value='';
+ }
+ $('#oper-status-modal').modal('show');
+}
+function internetInfo(ip_version,internet_evc_speed_value,internet_evc_speed_units){
+
+ var lvalue = document.getElementById('ip_version');
+ if( ip_version != 'undefined' ){
+ lvalue.value=ip_version;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('internet_evc_speed_value');
+ if( internet_evc_speed_value != 'undefined' ){
+ lvalue.value=internet_evc_speed_value;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('internet_evc_speed_units');
+ if( internet_evc_speed_units != 'undefined' ){
+ lvalue.value=internet_evc_speed_units;
+ } else {
+ lvalue.value='';
+ }
+ $('#internet-evc-modal').modal('show');
+}
+function serviceStatus( rpc_name, final_indicator, request_status, rpc_action, l3sdn_action, l3sdn_subaction, response_message, response_code, response_timestamp){
+
+ var lvalue = document.getElementById('rpc_name');
+ if( rpc_name != 'undefined' ){
+ lvalue.value=rpc_name;
+ } else {
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('final_indicator');
+ if( final_indicator != 'undefined' ){
+ lvalue.value=final_indicator;
+ }else{
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('request_status');
+ if( request_status != 'undefined' ){
+ lvalue.value=request_status;
+ }else{
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('rpc_action');
+ if( rpc_action != 'undefined' ){
+ lvalue.value=rpc_action;
+ }else{
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('l3sdn_action');
+ if( l3sdn_action != 'undefined' ){
+ lvalue.value=l3sdn_action;
+ }else{
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('l3sdn_subaction');
+ if( l3sdn_subaction != 'undefined' ){
+ lvalue.value=l3sdn_subaction;
+ }else{
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('response_message');
+ if( response_message != 'undefined' ){
+ lvalue.value=response_message;
+ }else{
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('response_code');
+ if( lvalue != 'undefined' ){
+ response_code.value=response_code;
+ }else{
+ lvalue.value='';
+ }
+ lvalue = document.getElementById('response_timestamp');
+ if( response_timestamp != 'undefined' ){
+ lvalue.value=response_timestamp;
+ }else{
+ lvalue.value='';
+ }
+ $('#service-status-modal').modal('show');
+}
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/odl/view.ejs b/admportal/views/odl/view.ejs
new file mode 100644
index 00000000..34d7d935
--- /dev/null
+++ b/admportal/views/odl/view.ejs
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>SDN-C AdminPortal</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+</head>
+<body class="container">
+
+<div class="actions" style="padding:0px 25px;">
+<h2>Worklist Orders - Request ID:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<%= response_obj.requests[0]['svc-request-id'] %></h2>
+</div>
+
+<div class="actions" style="padding:15px 0px;">
+ <button type="button" class="btn btn-primary aria-expanded="false"
+ onclick="viewVNF('/odl/getvnf?request=<%= response_obj.requests[0]['svc-request-id'] %>')">VNF</button>
+</div>
+
+
+<div class="table-responsive">
+ <table class="table table-bordered">
+ <colgroup>
+ <col class="col-xs-1">
+ <col class="col-xs-7">
+ </colgroup>
+ <tbody>
+ <tr>
+ <th scope="row">Instance ID</th>
+ <td><%= response_obj.requests[0]['svc-instance-id'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">Action</th>
+ <td><%= response_obj.requests[0]['svc-action'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">VNF Type</th>
+ <td><%= response_obj.requests[0]['svc-vnf-type'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">Notification URL</th>
+ <td><%= response_obj.requests[0]['svc-notification-url'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">VNF Name</th>
+ <td><%= response_obj.requests[0].vnf['vnf-name'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">VNF IPv4 Addr</th>
+ <td><%= response_obj.requests[0].vnf['vnf-oam-ipv4-addr'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">VNF Type</th>
+ <td><%= response_obj.requests[0].vnf['vnf-type'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">VNF Status</th>
+ <td><%= response_obj.requests[0].vnf['vnf-status'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">AIC Site ID</th>
+ <td><%= response_obj.requests[0].vnf['aic-site-id'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">Availability Zone</th>
+ <td><%= response_obj.requests[0].vnf['availability-zone'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">Network Connection(s)</th>
+ <td><pre><%= JSON.stringify(response_obj.requests[0].vnf['network-connections'],null,4) %></pre></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+ <% include ../partials/form %>
+
+ <footer>
+ <% include ../partials/footer %>
+ </footer>
+<script type="text/javascript">
+function viewVNF( requestid ) {
+alert(requestid);
+ location.assign(requestid);
+}
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/odl/viewvnf.ejs b/admportal/views/odl/viewvnf.ejs
new file mode 100644
index 00000000..dd2e05c9
--- /dev/null
+++ b/admportal/views/odl/viewvnf.ejs
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>SDN-C AdminPortal</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+</head>
+
+<body class="container">
+
+<div class="actions" style="padding:0px 25px;">
+<h2>Worklist Orders - VNF - Request ID <%= request_id %></h2>
+</div>
+
+<div class="table-responsive">
+ <table class="table table-bordered">
+ <colgroup>
+ <col class="col-xs-1">
+ <col class="col-xs-7">
+ </colgroup>
+ <tbody>
+ <tr>
+ <th scope="row">VNF OAM IPv4 Addr</th>
+ <td><%= vnf_obj.vnf['vnf-oam-ipv4-addr'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">AIC Site ID</th>
+ <td><%= vnf_obj.vnf['aic-site-id'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">VNF Name</th>
+ <td><%= vnf_obj.vnf['vnf-name'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">VNF Type</th>
+ <td><%= vnf_obj.vnf['vnf-type'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">VNF Status</th>
+ <td><%= vnf_obj.vnf['vnf-status'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">Availability Zone</th>
+ <td><%= vnf_obj.vnf['availability-zone'] %></td>
+ </tr>
+ <tr>
+ <th scope="row">Network Connection(s)</th>
+ <td><pre><%= JSON.stringify(vnf_obj.vnf['network-connections'],null,4) %></pre></td>
+ </tr>
+
+ </tbody>
+ </table>
+ </div>
+
+ <footer>
+ <% include ../partials/footer %>
+ </footer>
+</body>
+</html>
+
diff --git a/admportal/views/pages/csplogout.ejs b/admportal/views/pages/csplogout.ejs
new file mode 100644
index 00000000..971feda6
--- /dev/null
+++ b/admportal/views/pages/csplogout.ejs
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+
+<% if (header == 'gamma') { %>
+ <title>SDN-C AdminPortal</title>
+<% } else if(header == 'sdn-mlc'){ %>
+ <title>SDNC-MLC AdminPortal</title>
+<% } else { %>
+ <title>SDN-C AdminPortal</title>
+<% } %>
+
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+</head>
+<body class="container">
+
+<div class="actions" style="padding:0px 25px;">
+<% if (header == 'gamma') { %>
+ <h2>SDN-C Admin Portal</h2>
+<% } else if(header == 'sdn-mlc'){ %>
+ <h2>SDNC-MLC Admin Portal</h2>
+<% } else { %>
+ <h2>SDN-C Admin Portal</h2>
+<% } %>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'><%=result.msg %></div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'><%=result.msg %></div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<p><a href="/login">Click here to login</a></p>
+
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
diff --git a/admportal/views/pages/err.ejs b/admportal/views/pages/err.ejs
new file mode 100644
index 00000000..8ed51c6c
--- /dev/null
+++ b/admportal/views/pages/err.ejs
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>SDN-C AdminPortal</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+</head>
+<body class="container">
+
+<div class="actions" style="padding:0px 25px;">
+<h2>System Error</h2>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'><%=result.msg %></div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'><%=result.msg %></div>
+ <% } %>
+ <% } %>
+<% } %>
+
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/pages/home.ejs b/admportal/views/pages/home.ejs
new file mode 100644
index 00000000..3eb4a0a9
--- /dev/null
+++ b/admportal/views/pages/home.ejs
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>SDN-C AdminPortal</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+</head>
+<body class="container">
+
+<div class="actions" style="padding:0px 25px;">
+<h2>SDN-C Admin Portal</h2>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <pre class='alert alert-success' role='alert'><%=result.msg %></pre>
+ <% } else { %>
+ <pre class='alert alert-danger' role='danger'><%=result.msg %></pre>
+ <% } %>
+ <% } %>
+<% } %>
+
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/pages/home.ejs.orig b/admportal/views/pages/home.ejs.orig
new file mode 100644
index 00000000..353bc457
--- /dev/null
+++ b/admportal/views/pages/home.ejs.orig
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>SDN-C Admin Portal</title>
+ </head>
+ <body>
+ <h1>SDN-C Admin Portal</h1>
+ <p>Welcome to SDN-C Admin Portal</p>
+<% if ( typeof loggedInAdmin != 'undefined') { %>
+ <p><%= loggedInAdmin.firstName %></p>
+<% } %>
+<% if ( typeof result != 'undefined') { %>
+ <p><%= result %></p>
+<% } %>
+<% if ( typeof errmsg != 'undefined') { %>
+ <p><%= errmsg %></p>
+<% } %>
+
+ </body>
+</html>
diff --git a/admportal/views/pages/login.ejs b/admportal/views/pages/login.ejs
new file mode 100644
index 00000000..3a3e5e4e
--- /dev/null
+++ b/admportal/views/pages/login.ejs
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
+ <title>AdminPortal</title>
+
+
+ <!-- Bootstrap core CSS -->
+ <% include ../partials/head %>
+
+ <!-- Custom styles for this template -->
+ <link rel="stylesheet" href="/stylesheets/signin.css">
+
+ </head>
+
+ <body>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'><%=result.msg %></div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'><%=result.msg %></div>
+ <% } %>
+ <% } %>
+<% } %>
+
+ <div class="container">
+
+ <form class="form-signin" method="POST" action="/formlogin">
+ <h3 class="form-signin-heading">AdminPortal Login</h3>
+
+ <input type="text" name="email" id="email" class="form-control" placeholder="Email" required>
+ <input type="password" name="password" id="password" class="form-control" placeholder="Password" required>
+
+ <button class="btn btn-lg btn-primary btn-block" type="submit">Submit</button>
+ </form>
+
+ </div> <!-- /container -->
+
+ </body>
+</html>
diff --git a/admportal/views/pages/setuplogin.ejs b/admportal/views/pages/setuplogin.ejs
new file mode 100644
index 00000000..ef75e84a
--- /dev/null
+++ b/admportal/views/pages/setuplogin.ejs
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
+ <title>SDN-C AdminPortal</title>
+
+
+ <!-- Bootstrap core CSS -->
+ <% include ../partials/head %>
+
+ <!-- Custom styles for this template -->
+ <link rel="stylesheet" href="/stylesheets/signin.css">
+
+ </head>
+
+ <body>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'><%=result.msg %></div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'><%=result.msg %></div>
+ <% } %>
+ <% } %>
+<% } %>
+
+ <div class="container">
+
+ <form class="form-signin" method="POST" action="/formSetupLogin">
+ <h3 class="form-signin-heading">Enter Initial User Information</h3>
+
+ <label for="firstName" class="sr-only">First Name</label>
+ <input type="text" name="firstName" id="firstName" class="form-control" placeholder="First Name" required autofocus>
+
+ <label for="lastName" class="sr-only">Last Name</label>
+ <input type="text" name="lastName" id="lastName" class="form-control" placeholder="Last Name" required>
+
+ <label for="attuid" class="sr-only">ATTUID</label>
+ <input type="text" name="attuid" id="attuid" class="form-control" placeholder="ATTUID" required>
+
+ <button class="btn btn-lg btn-primary btn-block" type="submit">Setup Login</button>
+ </form>
+
+ </div> <!-- /container -->
+
+ </body>
+</html>
diff --git a/admportal/views/pages/signup.ejs b/admportal/views/pages/signup.ejs
new file mode 100644
index 00000000..03ac7bc5
--- /dev/null
+++ b/admportal/views/pages/signup.ejs
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
+ <title>AdminPortal</title>
+
+
+ <!-- Bootstrap core CSS -->
+ <% include ../partials/head %>
+
+ <!-- Custom styles for this template -->
+ <link rel="stylesheet" href="/stylesheets/signin.css">
+
+ </head>
+
+ <body>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'><%=result.msg %></div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'><%=result.msg %></div>
+ <% } %>
+ <% } %>
+<% } %>
+
+ <div class="container">
+
+ <form class="form-signin" method="POST" action="/formSignUp">
+ <h3 class="form-signin-heading">AdminPortal Signup</h3>
+
+ <input type="email" name="nf_email" id="nf_email" class="form-control" placeholder="Email Address" required>
+ <input type="password" name="nf_password" id="nf_password" class="form-control" placeholder="Password" required>
+
+ <button class="btn btn-lg btn-primary btn-block" type="submit">Submit</button>
+ </form>
+
+ </div> <!-- /container -->
+
+ </body>
+</html>
diff --git a/admportal/views/pages/testdb.ejs b/admportal/views/pages/testdb.ejs
new file mode 100644
index 00000000..837b479b
--- /dev/null
+++ b/admportal/views/pages/testdb.ejs
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>SDN-C AdminPortal</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/ro_header %>
+</head>
+<body class="container">
+
+<div class="actions" style="padding:0px 25px;">
+<h2>SDN-C AdminPortal Healthcheck</h2>
+</div>
+
+<% if (typeof osObj != 'undefined')
+{ %>
+ <pre>
+ Hostname : <%= osObj.hostname %>
+ Type : <%= osObj.type %>
+ Platform : <%= osObj.platform %>
+ Architecture : <%= osObj.arch %>
+ Release : <%= osObj.release %>
+ Uptime : <%= osObj.uptime %>
+ Total Memory : <%= osObj.totalmem %>
+
+ <%= osObj.dbhealth %>
+ </pre>
+<% } %>
+
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/partials/add_service_homing.ejs b/admportal/views/partials/add_service_homing.ejs
new file mode 100644
index 00000000..4a75125a
--- /dev/null
+++ b/admportal/views/partials/add_service_homing.ejs
@@ -0,0 +1,52 @@
+ <div class="modal fade" id="add_service_homing" tabindex="-1" role="dialog"
+ aria-labelledby="add_service_homing_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Service Homing</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/gamma/addServiceHoming" method="POST">
+ <div class="form-group">
+ <label for="nf_service_type">*Service Type</label>
+ <input readonly type="text" class="form-control" name="nf_service_type" id="nf_service_type" value="SDN-ETHERNET-INTERNET">
+ </div>
+ <div class="form-group">
+ <label for="nf_lata">*LATA</label>
+ <input type="text" class="form-control" name="nf_lata" id="nf_lata" maxlength="12" placeholder="int(3)">
+ </div>
+ <div class="form-group">
+ <label for="nf_hubbing_city_type">*Hubbing City Type</label>
+ <input maxlength="40" type="text" class="form-control" name="nf_hubbing_city_type" id="nf_hubbing_city_type" placeholder="varchar(40)">
+ </div>
+ <div class="form-group">
+ <label for="nf_latitude">Latitude</label>
+ <input type="text" class="form-control" name="nf_latitude" id="nf_latitude" maxlength="24" placeholder="float">
+ </div>
+ <div class="form-group">
+ <label for="nf_longitude">Longitude</label>
+ <input type="text" class="form-control" name="nf_longitude" id="nf_longitude" maxlength="24" placeholder="float">
+ </div>
+ <div class="form-group">
+ <label for="nf_primary_aic_site_name">*Primary Site Name</label>
+ <input maxlength="100" type="text" class="form-control" name="nf_primary_aic_site_name" id="nf_primary_aic_site_name" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="nf_secondary_aic_site_name">Secondary Site Name</label>
+ <input maxlength="100" type="text" class="form-control" name="nf_secondary_aic_site_name" id="nf_secondary_aic_site_name" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="nf_tertiary_aic_site_name">Tertiary Site Name</label>
+ <input maxlength="100" type="text" class="form-control" name="nf_tertiary_aic_site_name" id="nf_tertiary_aic_site_name" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitServiceHoming(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/alts_credentials.ejs b/admportal/views/partials/alts_credentials.ejs
new file mode 100644
index 00000000..6d5f113c
--- /dev/null
+++ b/admportal/views/partials/alts_credentials.ejs
@@ -0,0 +1,65 @@
+<div class="modal fade" id="add_alts_credentials" tabindex="-1" role="dialog"
+ aria-labelledby="add_alts_credentials_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add ALTS Credentials</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/ucpe/addAltsCredentials" method="POST">
+ <div class="form-group">
+ <label for="nf_alts_username">*ALTS Username</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_alts_username" id="nf_alts_username" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_alts_password">*ALTS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_alts_password" id="nf_alts_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_alts_password">*Confirm ALTS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_confirm_alts_password" id="nf_confirm_alts_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitAltsCredentials(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal fade" id="update_alts_credentials" tabindex="-1" role="dialog"
+ aria-labelledby="update_alts_credentials_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update ALTS Credentials</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/ucpe/updateAltsCredentials" method="POST">
+ <div class="form-group">
+ <label for="uf_alts_username">*ALTS Username</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_alts_username" id="uf_alts_username">
+ </div>
+ <div class="form-group">
+ <label for="uf_alts_password">*ALTS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_alts_password" id="uf_alts_password">
+ </div>
+ <div class="form-group">
+ <label for="uf_alts_password">*Confirm ALTS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_confirm_alts_password" id="uf_confirm_alts_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submitAltsCredentials(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/dhcp.ejs b/admportal/views/partials/dhcp.ejs
new file mode 100644
index 00000000..a290c324
--- /dev/null
+++ b/admportal/views/partials/dhcp.ejs
@@ -0,0 +1,66 @@
+ <div class="modal fade" id="dhcp-modal" tabindex="-1" role="dialog"
+ aria-labelledby="dhcp-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">dhcp</h4>
+ </div>
+ <div class="modal-body">
+ <form id="dhcp_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="use_v4_default_pool">use-v4-default-pool</label>
+ <input type="text" class="form-control" name="use_v4_default_pool" id="use_v4_default_pool">
+ </div>
+ <div class="form-group">
+ <label for="use_v6_default_pool">use-v6-default-pool</label>
+ <input type="text" class="form-control" name="use_v6_default_pool" id="use_v6_default_pool">
+ </div>
+ <div class="form-group">
+ <label for="v4_dhcp_server_enabled">v4-dhcp-server-enabled</label>
+ <input type="text" class="form-control" name="v4_dhcp_server_enabled" id="v4_dhcp_server_enabled">
+ </div>
+ <div class="form-group">
+ <label for="v6_dhcp_server_enabled">v6-dhcp-server-enabled</label>
+ <input type="text" class="form-control" name="v6_dhcp_server_enabled" id="v6_dhcp_server_enabled">
+ </div>
+ <div class="form-group">
+ <label for="v6_dhcp_default_pool_prefix">v6-dhcp-default-pool-prefix</label>
+ <input type="text" class="form-control" name="v6_dhcp_default_pool_prefix" id="v6_dhcp_default_pool_prefix">
+ </div>
+ <div class="form-group">
+ <label for="v6_dhcp_default_pool_prefix_length">v6-dhcp-default-pool-prefix-length</label>
+ <input type="text" class="form-control" name="v6_dhcp_default_pool_prefix_length" id="v6_dhcp_default_pool_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="v4_dhcp_default_pool_prefix">v4-dhcp-default-pool-prefix</label>
+ <input type="text" class="form-control" name="v4_dhcp_default_pool_prefix" id="v4_dhcp_default_pool_prefix">
+ </div>
+ <div class="form-group">
+ <label for="v4_dhcp_default_pool_prefix_length">v4-dhcp-default-pool-prefix-length</label>
+ <input type="text" class="form-control" name="v4_dhcp_default_pool_prefix_length" id="v4_dhcp_default_pool_prefix_length">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#dhcp-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/env.ejs b/admportal/views/partials/env.ejs
new file mode 100644
index 00000000..249a707a
--- /dev/null
+++ b/admportal/views/partials/env.ejs
@@ -0,0 +1 @@
+-dev
diff --git a/admportal/views/partials/equipment.ejs b/admportal/views/partials/equipment.ejs
new file mode 100644
index 00000000..5f4d798d
--- /dev/null
+++ b/admportal/views/partials/equipment.ejs
@@ -0,0 +1,58 @@
+ <div class="modal fade"
+ id="equipment-modal" tabindex="-1" role="dialog"
+ aria-labelledby="equipment-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">equipment</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="equipment_role">equipment-role</label>
+ <input type="text" class="form-control" name="equipment_role" id="equipment_role">
+ </div>
+ <div class="form-group">
+ <label for="ptnii_name">ptnii-name</label>
+ <input type="text" class="form-control" name="ptnii_name" id="ptnii_name">
+ </div>
+ <div class="form-group">
+ <label for="ipv4_oam_address">ipv4-oam-address</label>
+ <input type="text" class="form-control" name="ipv4_oam_address" id="ipv4_oam_address">
+ </div>
+ <div class="form-group">
+ <label for="ipv4_oam_gateway_address">ipv4-oam-gateway-address</label>
+ <input type="text" class="form-control" name="ipv4_oam_gateway_address" id="ipv4_oam_gateway_address">
+ </div>
+ <div class="form-group">
+ <label for="v4_loopback0_ip_address">v4-loopback0-ip-address</label>
+ <input type="text" class="form-control" name="v4_loopback0_ip_address" id="v4_loopback0_ip_address">
+ </div>
+ <div class="form-group">
+ <label for="ipv4_oam_gateway_address_prefix_length">ipv4-oam-gateway-address-prefix-length</label>
+ <input type="text" class="form-control" name="ipv4_oam_gateway_address_prefix_length" id="ipv4_oam_gateway_address_prefix_length">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#equipment-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/excluded_v4_address.ejs b/admportal/views/partials/excluded_v4_address.ejs
new file mode 100644
index 00000000..e74d3245
--- /dev/null
+++ b/admportal/views/partials/excluded_v4_address.ejs
@@ -0,0 +1,38 @@
+ <div class="modal fade" id="excluded-v4-address-modal" tabindex="-1" role="dialog"
+ aria-labelledby="excluded-v4-address-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">dhcp</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="exclded_v4_address">exclded-v4-address</label>
+ <input type="text" class="form-control" name="exclded_v4_address" id="exclded_v4_address">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#excluded-v4-address-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/excluded_v4_address_from_default_pool.ejs b/admportal/views/partials/excluded_v4_address_from_default_pool.ejs
new file mode 100644
index 00000000..442fd344
--- /dev/null
+++ b/admportal/views/partials/excluded_v4_address_from_default_pool.ejs
@@ -0,0 +1,38 @@
+ <div class="modal fade" id="excluded-v4-address-from-default-pool-modal" tabindex="-1" role="dialog"
+ aria-labelledby="excluded-v4-address-from-default-pool-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">excluded-v4-addresses-from-default-pool</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="excluded_v4_address_from_default_pool">excluded-v4-address</label>
+ <input type="text" class="form-control" name="excluded_v4_address_from_default_pool" id="excluded_v4_address_from_default_pool">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#excluded-v4-address-from-default-pool-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/excluded_v6_address_from_default_pool.ejs b/admportal/views/partials/excluded_v6_address_from_default_pool.ejs
new file mode 100644
index 00000000..a91d0a75
--- /dev/null
+++ b/admportal/views/partials/excluded_v6_address_from_default_pool.ejs
@@ -0,0 +1,38 @@
+ <div class="modal fade" id="excluded-v6-address-from-default-pool-modal" tabindex="-1" role="dialog"
+ aria-labelledby="excluded-v6-address-from-default-pool-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">excluded-v6-addresses-from-default-pool</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="excluded_v6_address_from_default_pool">excluded-v6-address</label>
+ <input type="text" class="form-control" name="excluded_v6_address_from_default_pool" id="excluded_v6_address_from_default_pool">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#excluded-v6-address-from-default-pool-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/excluded_v6_addresses.ejs b/admportal/views/partials/excluded_v6_addresses.ejs
new file mode 100644
index 00000000..d155383e
--- /dev/null
+++ b/admportal/views/partials/excluded_v6_addresses.ejs
@@ -0,0 +1,38 @@
+ <div class="modal fade" id="excluded-v6-addresses-modal" tabindex="-1" role="dialog"
+ aria-labelledby="excluded-v6-addresses-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">excluded-v6-addresses</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="excluded_v6_address">excluded-v6-address</label>
+ <input type="text" class="form-control" name="excluded_v6_address" id="excluded_v6_address">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#excluded-v6-addresses-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/feature_list.ejs b/admportal/views/partials/feature_list.ejs
new file mode 100644
index 00000000..95ebf872
--- /dev/null
+++ b/admportal/views/partials/feature_list.ejs
@@ -0,0 +1,50 @@
+ <div class="modal fade"
+ id="feature-list-modal" tabindex="-1" role="dialog"
+ aria-labelledby="feature-list-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">feature-list</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="feature_instance_id">feature-instance-id</label>
+ <input type="text" class="form-control" name="feature_instance_id" id="feature_instance_id">
+ </div>
+ <div class="form-group">
+ <label for="feature_instance_xpath">feature-instance-xpath</label>
+ <input type="text" class="form-control" name="feature_instance_xpath" id="feature_instance_xpath">
+ </div>
+ <div class="form-group">
+ <label for="feature_sub_type">feature-sub-type</label>
+ <input type="text" class="form-control" name="feature_sub_type" id="feature_sub_type">
+ </div>
+ <div class="form-group">
+ <label for="feature_type">feature-type</label>
+ <input type="text" class="form-control" name="feature_type" id="feature_type">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#feature-list-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/firewall_lite.ejs b/admportal/views/partials/firewall_lite.ejs
new file mode 100644
index 00000000..b26d078d
--- /dev/null
+++ b/admportal/views/partials/firewall_lite.ejs
@@ -0,0 +1,43 @@
+ <div class="modal fade" id="firewall-lite-modal" tabindex="-1" role="dialog"
+ aria-labelledby="firewall-lite-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">firewall-lite</h4>
+ </div>
+ <div class="modal-body">
+ <form id="firewall_lite_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="stateful_firewall_lite_v4_enabled">stateful-firewall-lite-v4-enabled</label>
+ <input type="text" class="form-control" name="stateful_firewall_lite_v4_enabled" id="stateful_firewall_lite_v4_enabled">
+ </div>
+ <div class="form-group">
+ <label for="stateful_firewall_lite_v6_enabled">stateful-firewall-lite-v6-enabled</label>
+ <input type="text" class="form-control" name="stateful_firewall_lite_v6_enabled" id="stateful_firewall_lite_v6_enabled">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="firewall_lite_vr_designation" id="firewall_lite_vr_designation">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#firewall-lite-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/footer.ejs b/admportal/views/partials/footer.ejs
new file mode 100644
index 00000000..c04e26d4
--- /dev/null
+++ b/admportal/views/partials/footer.ejs
@@ -0,0 +1,5 @@
+
+<!-- views/partials/footer.ejs -->
+
+<p class="text-center text-muted">© Copyright 2017 AT&T Intellectual Property</p>
+
diff --git a/admportal/views/partials/form.ejs b/admportal/views/partials/form.ejs
new file mode 100644
index 00000000..00d3c0ce
--- /dev/null
+++ b/admportal/views/partials/form.ejs
@@ -0,0 +1,55 @@
+ <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="myModalLabel">New Request</h4>
+ </div>
+ <div class="modal-body">
+ <form id="addEntry" role="form" action="svc-topology-operation">
+ <!--
+ <div class="form-group">
+ <label for="svc-request-id">svc-request-id</label>
+ <input type="text" class="form-control" name="svc-request-id" id="svc-request-id" value="req-0001">
+ </div>
+ -->
+ <div class="form-group">
+ <label for="svc-instance-id">svc-instance-id</label>
+ <input type="text" class="form-control" name="svc-instance-id" id="svc-instance-id" value="siid-0001">
+ </div>
+ <div class="form-group">
+ <label for="svc-vnf-type">svc-vnf-type</label>
+ <select class="form-control" name="svc-vnf-type" id="svc-vnf-type">
+ <option value=vce>"vce"</option>
+ <option value=Unknown>"Unknown"</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <label for="svc-action">svc-action</label>
+ <select class="form-control" name="svc-action" id="svc-action">
+ <option value=reserve>"reserve"</option>
+ <option value=create>"create"</option>
+ <option value=activate>"activate"</option>
+ <option value=query>"query"</option>
+ <option value=update>"update"</option>
+ <option value=delete>"delete"</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <label for="svc-notification-url">svc-notification-url</label>
+ <input type="text" class="form-control" name="svc-notification-url" id="svc-notification-url" value="">
+ </div>
+ <div class="form-group">
+ <label for="desc">svc-aic-site-id</label>
+ <input type="text" class="form-control" name="svc-aic-site-id" id="svc-aic-site-id" value="att-0001">
+ </div>
+ <div class="form-group">
+ <button type="submit" class="btn btn-primary">Save</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
diff --git a/admportal/views/partials/gammaHeader.ejs b/admportal/views/partials/gammaHeader.ejs
new file mode 100644
index 00000000..8af83963
--- /dev/null
+++ b/admportal/views/partials/gammaHeader.ejs
@@ -0,0 +1,63 @@
+
+<!-- views/partials/header.ejs -->
+<nav class="navbar navbar-default" role="navigation">
+ <div class="container-fluid">
+
+
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">&nbsp;AdminPortal</a>
+ </div>
+
+ <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups">
+
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn "
+ onclick="location.assign('/sla/listSLA');">SLA</button>
+
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn dropdown-toggle"
+ data-toggle="dropdown"
+ aria-expanded="false">Profiles <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="/mobility/getVnfProfile">VNF Profile</a></li>
+ </ul>
+ </div>
+
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn dropdown-toggle"
+ data-toggle="dropdown"
+ aria-expanded="false">Preload Tools <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="/mobility/getVnfData">Pre-load VNF Data</a></li>
+ <li><a href="/mobility/getVnfNetworkData">Pre-load VNF Network Data</a></li>
+ </ul>
+ </div>
+
+ <!-- LOGS
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn dropdown-toggle"
+ data-toggle="dropdown"
+ aria-expanded="false">Logs <span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="/logs/getUserTrace">User Trace</a></li>
+ <li><a href="/logs/getAccessLog">Access Log</a></li>
+ </ul>
+ </div>
+ -->
+
+ <button type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/user/listUsers');">User Admin</button>
+ <button type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/logout');">Logout</button>
+ </div>
+ </div>
+ </div>
+
+</nav>
+
+<script type="text/javascript">
+$('[data-submenu]').submenupicker();
+$('[vlanidpool-submenu]').submenupicker();
+</script>
diff --git a/admportal/views/partials/head.ejs b/admportal/views/partials/head.ejs
new file mode 100644
index 00000000..066bf3c6
--- /dev/null
+++ b/admportal/views/partials/head.ejs
@@ -0,0 +1,20 @@
+<!-- Latest compiled and minified CSS -->
+<link rel="stylesheet" href="/stylesheets/bootstrap.min.css">
+<link rel="stylesheet" href="/stylesheets/bootstrap-theme.min.css">
+<link rel="stylesheet" href="/stylesheets/dataTables.bootstrap.min.css">
+<!-- <link rel="stylesheet" href="/stylesheets/bootstrap-table.css"> -->
+<link rel="stylesheet" href="/stylesheets/bootstrap-submenu.min.css">
+<link rel="stylesheet" href="/stylesheets/jquery.treegrid.css">
+
+<!-- jquery downloaded from jquery.com/download -->
+<!-- <script src="/javascripts/jquery.min.js"></script> -->
+<script src="/javascripts/jquery-2.2.0.min.js"></script>
+<script src="/javascripts/jquery.dataTables.min.js"></script>
+<script src="/javascripts/jquery.treegrid.js"></script>
+<script src="/javascripts/jquery.treegrid.bootstrap3.js"></script>
+<script src="/javascripts/bootstrap.min.js"></script>
+<!-- <script src="/javascripts/bootstrap-table.js"></script> -->
+<script src="/javascripts/bootstrap-submenu.min.js"></script>
+<script src="/javascripts/bootbox.min.js"></script>
+<script src="/javascripts/dataTables.bootstrap.min.js"></script>
+
diff --git a/admportal/views/partials/head.ejs.orig b/admportal/views/partials/head.ejs.orig
new file mode 100644
index 00000000..2f6f537e
--- /dev/null
+++ b/admportal/views/partials/head.ejs.orig
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML>
+<meta charset="UTF-8">
+<title>SDN-C AdminPortal</title>
+
+<!-- Latest compiled and minified CSS -->
+<link rel="stylesheet" href="/stylesheets/bootstrap.min.css">
+
+<!-- Optional theme -->
+<link rel="stylesheet" href="/stylesheets/bootstrap-theme.min.css">
+<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
+<script src="/javascripts/jquery.min.js"></script>
+<!-- Latest compiled and minified JavaScript -->
+<script src="/javascripts/bootstrap.min.js"></script>
diff --git a/admportal/views/partials/header.ejs b/admportal/views/partials/header.ejs
new file mode 100644
index 00000000..6342154d
--- /dev/null
+++ b/admportal/views/partials/header.ejs
@@ -0,0 +1,11 @@
+<% if (header == 'gamma') { %>
+ <% include ../partials/gammaHeader %>
+<% } else if(header == 'sdn-mlc'){ %>
+ <% include ../partials/sdnmlcHeader %>
+<% } else if(header == 'sdn-fc'){ %>
+ <% include ../partials/sdnfcHeader %>
+<% } else { %>
+ <% include ../partials/gammaHeader %>
+<% } %>
+
+
diff --git a/admportal/views/partials/header.ejs.orig b/admportal/views/partials/header.ejs.orig
new file mode 100644
index 00000000..830bd275
--- /dev/null
+++ b/admportal/views/partials/header.ejs.orig
@@ -0,0 +1,55 @@
+<!-- views/partials/header.ejs -->
+<nav class="navbar navbar-default" role="navigation">
+ <div class="container-fluid">
+
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">&nbsp;SDN-C AdminPortal</a>
+ </div>
+
+ <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups">
+
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/sla/listSLA');">SLA</button>
+
+<div class="btn-group">
+ <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">Default <span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#">Action</a></li>
+ <li><a href="#">Another action</a></li>
+ <li><a href="#">Something else here</a></li>
+ <li class="divider"></li>
+ <li><a href="#">Separated link</a></li>
+ </ul>
+ </div>
+
+ <button type="button" class="btn btn-default navbar-btn">Interfaces</button>
+ <button type="button" class="btn btn-default navbar-btn">VMs</button>
+ <button type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/odl/listWklst');">Worklist Orders</button>
+ <button type="button" class="btn btn-default navbar-btn">Connections</button>
+ <button type="button" class="btn btn-default navbar-btn">VNFs</button>
+ <button type="button" class="btn btn-default navbar-btn">VLANs</button>
+ <button type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/user/listUsers');">User Admin</button>
+ <button type="button" class="btn btn-default navbar-btn navbar-btn"
+ onclick="location.assign('/logout');">Logout</button>
+ <!-- <p class="btn-toolbar" role="group">ar3165 | Al Rotundo</p> -->
+ </div>
+ </div>
+ </div>
+</nav>
+
+<!-- Single button -->
+<div class="btn-group">
+ <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+ Action <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#">Action</a></li>
+ <li><a href="#">Another action</a></li>
+ <li><a href="#">Something else here</a></li>
+ <li class="divider"></li>
+ <li><a href="#">Separated link</a></li>
+ </ul>
+</div>
diff --git a/admportal/views/partials/interface.ejs b/admportal/views/partials/interface.ejs
new file mode 100644
index 00000000..c8afce9c
--- /dev/null
+++ b/admportal/views/partials/interface.ejs
@@ -0,0 +1,42 @@
+ <div class="modal fade"
+ id="interface-modal" tabindex="-1" role="dialog"
+ aria-labelledby="interface-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">interface</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="interface_name">interface-name</label>
+ <input type="text" class="form-control" name="interface_name" id="interface_name">
+ </div>
+ <div class="form-group">
+ <label for="interface_role">interface_role</label>
+ <input type="text" class="form-control" name="interface_role" id="interface_role">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#interface-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/internet_evc_modal.ejs b/admportal/views/partials/internet_evc_modal.ejs
new file mode 100644
index 00000000..70848bad
--- /dev/null
+++ b/admportal/views/partials/internet_evc_modal.ejs
@@ -0,0 +1,44 @@
+ <div class="modal fade" id="internet-evc-modal" tabindex="-1" role="dialog" aria-labelledby="internet-evc-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="internet-evc-modal-label">Internet EVC Access Information</h4>
+ </div>
+ <div class="modal-body">
+ <form id="internet_evc_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="ip_version">ip-version</label>
+ <input type="text" class="form-control" name="ip_version" id="ip_version">
+ </div>
+ <div class="form-group">
+ <label for="internet_evc_speed_value">internet-evc-speed-value</label>
+ <input type="text" class="form-control" name="internet_evc_speed_value" id="internet_evc_speed_value">
+ </div>
+ <div class="form-group">
+ <label for="internet_evc_speed_units">internet-evc-speed-units</label>
+ <input type="text" class="form-control" name="internet_evc_speed_units" id="internet_evc_speed_units">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#service-status-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/ipv4_infrastructure_static_route.ejs b/admportal/views/partials/ipv4_infrastructure_static_route.ejs
new file mode 100644
index 00000000..b9b92089
--- /dev/null
+++ b/admportal/views/partials/ipv4_infrastructure_static_route.ejs
@@ -0,0 +1,50 @@
+ <div class="modal fade"
+ id="ipv4-infrastructure-static-route-modal" tabindex="-1" role="dialog"
+ aria-labelledby="ipv4-infrastructure-static-route-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">ipv4-infrastructure-static-route</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="ipv4_outgoing_interface">ipv4-outgoing-interface</label>
+ <input type="text" class="form-control" name="ipv4_outgoing_interface" id="ipv4_outgoing_interface">
+ </div>
+ <div class="form-group">
+ <label for="ipv4_next_hop_address">ipv4-next-hop-address</label>
+ <input type="text" class="form-control" name="ipv4_next_hop_address" id="ipv4_next_hop_address">
+ </div>
+ <div class="form-group">
+ <label for="ipv4_dest_prefix">ipv4-dest-prefix</label>
+ <input type="text" class="form-control" name="ipv4_dest_prefix" id="ipv4_dest_prefix">
+ </div>
+ <div class="form-group">
+ <label for="ipv4_dest_prefix_length">ipv4-dest-prefix-length</label>
+ <input type="text" class="form-control" name="ipv4_dest_prefix_length" id="ipv4_dest_prefix_length">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#ipv4-infrastructure-static-route-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/ipv6_infrastructure_static_route.ejs b/admportal/views/partials/ipv6_infrastructure_static_route.ejs
new file mode 100644
index 00000000..4921e2ea
--- /dev/null
+++ b/admportal/views/partials/ipv6_infrastructure_static_route.ejs
@@ -0,0 +1,50 @@
+ <div class="modal fade"
+ id="ipv6-infrastructure-static-route-modal" tabindex="-1" role="dialog"
+ aria-labelledby="ipv6-infrastructure-static-route-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">ipv6-infrastructure-static-route</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="ipv6_outgoing_interface">ipv6-outgoing-interface</label>
+ <input type="text" class="form-control" name="ipv6_outgoing_interface" id="ipv6_outgoing_interface">
+ </div>
+ <div class="form-group">
+ <label for="ipv6_next_hop_address">ipv6-next-hop-address</label>
+ <input type="text" class="form-control" name="ipv6_next_hop_address" id="ipv6_next_hop_address">
+ </div>
+ <div class="form-group">
+ <label for="ipv6_dest_prefix">ipv6-dest-prefix</label>
+ <input type="text" class="form-control" name="ipv6_dest_prefix" id="ipv6_dest_prefix">
+ </div>
+ <div class="form-group">
+ <label for="ipv6_dest_prefix_length">ipv6-dest-prefix-length</label>
+ <input type="text" class="form-control" name="ipv6_dest_prefix_length" id="ipv6_dest_prefix_length">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#ipv6-infrastructure-static-route-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/l2_homing_information_modal.ejs b/admportal/views/partials/l2_homing_information_modal.ejs
new file mode 100644
index 00000000..03af0546
--- /dev/null
+++ b/admportal/views/partials/l2_homing_information_modal.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade"
+ id="l2-homing-information-modal" tabindex="-1" role="dialog"
+ aria-labelledby="l2-homing-information-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="l2-homing-information-modal-label">l2-homing-information</h4>
+ </div>
+ <div class="modal-body">
+ <form id="l2_homing_information_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="evc_name">evc-name</label>
+ <input type="text" class="form-control" name="evc_name" id="evc_name">
+ </div>
+ <div class="form-group">
+ <label for="preferred_aic_clli">preferred-aic-clli</label>
+ <input type="text" class="form-control" name="preferred_aic_clli" id="preferred_aic_clli">
+ </div>
+ <div class="form-group">
+ <label for="topology">topology</label>
+ <input type="text" class="form-control" name="topology" id="topology">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#service-status-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/l3_interface_ipv4_address_list.ejs b/admportal/views/partials/l3_interface_ipv4_address_list.ejs
new file mode 100644
index 00000000..50c66cd9
--- /dev/null
+++ b/admportal/views/partials/l3_interface_ipv4_address_list.ejs
@@ -0,0 +1,42 @@
+ <div class="modal fade"
+ id="l3-interface-ipv4-address-list-modal" tabindex="-1" role="dialog"
+ aria-labelledby="l3-interface-ipv4-address-list-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">l3-interface-ipv4-address-list</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="l3_interface_ipv4_address">l3-interface-ipv4-address</label>
+ <input type="text" class="form-control" name="l3_interface_ipv4_address" id="l3_interface_ipv4_address">
+ </div>
+ <div class="form-group">
+ <label for="l3_interface_ipv4_prefix_length">l3-interface-ipv4-prefix-length</label>
+ <input type="text" class="form-control" name="l3_interface_ipv4_prefix_length" id="l3_interface_ipv4_prefix_length">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#l3-interface-ipv4-address-list-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/l3_interface_ipv6_address_list.ejs b/admportal/views/partials/l3_interface_ipv6_address_list.ejs
new file mode 100644
index 00000000..9faec4c0
--- /dev/null
+++ b/admportal/views/partials/l3_interface_ipv6_address_list.ejs
@@ -0,0 +1,42 @@
+ <div class="modal fade"
+ id="l3-interface-ipv6-address-list-modal" tabindex="-1" role="dialog"
+ aria-labelledby="l3-interface-ipv6-address-list-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">l3-interface-ipv6-address-list</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="l3_interface_ipv6_address">l3-interface-ipv6-address</label>
+ <input type="text" class="form-control" name="l3_interface_ipv6_address" id="l3_interface_ipv6_address">
+ </div>
+ <div class="form-group">
+ <label for="l3_interface_ipv6_prefix_length">l3-interface-ipv6-prefix-length</label>
+ <input type="text" class="form-control" name="l3_interface_ipv6_prefix_length" id="l3_interface_ipv6_prefix_length">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#l3-interface-ipv6-address-list-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/l3sdn_vnf_fields.ejs b/admportal/views/partials/l3sdn_vnf_fields.ejs
new file mode 100644
index 00000000..e3d842ef
--- /dev/null
+++ b/admportal/views/partials/l3sdn_vnf_fields.ejs
@@ -0,0 +1,70 @@
+ <div class="modal fade"
+ id="l3sdn-vnf-fields-modal" tabindex="-1" role="dialog"
+ aria-labelledby="l3sdn-vnf-fields-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">l3sdn-vnf-fields</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="availability_zone">availability_zone</label>
+ <input type="text" class="form-control" name="availability_zone" id="availability_zone">
+ </div>
+ <div class="form-group">
+ <label for="vnf_stack_id">vnf-stack-id</label>
+ <input type="text" class="form-control" name="vnf_stack_id" id="vnf_stack_id">
+ </div>
+ <div class="form-group">
+ <label for="vnf_name">vnf-name</label>
+ <input type="text" class="form-control" name="vnf_name" id="vnf_name">
+ </div>
+ <div class="form-group">
+ <label for="vnf_name2">vnf-name2</label>
+ <input type="text" class="form-control" name="vnf_name2" id="vnf_name2">
+ </div>
+ <div class="form-group">
+ <label for="vnf_type">vnf-type</label>
+ <input type="text" class="form-control" name="vnf_type" id="vnf_type">
+ </div>
+ <div class="form-group">
+ <label for="vnf_status">vnf-status</label>
+ <input type="text" class="form-control" name="vnf_status" id="vnf_status">
+ </div>
+ <div class="form-group">
+ <label for="vnf_id">vnf-id</label>
+ <input type="text" class="form-control" name="vnf_id" id="vnf_id">
+ </div>
+ <div class="form-group">
+ <label for="oam_network_name">oam-network-name</label>
+ <input type="text" class="form-control" name="oam_network_name" id="oam_network_name">
+ </div>
+ <div class="form-group">
+ <label for="aic_site_id">aic_site_id</label>
+ <input type="text" class="form-control" name="aic_site_id" id="aic_site_id">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#l3sdn-vnf-fields-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/link_latency_master.ejs b/admportal/views/partials/link_latency_master.ejs
new file mode 100644
index 00000000..83e87f03
--- /dev/null
+++ b/admportal/views/partials/link_latency_master.ejs
@@ -0,0 +1,100 @@
+<div class="modal fade" id="add_link_latency_master" tabindex="-1" role="dialog"
+ aria-labelledby="add_link_latency_master_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Link Latency Master</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/tunnel/addLinkLatencyMaster" method="POST">
+ <div class="form-group">
+ <label for="nf_source_crs_name">*Source CRS Name</label>
+ <input type="text" class="form-control" maxlength="20" name="nf_source_crs_name" id="nf_source_crs_name" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_destination_crs_name">*Destination CRS Name</label>
+ <input type="text" class="form-control" maxlength="20" name="nf_destination_crs_name" id="nf_destination_crs_name" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_bundle_name">*Bundle Name</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_bundle_name" id="nf_bundle_name" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="nf_latency">*Latency</label>
+ <input type="text" class="form-control" maxlength="10" name="nf_latency" id="nf_latency" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <label for="nf_intra_inter_snrc">*Intra Inter SNRC</label>
+ <input type="text" class="form-control" maxlength="10" name="nf_intra_inter_snrc" id="nf_intra_inter_snrc" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <label for="nf_final_latency">*Final Latency</label>
+ <input type="text" class="form-control" maxlength="10" name="nf_final_latency" id="nf_final_latency" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <label for="nf_augmentable">*Augmentable</label>
+ <input type="text" class="form-control" maxlength="1" name="nf_augmentable" id="nf_augmentable" placeholder="varchar(1)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitLinkLatencyMaster(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal fade" id="update_link_latency_master" tabindex="-1" role="dialog"
+ aria-labelledby="update_link_latency_master_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Link Latency Master</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/tunnel/updateLinkLatencyMaster" method="POST">
+ <div class="form-group">
+ <label for="uf_source_crs_name">*Source CRS Name</label>
+ <input type="text" class="form-control" maxlength="20" name="uf_source_crs_name" id="uf_source_crs_name" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_destination_crs_name">*Destination CRS Name</label>
+ <input type="text" class="form-control" maxlength="20" name="uf_destination_crs_name" id="uf_destination_crs_name" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_bundle_name">*Bundle Name</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_bundle_name" id="uf_bundle_name" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="uf_latency">*Latency</label>
+ <input type="text" class="form-control" maxlength="10" name="uf_latency" id="uf_latency" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <label for="uf_intra_inter_snrc">*Intra Inter SNRC</label>
+ <input type="text" class="form-control" maxlength="10" name="uf_intra_inter_snrc" id="uf_intra_inter_snrc" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <label for="uf_final_latency">*Final Latency</label>
+ <input type="text" class="form-control" maxlength="10" name="uf_final_latency" id="uf_final_latency" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <label for="uf_augmentable">*Augmentable</label>
+ <input type="text" class="form-control" maxlength="1" name="uf_augmentable" id="uf_augmentable" placeholder="varchar(1)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_source_crs_name" id="uf_key_source_crs_name">
+ <input type="hidden" name="uf_key_destination_crs_name" id="uf_key_destination_crs_name">
+ <input type="hidden" name="uf_key_bundle_name" id="uf_key_bundle_name">
+ <button type="button" class="btn btn-primary" onclick="submitLinkLatencyMaster(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/link_master.ejs b/admportal/views/partials/link_master.ejs
new file mode 100644
index 00000000..5ece82dd
--- /dev/null
+++ b/admportal/views/partials/link_master.ejs
@@ -0,0 +1,109 @@
+<div class="modal fade" id="add_link_master" tabindex="-1" role="dialog"
+ aria-labelledby="add_link_master_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Link Master</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/tunnel/addLinkMaster" method="POST">
+ <div class="form-group">
+ <label for="nf_link_interface_ip">*Link Interface IP</label>
+ <input type="text" class="form-control" name="nf_link_interface_ip" id="nf_link_interface_ip" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_source_crs_name">*Source CRS Name</label>
+ <input type="text" class="form-control" name="nf_source_crs_name" id="nf_source_crs_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_destination_crs_name">*Destination CRS Name</label>
+ <input type="text" class="form-control" name="nf_destination_crs_name" id="nf_destination_crs_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_link_speed">Link Speed</label>
+ <input type="text" class="form-control" name="nf_link_speed" id="nf_link_speed" maxlength="11" placeholder="int(11)">
+ </div>
+ <div class="form-group">
+ <label for="nf_default_cost">Default Cost</label>
+ <input type="text" class="form-control" name="nf_default_cost" id="nf_default_cost" maxlength="11" placeholder="int(11)">
+ </div>
+ <div class="form-group">
+ <label for="nf_bundle_name">Bundle Name</label>
+ <input type="text" class="form-control" name="nf_bundle_name" id="nf_bundle_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_shutdown">Shutdown</label>
+ <select class="form-control" name="nf_shutdown" id="nf_shutdown">
+ <option value='N'>False</option>
+ <option value='Y'>True</option>
+ </select>
+ </div>
+
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="saveLinkMaster(this.form);">Save</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="modal fade" id="update_link_master" tabindex="-1" role="dialog"
+ aria-labelledby="update_link_master_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Link Master</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/tunnel/updateLinkMaster" method="POST">
+ <div class="form-group">
+ <label for="uf_link_interface_ip">*Link Interface IP</label>
+ <input type="text" class="form-control" name="uf_link_interface_ip" id="uf_link_interface_ip" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_source_crs_name">*Source CRS Name</label>
+ <input type="text" class="form-control" name="uf_source_crs_name" id="uf_source_crs_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_destination_crs_name">*Destination CRS Name</label>
+ <input type="text" class="form-control" name="uf_destination_crs_name" id="uf_destination_crs_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_link_speed">Link Speed</label>
+ <input type="text" class="form-control" name="uf_link_speed" id="uf_link_speed" maxlength="11" placeholder="int(11)">
+ </div>
+ <div class="form-group">
+ <label for="uf_default_cost">Default Cost</label>
+ <input type="text" class="form-control" name="uf_default_cost" id="uf_default_cost" maxlength="11" placeholder="int(11)">
+ </div>
+ <div class="form-group">
+ <label for="uf_bundle_name">Bundle Name</label>
+ <input type="text" class="form-control" name="uf_bundle_name" id="uf_bundle_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+
+ <div class="form-group">
+ <label for="uf_shutdown">Shutdown</label>
+ <select class="form-control" name="uf_shutdown" id="uf_shutdown">
+ <option value='N'>False</option>
+ <option value='Y'>True</option>
+ </select>
+ </div>
+
+
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_link_interface_ip" id="uf_key_link_interface_ip">
+ <button type="button" class="btn btn-primary" onclick="saveLinkMaster(this.form);">Save</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+</div>
+
diff --git a/admportal/views/partials/max_port_speed.ejs b/admportal/views/partials/max_port_speed.ejs
new file mode 100644
index 00000000..a578308e
--- /dev/null
+++ b/admportal/views/partials/max_port_speed.ejs
@@ -0,0 +1,86 @@
+ <div class="modal fade" id="add_max_port_speed" tabindex="-1" role="dialog"
+ aria-labelledby="add_max_port_speed_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Max Port Speed</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/resalloc/addMaxPortSpeed" method="POST">
+ <div class="form-group">
+ <label for="nf_image_file_name">*Image File Name</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_image_file_name" id="nf_image_file_name" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="nf_end_point_position">*End Point Position</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_end_point_position" id="nf_end_point_position" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="nf_interface_name">*Interface Name</label>
+ <input type="text" class="form-control" maxlength="100" name="nf_interface_name" id="nf_interface_name" placeholder="varchar(100)" >
+ </div>
+ <div class="form-group">
+ <label for="nf_max_speed">*Max Speed</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_max_speed" id="nf_max_speed" placeholder="bigint(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_unit">*Unit</label>
+ <input type="text" class="form-control" maxlength="10" name="nf_unit" id="nf_unit" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitMaxPortSpeed(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal fade" id="update_max_port_speed" tabindex="-1" role="dialog"
+ aria-labelledby="update_max_port_speed_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Max Port Speed</h4>
+ </div>
+ <div class="modal-body">
+ <form name="updateForm" role="form" action="/resalloc/updateMaxPortSpeed" method="POST">
+ <div class="form-group">
+ <label for="uf_max_port_speed_id">*ID</label>
+ <input readonly type="text" class="form-control" name="uf_max_port_speed_id" id="uf_max_port_speed_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_image_file_name">*Image File Name</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_image_file_name" id="uf_image_file_name" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="uf_end_point_position">*End Point Position</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_end_point_position" id="uf_end_point_position" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="uf_interface_name">*Interface Name</label>
+ <input type="text" class="form-control" maxlength="100" name="uf_interface_name" id="uf_interface_name" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="uf_max_speed">*Max Speed</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_max_speed" id="uf_max_speed" placeholder="bigint(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_unit">*Unit</label>
+ <input type="text" class="form-control" maxlength="10" name="uf_unit" id="uf_unit" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_max_port_speed_id" id="uf_key_max_port_speed_id">
+ <button type="button" class="btn btn-primary" onclick="submitMaxPortSpeed(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/max_server_speed.ejs b/admportal/views/partials/max_server_speed.ejs
new file mode 100644
index 00000000..6212414c
--- /dev/null
+++ b/admportal/views/partials/max_server_speed.ejs
@@ -0,0 +1,88 @@
+<div class="modal fade" id="add_max_server_speed" tabindex="-1" role="dialog"
+ aria-labelledby="add_max_server_speed_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Max Server Speed</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/resalloc/addMaxServerSpeed" method="POST">
+ <div class="form-group">
+ <label for="nf_server_model">*Server ModelName</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_server_model" id="nf_server_model" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="nf_evc_count">*EVC Count</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_evc_count" id="nf_evc_count" placeholder="smallint(6)">
+ </div>
+ <div class="form-group">
+ <label for="nf_max_speed">*Max Speed</label>
+ <input type="text" class="form-control" maxlength="100" name="nf_max_speed" id="nf_max_speed" placeholder="bigint(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_unit">*Unit</label>
+ <input type="text" class="form-control" maxlength="10" name="nf_unit" id="nf_unit" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <label for="nf_description">Description</label>
+ <input type="text" class="form-control" maxlength="500" name="nf_description" id="nf_description" placeholder="varchar(500)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <input type="hidden" name="nf_key_max_server_speed_id" id="nf_key_max_server_speed_id">
+ <button type="button" class="btn btn-primary" onclick="submitMaxServerSpeed(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="modal fade" id="update_max_server_speed" tabindex="-1" role="dialog"
+ aria-labelledby="max_server_speed_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Max Server Speed</h4>
+ </div>
+ <div class="modal-body">
+ <form name="updateForm" role="form" action="/resalloc/updateMaxServerSpeed" method="POST">
+ <div class="form-group">
+ <label for="uf_max_server_speed_id">*ID</label>
+ <input readonly type="text" class="form-control" name="uf_max_server_speed_id" id="uf_max_server_speed_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_server_model">*Server Model</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_server_model" id="uf_server_model" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="uf_evc_count">*EVC Count</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_evc_count" id="uf_evc_count" placeholder="smallint(6)">
+ </div>
+ <div class="form-group">
+ <label for="uf_max_speed">*Max Speed</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_max_speed" id="uf_max_speed" placeholder="bigint(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_unit">*Unit</label>
+ <input type="text" class="form-control" maxlength="10" name="uf_unit" id="uf_unit" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <label for="uf_description">Description</label>
+ <input type="text" class="form-control" maxlength="500" name="uf_description" id="uf_description" placeholder="varchar(500)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_max_server_speed_id" id="uf_key_max_server_speed_id">
+ <button type="button" class="btn btn-primary" onclick="submitMaxServerSpeed(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/metroroadm_service_request.ejs b/admportal/views/partials/metroroadm_service_request.ejs
new file mode 100644
index 00000000..e198f7fd
--- /dev/null
+++ b/admportal/views/partials/metroroadm_service_request.ejs
@@ -0,0 +1,170 @@
+<div class="modal fade" id="add_metroroadm_service_request" tabindex="-1" role="dialog"
+ aria-labelledby="add_metroroadm_service_request_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Metro ROADM Service Request</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/tunnel/addMetroRoadmServiceRequest" method="POST">
+ <div class="form-group">
+ <label for="nf_request_id">*Request ID</label>
+ <input type="text" class="form-control" maxlength="75" name="nf_request_id" id="nf_request_id" placeholder="varchar(75)">
+ </div>
+ <div class="form-group">
+ <label for="nf_request_source">Request Source</label>
+ <input type="text" class="form-control" maxlength="20" name="nf_request_source" id="nf_request_source" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_notification_url">Notification URL</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_notification_url" id="nf_notification_url" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_l_action">*Action</label>
+ <input type="text" class="form-control" maxlength="10" name="nf_l_action" id="nf_l_action" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <label for="nf_request_timestamp">*Request Timestamp</label>
+ <input type="text" class="form-control" maxlength="80" name="nf_request_timestamp" id="nf_request_timestamp" placeholder="YYYY-MM-DD HH:MM:SS">
+ </div>
+ <div class="form-group">
+ <label for="nf_update_timestamp">Update Timestamp</label>
+ <input type="text" class="form-control" maxlength="80" name="nf_update_timestamp" id="nf_update_timestamp" placeholder="varchar(80)">
+ </div>
+ <div class="form-group">
+ <label for="nf_request_status">*Request Status</label>
+ <input type="text" class="form-control" maxlength="20" name="nf_request_status" id="nf_request_status" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_processing_status">*Processing Status</label>
+ <input type="text" class="form-control" maxlength="40" name="nf_processing_status" id="nf_processing_status" placeholder="varchar(40)">
+ </div>
+ <div class="form-group">
+ <label for="nf_reason_code">Reason Code</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_reason_code" id="nf_reason_code" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_reason_message">Reason Message</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_reason_message" id="nf_reason_message" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_service_id">*Service Id</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_service_id" id="nf_service_id" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="nf_common_id">Common Id</label>
+ <input type="text" class="form-control" maxlength="12" name="nf_common_id" id="nf_common_id" placeholder="varchar(12)">
+ </div>
+ <div class="form-group">
+ <label for="nf_clli_a">CLLI A</label>
+ <input type="text" class="form-control" maxlength="20" name="nf_clli_a" id="nf_clli_a" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_clli_z">CLLI Z</label>
+ <input type="text" class="form-control" maxlength="20" name="nf_clli_z" id="nf_clli_z" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_customer">Customer</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_customer" id="nf_customer" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_controller_id">*Controller Id</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_controller_id" id="nf_controller_id" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitMetroRoadmServiceRequest(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal fade" id="update_metroroadm_service_request" tabindex="-1" role="dialog"
+ aria-labelledby="update_metroroadm_service_request_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Metro ROADM Service Request</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/tunnel/updateMetroRoadmServiceRequest" method="POST">
+ <div class="form-group">
+ <label for="uf_request_id">*Request ID</label>
+ <input type="text" class="form-control" maxlength="75" name="uf_request_id" id="uf_request_id" placeholder="varchar(75)">
+ </div>
+ <div class="form-group">
+ <label for="uf_request_source">Request Source</label>
+ <input type="text" class="form-control" maxlength="20" name="uf_request_source" id="uf_request_source" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_notification_url">Notification URL</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_notification_url" id="uf_notification_url" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="uf_l_action">*Action</label>
+ <input type="text" class="form-control" maxlength="10" name="uf_l_action" id="uf_l_action" placeholder="varchar(10)">
+ </div>
+ <div class="form-group">
+ <label for="uf_request_timestamp">*Request Timestamp</label>
+ <input type="text" class="form-control" maxlength="80" name="uf_request_timestamp" id="uf_request_timestamp" placeholder="varchar(80)">
+ </div>
+ <div class="form-group">
+ <label for="uf_update_timestamp">Update Timestamp</label>
+ <input type="text" class="form-control" maxlength="80" name="uf_update_timestamp" id="uf_update_timestamp" placeholder="varchar(80)">
+ </div>
+ <div class="form-group">
+ <label for="uf_request_status">*Request Status</label>
+ <input type="text" class="form-control" maxlength="20" name="uf_request_status" id="uf_request_status" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_processing_status">*Processing Status</label>
+ <input type="text" class="form-control" maxlength="40" name="uf_processing_status" id="uf_processing_status" placeholder="varchar(40)">
+ </div>
+ <div class="form-group">
+ <label for="uf_reason_code">Reason Code</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_reason_code" id="uf_reason_code" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="uf_reason_message">Reason Message</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_reason_message" id="uf_reason_message" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="uf_service_id">*Service Id</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_service_id" id="uf_service_id" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="uf_common_id">Common Id</label>
+ <input type="text" class="form-control" maxlength="12" name="uf_common_id" id="uf_common_id" placeholder="varchar(12)">
+ </div>
+ <div class="form-group">
+ <label for="uf_clli_a">CLLI A</label>
+ <input type="text" class="form-control" maxlength="20" name="uf_clli_a" id="uf_clli_a" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_clli_z">CLLI Z</label>
+ <input type="text" class="form-control" maxlength="20" name="uf_clli_z" id="uf_clli_z" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_customer">Customer</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_customer" id="uf_customer" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="uf_controller_id">*Controller Id</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_controller_id" id="uf_controller_id" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_request_id" id="uf_key_request_id">
+ <button type="button" class="btn btn-primary" onclick="submitMetroRoadmServiceRequest(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/nat.ejs b/admportal/views/partials/nat.ejs
new file mode 100644
index 00000000..973c2549
--- /dev/null
+++ b/admportal/views/partials/nat.ejs
@@ -0,0 +1,38 @@
+ <div class="modal fade" id="nat-modal" tabindex="-1" role="dialog"
+ aria-labelledby="nat-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">nat</h4>
+ </div>
+ <div class="modal-body">
+ <form id="nat_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="v4_nat_enabled">v4-nat-enabled</label>
+ <input type="text" class="form-control" name="v4_nat_enabled" id="v4_nat_enabled">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#nat-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/nb_vlan_pool.ejs b/admportal/views/partials/nb_vlan_pool.ejs
new file mode 100644
index 00000000..d5e8973b
--- /dev/null
+++ b/admportal/views/partials/nb_vlan_pool.ejs
@@ -0,0 +1,38 @@
+ <div class="modal fade" id="update_nb_vlan_pool" tabindex="-1" role="dialog"
+ aria-labelledby="update_nb_vlan_pool_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update NetBond VLAN Pool</h4>
+ </div>
+ <div class="modal-body">
+ <form name="updateForm" role="form" action="/gamma/updateNbVlanPool" method="POST">
+
+ <div class="form-group">
+ <label for="nf_plan_type">Status</label>
+ <select class="form-control" name="uf_status" id="uf_status">
+ <option value="AVAILABLE">AVAILABLE</option>
+ <option value="RESERVED">RESERVED</option>
+ <option value="IN-USE">IN-USE</option>
+ </select>
+ </div>
+
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id">
+ <input type="hidden" name="uf_key_availability_zone" id="uf_key_availability_zone">
+ <input type="hidden" name="uf_key_vlan_plan_id" id="uf_key_vlan_plan_id">
+ <input type="hidden" name="uf_key_plan_type" id="uf_key_plan_type">
+ <input type="hidden" name="uf_key_purpose" id="uf_key_purpose">
+ <input type="hidden" name="uf_key_vlan_id" id="uf_key_vlan_id">
+
+ <button type="button" class="btn btn-primary"
+ onclick="saveNbVlanPool(this.form);">Save</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/nb_vlan_range.ejs b/admportal/views/partials/nb_vlan_range.ejs
new file mode 100644
index 00000000..4cc24a2d
--- /dev/null
+++ b/admportal/views/partials/nb_vlan_range.ejs
@@ -0,0 +1,45 @@
+ <div class="modal fade" id="add_vlan_range" tabindex="-1" role="dialog"
+ aria-labelledby="add_vlan_range_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add NetBond VLAN Range</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/gamma/saveNbVlanRange" method="POST">
+
+ <div class="form-group">
+ <label for="nf_plan_type">*Plan Type</label>
+ <select class="form-control" name="nf_plan_type" id="nf_plan_type">
+ <option value="NB VNAT">NB VNAT</option>
+ </select>
+ </div>
+
+ <div class="form-group">
+ <label for="nf_purpose">*Purpose</label>
+ <select class="form-control" name="nf_purpose" id="nf_purpose">
+ <option value=CUSTOMER>CUSTOMER</option>
+ <option value=PARTNER>PARTNER</option>
+ </select>
+ </div>
+
+ <div class="form-group">
+ <label for="nf_range_start">*Range Start</label>
+ <input type="text" class="form-control" name="nf_range_start" id="nf_range_start" maxlength="4" placeholder="int(4)">
+ </div>
+
+ <div class="form-group">
+ <label for="nf_range_end">*Range End</label>
+ <input type="text" class="form-control" name="nf_range_end" id="nf_range_end" maxlength="4" placeholder="int(4)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="saveNbVlanRange(this.form);">Save</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/ncs_credentials.ejs b/admportal/views/partials/ncs_credentials.ejs
new file mode 100644
index 00000000..a35b7e48
--- /dev/null
+++ b/admportal/views/partials/ncs_credentials.ejs
@@ -0,0 +1,74 @@
+<div class="modal fade" id="add_ncs_credentials" tabindex="-1" role="dialog"
+ aria-labelledby="add_ncs_credentials_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add NCS Credentials</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/ucpe/addNcsCredentials" method="POST">
+ <div class="form-group">
+ <label for="nf_customer_name">*Customer Name</label>
+ <input type="text" class="form-control" maxlength="255" aria-describedby="helpCName" name="nf_customer_name" id="nf_customer_name" placeholder="varchar(255)">
+ <span id="helpCName" class="help-block">The Customer Name must match exactly whats in the NCS Servers table.</span>
+ </div>
+ <div class="form-group">
+ <label for="nf_ncs_username">*NCS Username</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_ncs_username" id="nf_ncs_username" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_ncs_password">*NCS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_ncs_password" id="nf_ncs_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_phs_password">*Confirm NCS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_confirm_ncs_password" id="nf_confirm_ncs_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitNcsCredentials(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal fade" id="update_ncs_credentials" tabindex="-1" role="dialog"
+ aria-labelledby="update_ncs_credentials_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update NCS Credentials</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/ucpe/updateNcsCredentials" method="POST">
+ <div class="form-group">
+ <label for="uf_customer_name">*Customer Name</label>
+ <input readonly type="text" class="form-control" name="uf_customer_name" id="uf_customer_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_ncs_username">*NCS Username</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_ncs_username" id="uf_ncs_username">
+ </div>
+ <div class="form-group">
+ <label for="uf_ncs_password">*NCS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_ncs_password" id="uf_ncs_password">
+ </div>
+ <div class="form-group">
+ <label for="nf_phs_password">*Confirm NCS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_confirm_ncs_password" id="uf_confirm_ncs_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submitNcsCredentials(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/network_connections.ejs b/admportal/views/partials/network_connections.ejs
new file mode 100644
index 00000000..72093233
--- /dev/null
+++ b/admportal/views/partials/network_connections.ejs
@@ -0,0 +1,66 @@
+ <div class="modal fade"
+ id="network-connections-modal" tabindex="-1" role="dialog"
+ aria-labelledby="network-connections-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">network-connections</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="stack_id">stack-id</label>
+ <input type="text" class="form-control" name="stack_id" id="stack_id">
+ </div>
+ <div class="form-group">
+ <label for="net_status">net-status</label>
+ <input type="text" class="form-control" name="net_status" id="net_status">
+ </div>
+ <div class="form-group">
+ <label for="connection_type">connection-type</label>
+ <input type="text" class="form-control" name="connection_type" id="connection_type">
+ </div>
+ <div class="form-group">
+ <label for="provider_network">provider-network</label>
+ <input type="text" class="form-control" name="provider_network" id="provider_network">
+ </div>
+ <div class="form-group">
+ <label for="interface_id">interface-id</label>
+ <input type="text" class="form-control" name="interface_id" id="interface_id">
+ </div>
+ <div class="form-group">
+ <label for="vlan">vlan</label>
+ <input type="text" class="form-control" name="vlan" id="vlan">
+ </div>
+ <div class="form-group">
+ <label for="port_group_name">port-group-name</label>
+ <input type="text" class="form-control" name="port_group_name" id="port_group_name">
+ </div>
+ <div class="form-group">
+ <label for="neutron_network_id">neutron-network-id</label>
+ <input type="text" class="form-control" name="neutron_network_id" id="neutron_network_id">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#network-connections-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/network_profile.ejs b/admportal/views/partials/network_profile.ejs
new file mode 100644
index 00000000..81d7f32a
--- /dev/null
+++ b/admportal/views/partials/network_profile.ejs
@@ -0,0 +1,59 @@
+ <div class="modal fade" id="add_network_profile" tabindex="-1" role="dialog"
+ aria-labelledby="add_network_profile" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Network Profile</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/gamma/addNetworkProfile" method="POST">
+ <div class="form-group">
+ <label for="nf_network_type">*Network Type</label>
+ <input type="text" class="form-control" name="nf_network_type" id="nf_network_type" maxlength="100" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="nf_technology">Technology</label>
+ <input type="text" class="form-control" name="nf_technology" id="nf_technology" maxlength="100" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="saveNetworkProfile(this.form);">Save</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<div class="modal fade" id="update_network_profile" tabindex="-1" role="dialog"
+ aria-labelledby="update_network_profile_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Network Profile</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/gamma/updateNetworkProfile" method="POST">
+ <div class="form-group">
+ <label for="uf_network_type">*Network Type</label>
+ <input type="text" class="form-control" maxlength="100" name="uf_network_type" id="uf_network_type" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="uf_technology">Technology</label>
+ <input type="text" class="form-control" maxlength="100" name="uf_technology" id="uf_technology" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_network_type" id="uf_key_network_type">
+ <button type="button" class="btn btn-primary" onclick="saveNetworkProfile(this.form);">Save</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
diff --git a/admportal/views/partials/new_parameter.ejs b/admportal/views/partials/new_parameter.ejs
new file mode 100644
index 00000000..b6d1f5be
--- /dev/null
+++ b/admportal/views/partials/new_parameter.ejs
@@ -0,0 +1,36 @@
+ <div class="modal fade" id="new_parameter" tabindex="-1" role="dialog"
+ aria-labelledby="new_parameter_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Parameter</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/admin/addParameter" method="POST">
+ <div class="form-group">
+ <label for="nf_name">*Name</label>
+ <input maxlength="100" type="text" class="form-control" name="nf_name" id="nf_name" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="nf_value">*Value</label>
+ <input maxlength="100" type="text" class="form-control" name="nf_value" id="nf_value" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="nf_category">Category</label>
+ <input maxlength="24" type="text" class="form-control" name="nf_category" id="nf_category" placeholder="varchar(24)">
+ </div>
+ <div class="form-group">
+ <label for="nf_memo">Memo</label>
+ <input maxlength="128" type="text" class="form-control" name="nf_memo" id="nf_memo" placeholder="varchar(128)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitParam(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/newuserform.ejs b/admportal/views/partials/newuserform.ejs
new file mode 100644
index 00000000..60459947
--- /dev/null
+++ b/admportal/views/partials/newuserform.ejs
@@ -0,0 +1,37 @@
+<div class="modal fade" id="newUserModal" tabindex="-1" role="dialog" aria-labelledby="newUserModalLabel" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="newUserModalLabel">New User</h4>
+ </div>
+ <div class="modal-body">
+ <form id="addForm" name="addForm" role="form" action="/user/addUser" method="POST">
+ <div class="form-group">
+ <label for="email">Email</label>
+ <input type="email" class="form-control" name="nf_email" id="nf_email">
+ </div>
+ <div class="form-group">
+ <label for="nf_password">Password</label>
+ <input type="password" class="form-control" name="nf_password" id="nf_password">
+ </div>
+ <div class="form-group">
+ <label for="nf_confirm_password">Confirm Password</label>
+ <input type="password" class="form-control" name="nf_confirm_password" id="nf_confirm_password">
+ </div>
+ <div class="form-group">
+ <label for="privilege">Privilege</label>
+ <select class="form-control" name="nf_privilege" id="nf_privilege">
+ <option value=admin>Administrator</option>
+ <option value=readonly>Readonly</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <button type="button" class="btn btn-primary" onclick="submitUserAdmin(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/admportal/views/partials/oper_status_modal.ejs b/admportal/views/partials/oper_status_modal.ejs
new file mode 100644
index 00000000..ae6cbe06
--- /dev/null
+++ b/admportal/views/partials/oper_status_modal.ejs
@@ -0,0 +1,68 @@
+ <div class="modal fade" id="oper-status-modal" tabindex="-1" role="dialog" aria-labelledby="oper-status-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="oper-status-modal-label">oper-status</h4>
+ </div>
+ <div class="modal-body">
+ <form id="oper_status_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="order_status">order-status</label>
+ <input type="text" class="form-control" name="order_status" id="order_status">
+ </div>
+ <div class="form-group">
+ <label for="modify_timestamp">modify-timestamp</label>
+ <input type="text" class="form-control" name="modify_timestamp" id="modify_timestamp">
+ </div>
+ <div class="form-group">
+ <label for="last_svc_request_id">last-svc-request-id</label>
+ <input type="text" class="form-control" name="last_svc_request_id" id="last_svc_request_id">
+ </div>
+ <div class="form-group">
+ <label for="last_sub_action">last-sub-action</label>
+ <input type="text" class="form-control" name="last_sub_action" id="last_sub_action">
+ </div>
+ <div class="form-group">
+ <label for="t_defaulted_v6_vrlan">t-defaulted-v6-vrlan</label>
+ <input type="text" class="form-control" name="t_defaulted_v6_vrlan" id="t_defaulted_v6_vrlan">
+ </div>
+ <div class="form-group">
+ <label for="last_action">last-action</label>
+ <input type="text" class="form-control" name="last_action" id="last_action">
+ </div>
+ <div class="form-group">
+ <label for="create_timestamp">create-timestamp</label>
+ <input type="text" class="form-control" name="create_timestamp" id="create_timestamp">
+ </div>
+ <div class="form-group">
+ <label for="maintenance_indicator">maintenance-indicator</label>
+ <input type="text" class="form-control" name="maintenance_indicator" id="maintenance_indicator">
+ </div>
+ <div class="form-group">
+ <label for="last_order_status">last-order-status</label>
+ <input type="text" class="form-control" name="last_order_status" id="last_order_status">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#service-status-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/owbc_properties.ejs b/admportal/views/partials/owbc_properties.ejs
new file mode 100644
index 00000000..0d640325
--- /dev/null
+++ b/admportal/views/partials/owbc_properties.ejs
@@ -0,0 +1,98 @@
+<div class="modal fade" id="add_owbc_properties" tabindex="-1" role="dialog"
+ aria-labelledby="add_owbc_properties_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add OWBC Properties</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/tunnel/addOwbcProperties" method="POST">
+ <div class="form-group">
+ <label for="nf_controller_id">*Controller ID</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_controller_id" id="nf_controller_id" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_base_uri">*Base URL</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_base_uri" id="nf_base_uri" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_service_create_extension">*Service Create Extension</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_service_create_extension" id="nf_service_create_extension" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_service_delete_extension">*Service Delete Extension</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_service_delete_extension" id="nf_service_delete_extension" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_auth_username">*Auth Username</label>
+ <input type="text" class="form-control" maxlength="80" name="nf_auth_username" id="nf_auth_username" placeholder="varchar(80)">
+ </div>
+ <div class="form-group">
+ <label for="nf_auth_password">*Auth Password</label>
+ <input type="password" class="form-control" maxlength="80" name="nf_auth_password" id="nf_auth_password" placeholder="varbinary(80)">
+ </div>
+ <div class="form-group">
+ <label for="nf_confirm_auth_password">*Confirm Auth Password</label>
+ <input type="password" class="form-control" maxlength="80" name="nf_confirm_auth_password" id="nf_confirm_auth_password" placeholder="varbinary(80)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitOwbcProperties(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal fade" id="update_owbc_properties" tabindex="-1" role="dialog"
+ aria-labelledby="update_owbc_properties_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update OWBC Properties</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/tunnel/updateOwbcProperties" method="POST">
+ <div class="form-group">
+ <label for="uf_controller_id">*Controller ID</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_controller_id" id="uf_controller_id" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="uf_base_uri">*Base URL</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_base_uri" id="uf_base_uri" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="uf_service_create_extension">*Service Create Extension</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_service_create_extension" id="uf_service_create_extension" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="uf_service_delete_extension">*Service Delete Extension</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_service_delete_extension" id="uf_service_delete_extension" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="uf_auth_username">*Auth Username</label>
+ <input type="text" class="form-control" maxlength="80" name="uf_auth_username" id="uf_auth_username" placeholder="varchar(80)">
+ </div>
+ <div class="form-group">
+ <label for="uf_auth_password">*Auth Password</label>
+ <input type="password" class="form-control" maxlength="80" name="uf_auth_password" id="uf_auth_password" placeholder="varbinary(80)">
+ </div>
+ <div class="form-group">
+ <label for="uf_confirm_auth_password">*Confirm Auth Password</label>
+ <input type="password" class="form-control" maxlength="80" name="uf_confirm_auth_password" id="uf_confirm_auth_password" placeholder="varbinary(80)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_controller_id" id="uf_key_controller_id">
+ <button type="button" class="btn btn-primary" onclick="submitOwbcProperties(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/partner_properties.ejs b/admportal/views/partials/partner_properties.ejs
new file mode 100644
index 00000000..1f1d601a
--- /dev/null
+++ b/admportal/views/partials/partner_properties.ejs
@@ -0,0 +1,74 @@
+<div class="modal fade" id="add_partner_properties" tabindex="-1" role="dialog"
+ aria-labelledby="add_partner_properties_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Partner Properties</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/tunnel/addPartnerProperties" method="POST">
+ <div class="form-group">
+ <label for="nf_partner">*Partner</label>
+ <input type="text" class="form-control" maxlength="100" name="nf_partner" id="nf_partner" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="nf_auth_username">*Auth Username</label>
+ <input type="text" class="form-control" maxlength="80" name="nf_auth_username" id="nf_auth_username" placeholder="varchar(80)">
+ </div>
+ <div class="form-group">
+ <label for="nf_auth_password">*Auth Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_auth_password" id="nf_auth_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_confirm_auth_password">*Confirm Auth Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_confirm_auth_password" id="nf_confirm_auth_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitPartnerProperties(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal fade" id="update_partner_properties" tabindex="-1" role="dialog"
+ aria-labelledby="update_partner_properties_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Partner Properties</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/tunnel/updatePartnerProperties" method="POST">
+ <div class="form-group">
+ <label for="uf_partner">*Partner</label>
+ <input type="text" class="form-control" maxlength="100" name="uf_partner" id="uf_partner" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="uf_auth_username">*Auth Username</label>
+ <input type="text" class="form-control" maxlength="80" name="uf_auth_username" id="uf_auth_username" placeholder="varchar(80)">
+ </div>
+ <div class="form-group">
+ <label for="uf_auth_password">*Auth Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_auth_password" id="uf_auth_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <label for="uf_confirm_auth_password">*Confirm Auth Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_confirm_auth_password" id="uf_confirm_auth_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_partner" id="uf_key_partner">
+ <button type="button" class="btn btn-primary" onclick="submitPartnerProperties(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/pat.ejs b/admportal/views/partials/pat.ejs
new file mode 100644
index 00000000..8cc91555
--- /dev/null
+++ b/admportal/views/partials/pat.ejs
@@ -0,0 +1,50 @@
+ <div class="modal fade" id="pat-modal" tabindex="-1" role="dialog"
+ aria-labelledby="pat-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">pat</h4>
+ </div>
+ <div class="modal-body">
+ <form id="pat_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="v4_pat_default_pool_prefix_length">v4-pat-default-pool-prefix-length</label>
+ <input type="text" class="form-control" name="v4_pat_default_pool_prefix_length" id="v4_pat_default_pool_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="use_v4_default_pool">use-v4-default-pool</label>
+ <input type="text" class="form-control" name="use_v4_default_pool" id="use_v4_default_pool">
+ </div>
+ <div class="form-group">
+ <label for="v4_pat_enabled">v4-pat-enabled</label>
+ <input type="text" class="form-control" name="v4_pat_enabled" id="v4_pat_enabled">
+ </div>
+ <div class="form-group">
+ <label for="v4_pat_default_pool_prefix">v4-pat-default-pool-prefix</label>
+ <input type="text" class="form-control" name="v4_pat_default_pool_prefix" id="v4_pat_default_pool_prefix">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#pat-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/pat_pools.ejs b/admportal/views/partials/pat_pools.ejs
new file mode 100644
index 00000000..5b0b3f09
--- /dev/null
+++ b/admportal/views/partials/pat_pools.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade" id="pat-pools-modal" tabindex="-1" role="dialog"
+ aria-labelledby="pat-pools-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">v4-pat-pools</h4>
+ </div>
+ <div class="modal-body">
+ <form id="pat_pools-form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="v4_pat__pool_next_hop_address">v4-pat-pool-next-hop-address</label>
+ <input type="text" class="form-control" name="v4_pat_pool_next_hop_address" id="v4_pat_pool_next_hop_address">
+ </div>
+ <div class="form-group">
+ <label for="v4_pat_pool_prefix_length">v4-pat-pool-prefix-length</label>
+ <input type="text" class="form-control" name="v4_pat_pool_prefix_length" id="v4_pat_pool_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="v4_pat_pool_prefix">v4-pat-pool-prefix</label>
+ <input type="text" class="form-control" name="v4_pat_pool_prefix" id="v4_pat_pool_prefix">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#pat-pools-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/phs_credentials.ejs b/admportal/views/partials/phs_credentials.ejs
new file mode 100644
index 00000000..4413dcad
--- /dev/null
+++ b/admportal/views/partials/phs_credentials.ejs
@@ -0,0 +1,92 @@
+<div class="modal fade" id="add_phs_credentials" tabindex="-1" role="dialog"
+ aria-labelledby="add_phs_credentials_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add PHS Credentials</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/ucpe/addPhsCredentials" method="POST">
+ <div class="form-group">
+ <label for="nf_device_vendor_name">*Device Vendor Name</label>
+ <input type="text" class="form-control" maxlength="255" aria-describedby="helpVName" name="nf_device_vendor_name" id="nf_device_vendor_name" placeholder="varchar(255)">
+ <span id="helpVName" class="help-block">The Device Vendor Name must match exactly whats in the PHS Servers table.</span>
+ </div>
+ <div class="form-group">
+ <label for="nf_customer_name">*Customer Name</label>
+ <input type="text" class="form-control" maxlength="255" aria-describedby="helpCName" name="nf_customer_name" id="nf_customer_name" placeholder="varchar(255)">
+ <span id="helpCName" class="help-block">The Customer Name must match exactly whats in the PHS Servers table.</span>
+ </div>
+ <div class="form-group">
+ <label for="nf_ip_addresses">*IP Addresses</label>
+ <input type="text" class="form-control" maxlength="40" aria-describedby="helpIP" name="nf_ip_addresses" id="nf_ip_addresses" placeholder="varchar(40)">
+ <span id="helpIP" class="help-block">The IP Addresses must match exactly whats in the PHS Servers table.</span>
+ </div>
+ <div class="form-group">
+ <label for="nf_phs_username">*PHS Username</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_phs_username" id="nf_phs_username" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_phs_password">*PHS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_phs_password" id="nf_phs_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_phs_password">*Confirm PHS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_confirm_phs_password" id="nf_confirm_phs_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitPhsCredentials(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal fade" id="update_phs_credentials" tabindex="-1" role="dialog"
+ aria-labelledby="update_phs_credentials_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update PHS Credentials</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/ucpe/updatePhsCredentials" method="POST">
+ <div class="form-group">
+ <label for="uf_device_vendor_name">*Device Vendor Name</label>
+ <input readonly type="text" class="form-control" name="uf_device_vendor_name" id="uf_device_vendor_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_customer_name">*Customer Name</label>
+ <input readonly type="text" class="form-control" name="uf_customer_name" id="uf_customer_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_ip_addresses">*IP Addresses</label>
+ <input readonly type="text" class="form-control" name="uf_ip_addresses" id="uf_ip_addresses">
+ </div>
+ <div class="form-group">
+ <label for="uf_phs_username">*PHS Username</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_phs_username" id="uf_phs_username">
+ </div>
+ <div class="form-group">
+ <label for="uf_phs_password">*PHS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_phs_password" id="uf_phs_password">
+ </div>
+ <div class="form-group">
+ <label for="uf_phs_password">*Confirm PHS Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_confirm_phs_password" id="uf_confirm_phs_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submitPhsCredentials(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/request_information_modal.ejs b/admportal/views/partials/request_information_modal.ejs
new file mode 100644
index 00000000..b5ee4a31
--- /dev/null
+++ b/admportal/views/partials/request_information_modal.ejs
@@ -0,0 +1,60 @@
+ <div class="modal fade" id="request-information-modal" tabindex="-1" role="dialog" aria-labelledby="request-information-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="request-information-modal-label">request-information</h4>
+ </div>
+ <div class="modal-body">
+ <form id="request_information_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="notification_url">notification-url</label>
+ <input type="text" class="form-control" name="notification_url" id="notification_url">
+ </div>
+ <div class="form-group">
+ <label for="source">source</label>
+ <input type="text" class="form-control" name="source" id="source">
+ </div>
+ <div class="form-group">
+ <label for="order_number">order-number</label>
+ <input type="text" class="form-control" name="order_number" id="order_number">
+ </div>
+ <div class="form-group">
+ <label for="request_id">request-id</label>
+ <input type="text" class="form-control" name="request_id" id="request_id">
+ </div>
+ <div class="form-group">
+ <label for="order_version">order-version</label>
+ <input type="text" class="form-control" name="order_version" id="order_version">
+ </div>
+ <div class="form-group">
+ <label for="request_action">request-action</label>
+ <input type="text" class="form-control" name="request_action" id="request_action">
+ </div>
+ <div class="form-group">
+ <label for="request_sub_action">request-sub-action</label>
+ <input type="text" class="form-control" name="request_sub_action" id="request_sub_action">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#service-status-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/resource_rule.ejs b/admportal/views/partials/resource_rule.ejs
new file mode 100644
index 00000000..05d0bf4e
--- /dev/null
+++ b/admportal/views/partials/resource_rule.ejs
@@ -0,0 +1,118 @@
+<div class="modal fade" id="add_resource_rule" tabindex="-1" role="dialog"
+ aria-labelledby="add_resource_rule_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Resource Rule</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/resalloc/addResourceRule" method="POST">
+ <div class="form-group">
+ <label for="nf_resource_name">*Name</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_resource_name" id="nf_resource_name" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="nf_end_point_position">*End Point Position</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_end_point_position" id="nf_end_point_position" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="nf_service_expression">*Service Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="nf_service_expression" id="nf_service_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="nf_equipment_level">*Equipment Level</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_equipment_level" id="nf_equipment_level" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="nf_equipment_expression">*Equipment Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="nf_equipment_expression" id="nf_equipment_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="nf_allocation_expression">*Allocation Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="nf_allocation_expression" id="nf_allocation_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="nf_soft_limit_expression">*Soft Limit Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="nf_soft_limit_expression" id="nf_soft_limit_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="nf_hard_limit_expression">*Hard Limit Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="nf_hard_limit_expression" id="nf_hard_limit_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="nf_service_model">*Service Model</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_service_model" id="nf_service_model" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitResourceRule(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal fade" id="update_resource_rule" tabindex="-1" role="dialog"
+ aria-labelledby="update_resource_rule_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Resource Rule</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/resalloc/updateResourceRule" method="POST">
+ <div class="form-group">
+ <label for="uf_resource_rule_id">*Rule ID</label>
+ <input readonly type="text" class="form-control" name="uf_resource_rule_id" id="uf_resource_rule_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_resource_name">*Name</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_resource_name" id="uf_resource_name" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="uf_end_point_position">*End Point Position</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_end_point_position" id="uf_end_point_position" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="uf_service_expression">*Service Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_service_expression" id="uf_service_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="uf_equipment_level">*Equipment Level</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_equipment_level" id="uf_equipment_level" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="uf_equipment_expression">*Equipment Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_equipment_expression" id="uf_equipment_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="uf_allocation_expression">*Allocation Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_allocation_expression" id="uf_allocation_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="uf_soft_limit_expression">*Soft Limit Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_soft_limit_expression" id="uf_soft_limit_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="uf_hard_limit_expression">*Hard Limit Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_hard_limit_expression" id="uf_hard_limit_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="uf_service_model">*Service Model</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_service_model" id="uf_service_model" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_resource_rule_id" id="uf_key_resource_rule_id">
+ <button type="button" class="btn btn-primary" onclick="submitResourceRule(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/ro_header.ejs b/admportal/views/partials/ro_header.ejs
new file mode 100644
index 00000000..2e5624a1
--- /dev/null
+++ b/admportal/views/partials/ro_header.ejs
@@ -0,0 +1,43 @@
+<!-- views/partials/header.ejs -->
+<nav class="navbar navbar-default" role="navigation">
+ <div class="container-fluid">
+
+
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">&nbsp;SDN-C AdminPortal</a>
+ </div>
+
+ <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups">
+
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn" disabled>SLA</button>
+
+ <div class="btn-group" role="group">
+ <button disabled type="button" class="btn btn-default navbar-btn dropdown-toggle"
+ data-toggle="dropdown" aria-expanded="false">Table Initialization <span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="/gamma/getAicSite">AIC Site</a></li>
+ <li><a href="/gamma/getAicSwitch">AIC Switch</a></li>
+ <li><a href="/gamma/getAicAvailZone">AIC Availability Zone</a></li>
+ <li><a href="/gamma/getVlanPool">VLAN_ID Pool</a></li>
+ <li><a href="/gamma/getVpePool">VPE Pool</a></li>
+ <li><a href="/gamma/getVplspePool">VPLSPE Pool</a></li>
+ <!-- <li class="divider"></li> -->
+ </ul>
+ </div>
+
+ <button type="button" class="btn btn-default navbar-btn" disabled>Interfaces</button>
+ <button type="button" class="btn btn-default navbar-btn" disabled>VMs</button>
+ <button disabled type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/odl/listWklst');">Worklist Orders</button>
+ <button type="button" class="btn btn-default navbar-btn" disabled>Connections</button>
+ <button type="button" class="btn btn-default navbar-btn" disabled>VNFs</button>
+ <button type="button" class="btn btn-default navbar-btn" disabled>VLANs</button>
+ <button disabled type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/user/listUsers');">User Admin</button>
+ <button disabled type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/logout');">Logout</button>
+ </div>
+ </div>
+ </div>
+</nav>
diff --git a/admportal/views/partials/roadm_mapping.ejs b/admportal/views/partials/roadm_mapping.ejs
new file mode 100644
index 00000000..0e3a6fbd
--- /dev/null
+++ b/admportal/views/partials/roadm_mapping.ejs
@@ -0,0 +1,101 @@
+<div class="modal fade" id="add_roadm_mapping" tabindex="-1" role="dialog"
+ aria-labelledby="add_roadm_mapping_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add ROADM Mapping</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/tunnel/addRoadmMapping" method="POST">
+ <div class="form-group">
+ <label for="nf_router_name">*Router Name</label>
+ <input type="text" class="form-control" name="nf_router_name" id="nf_router_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_roadm_name">*ROADM Name</label>
+ <input type="text" class="form-control" name="nf_roadm_name" id="nf_roadm_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_clli">*CLLI</label>
+ <input type="text" class="form-control" name="nf_clli" id="nf_clli" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_city_name">*City Name</label>
+ <input type="text" class="form-control" name="nf_city_name" id="nf_city_name" maxlength="80" placeholder="varchar(80)">
+ </div>
+ <div class="form-group">
+ <label for="nf_lat">*Latitude</label>
+ <input type="text" class="form-control" name="nf_lat" id="nf_lat" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_lon">*Longitude</label>
+ <input type="text" class="form-control" name="nf_lon" id="nf_lon" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_snrc">*SNRC</label>
+ <input type="text" class="form-control" name="nf_snrc" id="nf_snrc" maxlength="20" placeholder="varchar(20)">
+ </div>
+
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="saveRoadmMapping(this.form);">Save</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="modal fade" id="update_roadm_mapping" tabindex="-1" role="dialog"
+ aria-labelledby="update_roadm_mapping_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update ROADM Mapping</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/tunnel/updateRoadmMapping" method="POST">
+ <div class="form-group">
+ <label for="uf_router_name">*Router Name</label>
+ <input type="text" class="form-control" name="uf_router_name" id="uf_router_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_roadm_name">*ROADM Name</label>
+ <input type="text" class="form-control" name="uf_roadm_name" id="uf_roadm_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_clli">*CLLI</label>
+ <input type="text" class="form-control" name="uf_clli" id="uf_clli" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_city_name">*City Name</label>
+ <input type="text" class="form-control" name="uf_city_name" id="uf_city_name" maxlength="80" placeholder="varchar(80)">
+ </div>
+ <div class="form-group">
+ <label for="uf_lat">*Latitude</label>
+ <input type="text" class="form-control" name="uf_lat" id="uf_lat" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_lon">*Longitude</label>
+ <input type="text" class="form-control" name="uf_lon" id="uf_lon" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_snrc">*SNRC</label>
+ <input type="text" class="form-control" name="uf_snrc" id="uf_snrc" maxlength="20" placeholder="varchar(20)">
+ </div>
+
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_router_name" id="uf_key_router_name">
+ <button type="button" class="btn btn-primary" onclick="saveRoadmMapping(this.form);">Save</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+</div>
+
diff --git a/admportal/views/partials/router_master.ejs b/admportal/views/partials/router_master.ejs
new file mode 100644
index 00000000..9b731b4d
--- /dev/null
+++ b/admportal/views/partials/router_master.ejs
@@ -0,0 +1,59 @@
+ <div class="modal fade" id="add_router_master" tabindex="-1" role="dialog"
+ aria-labelledby="add_router_master_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Router Master</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/tunnel/addRouterMaster" method="POST">
+ <div class="form-group">
+ <label for="nf_crs_name">*CRS Name</label>
+ <input type="text" class="form-control" name="nf_crs_name" id="nf_crs_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_loopback_ip">Loopback IP</label>
+ <input type="text" class="form-control" name="nf_loopback_ip" id="nf_loopback_ip" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="saveRouterMaster(this.form);">Save</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<div class="modal fade" id="update_router_master" tabindex="-1" role="dialog"
+ aria-labelledby="update_router_master_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Router Master</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/tunnel/updateRouterMaster" method="POST">
+ <div class="form-group">
+ <label for="uf_crs_name">*CRS Name</label>
+ <input type="text" class="form-control" name="uf_crs_name" id="uf_crs_name" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_loopback_ip">Loopback IP</label>
+ <input type="text" class="form-control" name="uf_loopback_ip" id="uf_loopback_ip" maxlength="20" placeholder="varchar(20)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_crs_name" id="uf_key_crs_name">
+ <button type="button" class="btn btn-primary" onclick="saveRouterMaster(this.form);">Save</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
diff --git a/admportal/views/partials/routing_protocol.ejs b/admportal/views/partials/routing_protocol.ejs
new file mode 100644
index 00000000..1bd647fe
--- /dev/null
+++ b/admportal/views/partials/routing_protocol.ejs
@@ -0,0 +1,38 @@
+ <div class="modal fade" id="routing-protocol-modal" tabindex="-1" role="dialog"
+ aria-labelledby="routing-protocol-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">routing-protocol</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="routing_protocol">routing-protocol</label>
+ <input type="text" class="form-control" name="routing_protocol" id="routing_protocol">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#routing-protocol-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/sdnc_request_header_modal.ejs b/admportal/views/partials/sdnc_request_header_modal.ejs
new file mode 100644
index 00000000..08ae1868
--- /dev/null
+++ b/admportal/views/partials/sdnc_request_header_modal.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade"
+ id="sdnc-request-header-modal" tabindex="-1" role="dialog"
+ aria-labelledby="sdnc-request-header-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="sdnc-request-header-modal-label">sdnc-request-header</h4>
+ </div>
+ <div class="modal-body">
+ <form id="sdnc_request_header_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="svc_notification_url">svc-notification-url</label>
+ <input type="text" class="form-control" name="svc_notification_url" id="svc_notification_url">
+ </div>
+ <div class="form-group">
+ <label for="svc_request_id">svc-request-id</label>
+ <input type="text" class="form-control" name="svc_request_id" id="svc_request_id">
+ </div>
+ <div class="form-group">
+ <label for="svc_action">svc-action</label>
+ <input type="text" class="form-control" name="svc_action" id="svc_action">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#service-status-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/sdnfcHeader.ejs b/admportal/views/partials/sdnfcHeader.ejs
new file mode 100644
index 00000000..ba963abb
--- /dev/null
+++ b/admportal/views/partials/sdnfcHeader.ejs
@@ -0,0 +1,61 @@
+<title>SDN-FC AdminPortal</title>
+
+<!-- views/partials/header.ejs -->
+<nav class="navbar navbar-default" role="navigation">
+ <div class="container-fluid">
+
+
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">&nbsp;SDN-FC AdminPortal</a>
+ </div>
+
+ <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups">
+
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn "
+ onclick="location.assign('/sla/listSLA');">SLA</button>
+
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn dropdown-toggle"
+ data-toggle="dropdown" aria-expanded="false" vlanidpool-submenu>Table Management <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="/sdnfc/getTables">View Tables</a></li>
+ <li class="divider"></li>
+ <li><a href="/sdnfc/getVrrCredentials">VRR Credentials</a></li>
+ <li><a href="/sdnfc/getBgpUpdates">BGP Updates</a></li>
+ <li><a href="/sdnfc/getCliUpdates">CLI Updates</a></li>
+ <li class="divider"></li>
+ <li><a href="/admin/getParameters">Parameters</a></li>
+ </ul>
+ </div>
+
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn dropdown-toggle"
+ data-toggle="dropdown"
+ aria-expanded="false">ODL <span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="/odl/getClusterStatus">Get Cluster Status</a></li>
+ </ul>
+ </div>
+
+ <!-- LOGS -->
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn dropdown-toggle"
+ data-toggle="dropdown"
+ aria-expanded="false">Logs <span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="/logs/getUserTrace">User Trace</a></li>
+ <li><a href="/logs/getAccessLog">Access Log</a></li>
+ </ul>
+ </div>
+
+ <button type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/user/listUsers');">User Admin</button>
+ <button type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/logout');">Logout</button>
+ </div>
+ </div>
+ </div>
+
+</nav>
diff --git a/admportal/views/partials/sdnmlcHeader.ejs b/admportal/views/partials/sdnmlcHeader.ejs
new file mode 100644
index 00000000..3dc768ff
--- /dev/null
+++ b/admportal/views/partials/sdnmlcHeader.ejs
@@ -0,0 +1,63 @@
+<title>SDNC-MLC AdminPortal</title>
+
+<!-- views/partials/header.ejs -->
+<nav class="navbar navbar-default" role="navigation">
+ <div class="container-fluid">
+
+
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">&nbsp;SDNC-MLC AdminPortal</a>
+ </div>
+
+ <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups">
+
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn "
+ onclick="location.assign('/sla/listSLA');">SLA</button>
+
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn dropdown-toggle"
+ data-toggle="dropdown" aria-expanded="false" vlanidpool-submenu>Table Management <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="/tunnel/getRouterMaster">Router Master</a></li>
+ <li><a href="/tunnel/getLinkMaster">Link Master</a></li>
+ <li><a href="/tunnel/getRoadmMapping">ROADM Mapping</a></li>
+ <li><a href="/tunnel/getOwbcProperties">OWBC Properties</a></li>
+ <li><a href="/tunnel/getMetroRoadmServiceRequest">Metro ROADM Service Request</a></li>
+ <li><a href="/tunnel/getLinkLatencyMaster">Link Latency Master</a></li>
+ <li><a href="/tunnel/getPartnerProperties">Partner Properties</a></li>
+ <li class="divider"></li>
+ <li><a href="/admin/getParameters">Parameters</a></li>
+ </ul>
+ </div>
+
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn dropdown-toggle"
+ data-toggle="dropdown"
+ aria-expanded="false">ODL <span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="/odl/getClusterStatus">Get Cluster Status</a></li>
+ </ul>
+ </div>
+
+ <!-- LOGS -->
+ <div class="btn-group" role="group">
+ <button type="button" class="btn btn-default navbar-btn dropdown-toggle"
+ data-toggle="dropdown"
+ aria-expanded="false">Logs <span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="/logs/getUserTrace">User Trace</a></li>
+ <li><a href="/logs/getAccessLog">Access Log</a></li>
+ </ul>
+ </div>
+
+ <button type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/user/listUsers');">User Admin</button>
+ <button type="button" class="btn btn-default navbar-btn"
+ onclick="location.assign('/logout');">Logout</button>
+ </div>
+ </div>
+ </div>
+
+</nav>
diff --git a/admportal/views/partials/service_information_modal.ejs b/admportal/views/partials/service_information_modal.ejs
new file mode 100644
index 00000000..7adf4aaf
--- /dev/null
+++ b/admportal/views/partials/service_information_modal.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade"
+ id="service-information-modal" tabindex="-1" role="dialog"
+ aria-labelledby="service-information-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="service-information-modal-label">Service Information</h4>
+ </div>
+ <div class="modal-body">
+ <form id="service_information_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="service_instance_id">service-instance-id</label>
+ <input type="text" class="form-control" name="service_instance_id" id="service_instance_id">
+ </div>
+ <div class="form-group">
+ <label for="subscriber_name">subscriber-name</label>
+ <input type="text" class="form-control" name="subscriber_name" id="subscriber_name">
+ </div>
+ <div class="form-group">
+ <label for="service_type">service-type</label>
+ <input type="text" class="form-control" name="service_type" id="service_type">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#service-status-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/service_manager_credentials.ejs b/admportal/views/partials/service_manager_credentials.ejs
new file mode 100644
index 00000000..655d1767
--- /dev/null
+++ b/admportal/views/partials/service_manager_credentials.ejs
@@ -0,0 +1,65 @@
+<div class="modal fade" id="add_service_manager_credentials" tabindex="-1" role="dialog"
+ aria-labelledby="add_service_manager_credentials_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Service Manager Credentials</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/ucpe/addServiceManagerCredentials" method="POST">
+ <div class="form-group">
+ <label for="nf_service_manager_username">*Service Manager Username</label>
+ <input type="text" class="form-control" maxlength="255" name="nf_service_manager_username" id="nf_service_manager_username" placeholder="varchar(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_service_manager_password">*Service Manager Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_service_manager_password" id="nf_service_manager_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_confirm_service_manager_password">*Confirm Service Manager Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_confirm_service_manager_password" id="nf_confirm_service_manager_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitServiceManagerCredentials(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal fade" id="update_service_manager_credentials" tabindex="-1" role="dialog"
+ aria-labelledby="update_service_manager_credentials_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Service Manager Credentials</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/ucpe/updateServiceManagerCredentials" method="POST">
+ <div class="form-group">
+ <label for="uf_service_manager_username">*Service Manager Username</label>
+ <input type="text" class="form-control" maxlength="255" name="uf_service_manager_username" id="uf_service_manager_username">
+ </div>
+ <div class="form-group">
+ <label for="uf_service_manager_password">*Service Manager Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_service_manager_password" id="uf_service_manager_password">
+ </div>
+ <div class="form-group">
+ <label for="uf_confirm_service_manager_password">*Confirm Service Manager Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_confirm_service_manager_password" id="uf_confirm_service_manager_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submitServiceManagerCredentials(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/service_status_modal.ejs b/admportal/views/partials/service_status_modal.ejs
new file mode 100644
index 00000000..8da4fcb7
--- /dev/null
+++ b/admportal/views/partials/service_status_modal.ejs
@@ -0,0 +1,68 @@
+ <div class="modal fade" id="service-status-modal" tabindex="-1" role="dialog" aria-labelledby="service-status-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="service-status-modal-label">SERVICE-STATUS</h4>
+ </div>
+ <div class="modal-body">
+ <form id="service_status_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="rpc_name">rpc-name</label>
+ <input type="text" class="form-control" name="rpc_name" id="rpc_name">
+ </div>
+ <div class="form-group">
+ <label for="final_indicator">final-indicator</label>
+ <input type="text" class="form-control" name="final_indicator" id="final_indicator">
+ </div>
+ <div class="form-group">
+ <label for="request_status">request-status</label>
+ <input type="text" class="form-control" name="request_status" id="request_status">
+ </div>
+ <div class="form-group">
+ <label for="rpc_action">rpc-action</label>
+ <input type="text" class="form-control" name="rpc_action" id="rpc_action">
+ </div>
+ <div class="form-group">
+ <label for="l3sdn_action">l3sdn-action</label>
+ <input type="text" class="form-control" name="l3sdn_action" id="l3sdn_action">
+ </div>
+ <div class="form-group">
+ <label for="l3sdn_subaction">l3sdn-subaction</label>
+ <input type="text" class="form-control" name="l3sdn_subaction" id="l3sdn_subaction">
+ </div>
+ <div class="form-group">
+ <label for="response_message">response-message</label>
+ <input type="text" class="form-control" name="response_message" id="response_message">
+ </div>
+ <div class="form-group">
+ <label for="response_code">response-code</label>
+ <input type="text" class="form-control" name="response_code" id="response_code">
+ </div>
+ <div class="form-group">
+ <label for="response_timestamp">response-timestamp</label>
+ <input type="text" class="form-control" name="response_timestamp" id="response_timestamp">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#service-status-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/startssl.sh b/admportal/views/partials/startssl.sh
new file mode 100755
index 00000000..a56570e3
--- /dev/null
+++ b/admportal/views/partials/startssl.sh
@@ -0,0 +1,28 @@
+#. ./set-https-env.sh
+#cd ../bin
+#cp ../config/config.json.https ../config/config.json
+export PROJECT_HOME=/opt/openecomp/sdnc
+export PROJECT_RUNTIME_BASE=/opt/openecomp/sdnc
+#export JAVA_HOME=/usr/lib/jvm/java-7-oracle
+export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
+export SSL_ENABLED=false
+export SDNC_CONFIG_DIR=${PROJECT_HOME}/data/properties
+export NODE_ENV=production
+export CLASSPATH=$PROJECT_HOME/admportal/lib:$CLASSPATH
+
+PATH=${PATH}:${JAVA_HOME}/bin
+
+#. ${PROJECT_HOME}/etc/default.env
+
+MAIN_MENU=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py MainMenu | sed -e 's|['\'']||g'`
+export MAIN_MENU
+SSL_ENABLED=`python $PROJECT_HOME/admportal/shell/getAdmPortalProp.py sslEnabled | sed -e 's|['\'']||g'`
+export SSL_ENABLED
+
+cd ..
+node bin/www
+#if [ "true" == "${SSL_ENABLED}" ]; then
+ #pm2 startOrRestart process.https.json
+#else
+ #pm2 startOrRestart process.http.json
+#fi
diff --git a/admportal/views/partials/svc_config_additional_data.ejs b/admportal/views/partials/svc_config_additional_data.ejs
new file mode 100644
index 00000000..14cfd037
--- /dev/null
+++ b/admportal/views/partials/svc_config_additional_data.ejs
@@ -0,0 +1,38 @@
+ <div class="modal fade"
+ id="svc-config-additional-data-modal" tabindex="-1" role="dialog"
+ aria-labelledby="svc-config-additional-data-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">svc-config-additional-data</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="management_ip">management-ip</label>
+ <input type="text" class="form-control" name="management_ip" id="management_ip">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#svc-config-additional-data-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/svc_topology_additional_data_modal.ejs b/admportal/views/partials/svc_topology_additional_data_modal.ejs
new file mode 100644
index 00000000..9117dd93
--- /dev/null
+++ b/admportal/views/partials/svc_topology_additional_data_modal.ejs
@@ -0,0 +1,36 @@
+ <div class="modal fade" id="svc-topology-additional-data-modal" tabindex="-1" role="dialog" aria-labelledby="svc_topology-additional-data-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="svc-topology-additional-data-modal-label">Service Topology Additional Data</h4>
+ </div>
+ <div class="modal-body">
+ <form id="svc_topology_additional_data_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="svc_vnf_type">svc-vnf-type</label>
+ <input type="text" class="form-control" name="svc_vnf_type" id="svc_vnf_type">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#service-status-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/t_provided_v4_lan_public_prefixes.ejs b/admportal/views/partials/t_provided_v4_lan_public_prefixes.ejs
new file mode 100644
index 00000000..d7ced071
--- /dev/null
+++ b/admportal/views/partials/t_provided_v4_lan_public_prefixes.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade" id="t-provided-v4-lan-public-prefixes-modal" tabindex="-1" role="dialog"
+ aria-labelledby="t-provided-v4-lan-public-prefixes-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">t-provided-v4-lan-public-prefixes</h4>
+ </div>
+ <div class="modal-body">
+ <form id="t_provided_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="request_index">request-index</label>
+ <input type="text" class="form-control" name="v4_request_index" id="v4_request_index">
+ </div>
+ <div class="form-group">
+ <label for="v4_lan_public_prefix_length">v4-lan-public-prefix-length</label>
+ <input type="text" class="form-control" name="v4_lan_public_prefix_length" id="v4_lan_public_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="v4_lan_public_prefix">v4-lan-public-prefix</label>
+ <input type="text" class="form-control" name="v4_lan_public_prefix" id="v4_lan_public_prefix">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#t-provided-v4-lan-public-prefixes-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/t_provided_v6_lan_public_prefixes.ejs b/admportal/views/partials/t_provided_v6_lan_public_prefixes.ejs
new file mode 100644
index 00000000..f0443037
--- /dev/null
+++ b/admportal/views/partials/t_provided_v6_lan_public_prefixes.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade" id="t-provided-v6-lan-public-prefixes-modal" tabindex="-1" role="dialog"
+ aria-labelledby="t-provided-v6-lan-public-prefixes-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">t-provided-v6-lan-public-prefixes</h4>
+ </div>
+ <div class="modal-body">
+ <form id="t_provided_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="request_index">request-index</label>
+ <input type="text" class="form-control" name="v6_request_index" id="v6_request_index">
+ </div>
+ <div class="form-group">
+ <label for="v6_lan_public_prefix_length">v6-lan-public-prefix-length</label>
+ <input type="text" class="form-control" name="v6_lan_public_prefix_length" id="v6_lan_public_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="v6_lan_public_prefix">v6-lan-public-prefix</label>
+ <input type="text" class="form-control" name="v6_lan_public_prefix" id="v6_lan_public_prefix">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#t-provided-v6-lan-public-prefixes-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/tcp_port_list.ejs b/admportal/views/partials/tcp_port_list.ejs
new file mode 100644
index 00000000..efb4a430
--- /dev/null
+++ b/admportal/views/partials/tcp_port_list.ejs
@@ -0,0 +1,38 @@
+ <div class="modal fade" id="tcp-port-list-modal" tabindex="-1" role="dialog"
+ aria-labelledby="tcp-port-list-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">tcp-port-list</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="tcp_port_number">port-number</label>
+ <input type="text" class="form-control" name="tcp_port_number" id="tcp_port_number">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#tcp-port-list-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/threshold_alarm.ejs b/admportal/views/partials/threshold_alarm.ejs
new file mode 100644
index 00000000..f1df2ea9
--- /dev/null
+++ b/admportal/views/partials/threshold_alarm.ejs
@@ -0,0 +1,71 @@
+<div class="modal fade" id="add_threshold_alarm" tabindex="-1" role="dialog"
+ aria-labelledby="add_threshold_alarm_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add Threshold Alarm</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/resalloc/addThresholdAlarm" method="POST">
+ <div class="form-group">
+ <label for="nf_resource_rule_id">*Resource Rule ID</label>
+ <input type="text" class="form-control" maxlength="20" name="nf_resource_rule_id" id="nf_resource_rule_id" placeholder="bigint(20)">
+ </div>
+ <div class="form-group">
+ <label for="nf_threshold_expression">*Threshold Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="nf_threshold_expression" id="nf_threshold_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="nf_threshold_message">*Threshold Message</label>
+ <input type="text" class="form-control" maxlength="500" name="nf_threshold_message" id="nf_threshold_message" placeholder="varchar(500)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitThresholdAlarm(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="modal fade" id="update_threshold_alarm" tabindex="-1" role="dialog"
+ aria-labelledby="threshold_alarm_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Threshold Alarm</h4>
+ </div>
+ <div class="modal-body">
+ <form name="updateForm" role="form" action="/resalloc/updateThresholdAlarm" method="POST">
+ <div class="form-group">
+ <label for="uf_resource_threshold_id">*Resource Threshold ID</label>
+ <input readonly type="text" class="form-control" name="uf_resource_threshold_id" id="uf_resource_threshold_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_resource_rule_id">*Resource Rule ID</label>
+ <input type="text" class="form-control" maxlength="20" name="uf_resource_rule_id" id="uf_resource_rule_id" placeholder="bigint(20)">
+ </div>
+ <div class="form-group">
+ <label for="uf_threshold_expression">*Threshold Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_threshold_expression" id="uf_threshold_expression" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <label for="uf_threshold_message">*Threshold Message</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_threshold_message" id="uf_threshold_message" placeholder="varchar(2000)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_resource_threshold_id" id="uf_key_resource_threshold_id">
+ <button type="button" class="btn btn-primary" onclick="submitThresholdAlarm(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/udp_port_list.ejs b/admportal/views/partials/udp_port_list.ejs
new file mode 100644
index 00000000..b4310b2d
--- /dev/null
+++ b/admportal/views/partials/udp_port_list.ejs
@@ -0,0 +1,38 @@
+ <div class="modal fade" id="udp-port-list-modal" tabindex="-1" role="dialog"
+ aria-labelledby="udp-port-list-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">udp-port-list</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="udp_port_number">port-number</label>
+ <input type="text" class="form-control" name="udp_port_number" id="udp_port_number">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#udp-port-list-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/update_aic_avail_zone.ejs b/admportal/views/partials/update_aic_avail_zone.ejs
new file mode 100644
index 00000000..29528a07
--- /dev/null
+++ b/admportal/views/partials/update_aic_avail_zone.ejs
@@ -0,0 +1,54 @@
+ <div class="modal fade" id="update_aic_avail_zone_modal" tabindex="-1" role="dialog"
+ aria-labelledby="update_aic_avail_zone_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update AIC Availability Zone Pool</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/gamma/updateAicAvailZone" method="POST">
+ <div class="form-group">
+ <label for="uf_aic_site_id">AIC Site ID</label>
+ <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_availability_zone">Availability Zone</label>
+ <input type="text" class="form-control" name="uf_availability_zone" id="uf_availability_zone">
+ </div>
+ <div class="form-group">
+ <label for="uf_token">Token</label>
+ <input type="text" class="form-control" name="uf_token" id="uf_token">
+ </div>
+ <div class="form-group">
+ <label for="uf_service_type">Service Type</label>
+ <input type="text" class="form-control" name="uf_service_type" id="uf_service_type">
+ </div>
+ <div class="form-group">
+ <label for="uf_status">Status</label>
+ <input type="text" class="form-control" name="uf_status" id="uf_status">
+ </div>
+ <div class="form-group">
+ <label for="uf_vnf_id">VNF ID</label>
+ <input type="text" class="form-control" name="uf_vnf_id" id="uf_vnf_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_vnf_type">VNF Type</label>
+ <input type="text" class="form-control" name="uf_vnf_type" id="uf_vnf_type">
+ </div>
+ <div class="form-group">
+ <label for="uf_hypervisor">Hypervisor</label>
+ <input type="text" class="form-control" name="uf_hypervisor" id="uf_hypervisor">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id">
+ <input type="hidden" name="uf_key_availability_zone" id="uf_key_availability_zone">
+ <input type="hidden" name="uf_key_token" id="uf_key_token">
+ <button type="submit" class="btn btn-primary">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/update_aic_site.ejs b/admportal/views/partials/update_aic_site.ejs
new file mode 100644
index 00000000..ffff9dcb
--- /dev/null
+++ b/admportal/views/partials/update_aic_site.ejs
@@ -0,0 +1,57 @@
+ <div class="modal fade" id="update_aic_site_modal" tabindex="-1" role="dialog"
+ aria-labelledby="update_aic_site_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update AIC Site</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/gamma/updateAicSite" method="POST">
+ <div class="form-group">
+ <label for="uf_name">Name</label>
+ <input type="text" class="form-control" name="uf_name" id="uf_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_aic_site_id">AIC Site ID</label>
+ <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_vcenter_url">VCenter URL</label>
+ <input type="text" class="form-control" name="uf_vcenter_url" id="uf_vcenter_url">
+ </div>
+ <div class="form-group">
+ <label for="uf_vcenter_username">VCenter User</label>
+ <input type="text" class="form-control" name="uf_vcenter_username" id="uf_vcenter_username">
+ </div>
+ <div class="form-group">
+ <label for="uf_vcenter_passwd">VCenter Password</label>
+ <input type="password" class="form-control" name="uf_vcenter_passwd" id="uf_vcenter_passwd">
+ </div>
+ <div class="form-group">
+ <label for="uf_oam_gateway_addr">OAM Gateway Address</label>
+ <input type="text" class="form-control" name="uf_oam_gateway_addr" id="uf_oam_gateway_addr">
+ </div>
+ <div class="form-group">
+ <label for="uf_city">City</label>
+ <input type="text" class="form-control" name="uf_city" id="uf_city">
+ </div>
+ <div class="form-group">
+ <label for="uf_state">State</label>
+ <input type="text" class="form-control" name="uf_state" id="uf_state">
+ </div>
+ <div class="form-group">
+ <label for="uf_operational_status">Operational Status</label>
+ <input type="text" class="form-control" name="uf_operational_status" id="uf_operational_status">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id">
+ <button type="submit" class="btn btn-primary">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/update_aic_switch.ejs b/admportal/views/partials/update_aic_switch.ejs
new file mode 100644
index 00000000..31f03d52
--- /dev/null
+++ b/admportal/views/partials/update_aic_switch.ejs
@@ -0,0 +1,41 @@
+ <div class="modal fade" id="update_aic_switch_modal" tabindex="-1" role="dialog"
+ aria-labelledby="update_aic_switch_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update AIC Switch</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/gamma/updateAicSwitch" method="POST">
+ <div class="form-group">
+ <label for="uf_physical_network_name">Physical Network Name</label>
+ <input type="text" class="form-control" name="uf_physical_network_name" id="uf_physical_network_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_switch_name">Switch Name</label>
+ <input type="text" class="form-control" name="uf_switch_name" id="uf_switch_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_aic_site_id">AIC Site ID</label>
+ <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_uuid">UUID</label>
+ <input type="text" class="form-control" name="uf_uuid" id="uf_uuid">
+ </div>
+ <div class="form-group">
+ <label for="uf_availability_zone">Availability Zone</label>
+ <input type="text" class="form-control" name="uf_availability_zone" id="uf_availability_zone">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_physical_network_name" id="uf_key_physical_network_name">
+ <button type="submit" class="btn btn-primary">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/update_max_port_speed.ejs b/admportal/views/partials/update_max_port_speed.ejs
new file mode 100644
index 00000000..71c4a422
--- /dev/null
+++ b/admportal/views/partials/update_max_port_speed.ejs
@@ -0,0 +1,45 @@
+ <div class="modal fade" id="update_max_port_speed" tabindex="-1" role="dialog"
+ aria-labelledby="update_max_port_speed_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Max Port Speed</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/resalloc/updateMaxPortSpeed" method="POST">
+ <div class="form-group">
+ <label for="uf_max_port_speed_id">ID</label>
+ <input readonly type="text" class="form-control" name="uf_max_port_speed_id" id="uf_max_port_speed_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_image_file_name">Image File Name</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_image_file_name" id="uf_image_file_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_end_point_position">End Point Position</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_end_point_position" id="uf_end_point_position">
+ </div>
+ <div class="form-group">
+ <label for="uf_interface_name">Interface Name</label>
+ <input type="text" class="form-control" maxlength="100" name="uf_interface_name" id="uf_interface_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_max_speed">Max Speed</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_max_speed" id="uf_max_speed">
+ </div>
+ <div class="form-group">
+ <label for="uf_unit">Unit</label>
+ <input type="text" class="form-control" maxlength="10" name="uf_unit" id="uf_unit">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_max_port_speed_id" id="uf_key_max_port_speed_id">
+ <button type="submit" class="btn btn-primary">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/update_parameter.ejs b/admportal/views/partials/update_parameter.ejs
new file mode 100644
index 00000000..c0ef57d2
--- /dev/null
+++ b/admportal/views/partials/update_parameter.ejs
@@ -0,0 +1,37 @@
+ <div class="modal fade" id="update_parameter" tabindex="-1" role="dialog"
+ aria-labelledby="parameter_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Parameter</h4>
+ </div>
+ <div class="modal-body">
+ <form name="updateForm" role="form" action="/admin/updateParameter" method="POST">
+ <div class="form-group">
+ <label for="uf_name">*Name</label>
+ <input maxlength="100" type="text" class="form-control" name="uf_name" id="uf_name" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="uf_value">*Value</label>
+ <input maxlength="100" type="text" class="form-control" name="uf_value" id="uf_value" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="uf_category">Category</label>
+ <input maxlength="24" type="text" class="form-control" name="uf_category" id="uf_category" placeholder="varchar(24)">
+ </div>
+ <div class="form-group">
+ <label for="uf_memo">Memo</label>
+ <input maxlength="128" type="text" class="form-control" name="uf_memo" id="uf_memo" placeholder="varchar(128)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <input type="hidden" name="uf_key_name" id="uf_key_name">
+ <button type="button" class="btn btn-primary" onclick="submitParam(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/update_resource_rule.ejs b/admportal/views/partials/update_resource_rule.ejs
new file mode 100644
index 00000000..69243b23
--- /dev/null
+++ b/admportal/views/partials/update_resource_rule.ejs
@@ -0,0 +1,57 @@
+ <div class="modal fade" id="update_resource_rule" tabindex="-1" role="dialog"
+ aria-labelledby="update_resource_rule_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Resource Rule</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/resalloc/updateResourceRule" method="POST">
+ <div class="form-group">
+ <label for="uf_resource_rule_id">Rule ID</label>
+ <input readonly type="text" class="form-control" name="uf_resource_rule_id" id="uf_resource_rule_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_resource_name">Name</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_resource_name" id="uf_resource_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_end_point_position">End Point Position</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_end_point_position" id="uf_end_point_position">
+ </div>
+ <div class="form-group">
+ <label for="uf_service_expression">Service Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_service_expression" id="uf_service_expression">
+ </div>
+ <div class="form-group">
+ <label for="uf_equipment_level">Equipment Level</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_equipment_level" id="uf_equipment_level">
+ </div>
+ <div class="form-group">
+ <label for="uf_equipment_expression">Equipment Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_equipment_expression" id="uf_equipment_expression">
+ </div>
+ <div class="form-group">
+ <label for="uf_allocation_expression">Allocation Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_allocation_expression" id="uf_allocation_expression">
+ </div>
+ <div class="form-group">
+ <label for="uf_soft_limit_expression">Soft Limit Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_soft_limit_expression" id="uf_soft_limit_expression">
+ </div>
+ <div class="form-group">
+ <label for="uf_hard_limit_expression">Hard Limit Expression</label>
+ <input type="text" class="form-control" maxlength="2000" name="uf_hard_limit_expression" id="uf_hard_limit_expression">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_resource_rule_id" id="uf_key_resource_rule_id">
+ <button type="submit" class="btn btn-primary">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/update_service_homing.ejs b/admportal/views/partials/update_service_homing.ejs
new file mode 100644
index 00000000..5697168b
--- /dev/null
+++ b/admportal/views/partials/update_service_homing.ejs
@@ -0,0 +1,55 @@
+ <div class="modal fade" id="update_service_homing" tabindex="-1" role="dialog"
+ aria-labelledby="update_service_homing_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update Service Homing</h4>
+ </div>
+ <div class="modal-body">
+ <form name="updateForm" role="form" action="/gamma/updateServiceHoming" method="POST">
+ <div class="form-group">
+ <label for="uf_service_type">*Service Type</label>
+ <input readonly type="text" class="form-control" name="uf_service_type" id="uf_service_type">
+ </div>
+ <div class="form-group">
+ <label for="uf_lata">*LATA</label>
+ <input type="text" class="form-control" name="uf_lata" id="uf_lata" maxlength="12" placeholder="int(3)">
+ </div>
+ <div class="form-group">
+ <label for="uf_hubbing_city_type">*Hubbing City Type</label>
+ <input type="text" class="form-control" name="uf_hubbing_city_type" id="uf_hubbing_city_type" maxlength="40" placeholder="varchar(40)">
+ </div>
+ <div class="form-group">
+ <label for="uf_latitude">Latitude</label>
+ <input type="text" class="form-control" name="uf_latitude" id="uf_latitude" maxlength="24" placeholder="float">
+ </div>
+ <div class="form-group">
+ <label for="uf_longitude">Longitude</label>
+ <input type="text" class="form-control" name="uf_longitude" id="uf_longitude" maxlength="24" placeholder="float">
+ </div>
+ <div class="form-group">
+ <label for="uf_primary_aic_site_name">*Primary Site Name</label>
+ <input type="text" class="form-control" name="uf_primary_aic_site_name" id="uf_primary_aic_site_name" maxlength="100" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="uf_secondary_aic_site_name">Secondary Site Name</label>
+ <input type="text" class="form-control" name="uf_secondary_aic_site_name" id="uf_secondary_aic_site_name" maxlength="100" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <label for="uf_tertiary_aic_site_name">Tertiary Site Name</label>
+ <input type="text" class="form-control" name="uf_tertiary_aic_site_name" id="uf_tertiary_aic_site_name" maxlength="100" placeholder="varchar(100)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_service_type" id="uf_key_service_type">
+ <input type="hidden" name="uf_key_lata" id="uf_key_lata">
+ <input type="hidden" name="uf_key_hubbing_city_type" id="uf_key_hubbing_city_type">
+ <button type="button" class="btn btn-primary" onclick="submitServiceHoming(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/update_vlan_id_pool.ejs b/admportal/views/partials/update_vlan_id_pool.ejs
new file mode 100644
index 00000000..d010672c
--- /dev/null
+++ b/admportal/views/partials/update_vlan_id_pool.ejs
@@ -0,0 +1,51 @@
+ <div class="modal fade" id="update_vlan_id_pool_modal" tabindex="-1" role="dialog"
+ aria-labelledby="update_vlan_id_pool_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update VLAN ID Pool</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/gamma/updateVlanPool" method="POST">
+ <div class="form-group">
+ <label for="uf_aic_site_id">AIC Site ID</label>
+ <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_purpose">Purpose</label>
+ <input type="text" class="form-control" name="uf_purpose" id="uf_purpose">
+ </div>
+ <div class="form-group">
+ <label for="uf_vlan_id">VLAN ID</label>
+ <input type="text" class="form-control" name="uf_vlan_id" id="uf_vlan_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_vplspe_name">VPLSPE Name</label>
+ <input type="text" class="form-control" name="uf_vplspe_name" id="uf_vplspe_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_availability_zone">Availability Zone</label>
+ <input type="text" class="form-control" name="uf_availability_zone" id="uf_availability_zone">
+ </div>
+ <div class="form-group">
+ <label for="uf_status">Status</label>
+ <input type="text" class="form-control" name="uf_status" id="uf_status">
+ </div>
+ <div class="form-group">
+ <label for="uf_svc_instance_id">Svc Instance ID</label>
+ <input type="text" class="form-control" name="uf_svc_instance_id" id="uf_svc_instance_id">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id">
+ <input type="hidden" name="uf_key_purpose" id="uf_key_purpose">
+ <input type="hidden" name="uf_key_vlan_id" id="uf_key_vlan_id">
+ <button type="submit" class="btn btn-primary">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/update_vpe_pool.ejs b/admportal/views/partials/update_vpe_pool.ejs
new file mode 100644
index 00000000..c583590f
--- /dev/null
+++ b/admportal/views/partials/update_vpe_pool.ejs
@@ -0,0 +1,88 @@
+ <div class="modal fade" id="update_vpe_pool_modal" tabindex="-1" role="dialog"
+ aria-labelledby="update_vpe_pool_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update VPE Pool</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/gamma/updateVpePool" method="POST">
+ <div class="form-group">
+ <label for="uf_aic_site_id">AIC Site ID</label>
+ <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_vpe_name">VPE Name</label>
+ <input type="text" class="form-control" name="uf_vpe_name" id="uf_vpe_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_availability_zone">Availability Zone</label>
+ <input type="text" class="form-control" name="uf_availability_zone" id="uf_availability_zone">
+ </div>
+ <div class="form-group">
+ <label for="uf_ipv4_oam_address">IPV4 OAM Address</label>
+ <input type="text" class="form-control" name="uf_ipv4_oam_address" id="uf_ipv4_oam_address">
+ </div>
+ <div class="form-group">
+ <label for="uf_loopback0_ipv4_address">Loopback IPV4 Address</label>
+ <input type="text" class="form-control" name="uf_loopback0_ipv4_address" id="uf_loopback0_ipv4_address">
+ </div>
+ <div class="form-group">
+ <label for="uf_provisioning_status">Provisioning Status</label>
+ <select class="form-control" name="uf_provisioning_status" id="uf_provisioning_status">
+ <option value=PREPROV>PREPROV</option>
+ <option value=NVTPROV>NVTPROV</option>
+ <option value=PROV>PROV</option>
+ <option value=CAPPED>CAPPED</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <label for="uf_vlan_id_outer">VLAN ID Outer</label>
+ <input type="text" class="form-control" name="uf_vlan_id_outer" id="uf_vlan_id_outer">
+ </div>
+ <div class="form-group">
+ <label for="uf_vendor">Vendor</label>
+ <input type="text" class="form-control" name="uf_vendor" id="uf_vendor">
+ </div>
+ <div class="form-group">
+ <label for="uf_physical_intf_name">Interface Name</label>
+ <input type="text" class="form-control" name="uf_physical_intf_name" id="uf_physical_intf_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_physical_intf_speed">Interface Speed</label>
+ <input type="text" class="form-control" name="uf_physical_intf_speed" id="uf_physical_intf_speed">
+ </div>
+ <div class="form-group">
+ <label for="uf_physical_intf_units">Interface Units</label>
+ <input type="text" class="form-control" name="uf_physical_intf_units" id="uf_physical_intf_units">
+ </div>
+ <div class="form-group">
+ <label for="uf_vpe_uuid">VPE UUID</label>
+ <input type="text" class="form-control" name="uf_vpe_uuid" id="uf_vpe_uuid">
+ </div>
+ <div class="form-group">
+ <label for="uf_as_number">AS_NUMBER</label>
+ <input type="text" class="form-control" name="uf_as_number" id="uf_as_number">
+ </div>
+ <div class="form-group">
+ <label for="uf_vpe_id">VPE ID</label>
+ <input type="text" class="form-control" name="uf_vpe_id" id="uf_vpe_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_image_filename">Image Filename</label>
+ <input type="text" class="form-control" name="uf_image_filename" id="uf_image_filename">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_key_vpe_name" id="uf_key_vpe_name">
+ <input type="hidden" name="uf_key_availability_zone" id="uf_key_availability_zone">
+ <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="submit" class="btn btn-primary">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/update_vplspe_pool.ejs b/admportal/views/partials/update_vplspe_pool.ejs
new file mode 100644
index 00000000..eb930522
--- /dev/null
+++ b/admportal/views/partials/update_vplspe_pool.ejs
@@ -0,0 +1,72 @@
+ <div class="modal fade" id="update_vplspe_pool_modal" tabindex="-1" role="dialog"
+ aria-labelledby="update_vplspe_pool_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update VPLSPE Pool</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/gamma/updateVplspePool" method="POST">
+ <div class="form-group">
+ <label for="uf_vplspe_name">VPLSPE Name</label>
+ <input type="text" class="form-control" name="uf_vplspe_name" id="uf_vplspe_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_aic_site_id">AIC Site ID</label>
+ <input type="text" class="form-control" name="uf_aic_site_id" id="uf_aic_site_id">
+ </div>
+ <div class="form-group">
+ <label for="uf_availability_zone">Availability Zone</label>
+ <input type="text" class="form-control" name="uf_availability_zone" id="uf_availability_zone">
+ </div>
+ <div class="form-group">
+ <label for="uf_physical_intf_name">Interface Name</label>
+ <input type="text" class="form-control" name="uf_physical_intf_name" id="uf_physical_intf_name">
+ </div>
+ <div class="form-group">
+ <label for="uf_physical_intf_speed">Interface Speed</label>
+ <input type="text" class="form-control" name="uf_physical_intf_speed" id="uf_physical_intf_speed">
+ </div>
+ <div class="form-group">
+ <label for="uf_physical_intf_units">Interface Units</label>
+ <input type="text" class="form-control" name="uf_physical_intf_units" id="uf_physical_intf_units">
+ </div>
+ <div class="form-group">
+ <label for="uf_loopback0_ipv4_address">Loopback IPV4 Address</label>
+ <input type="text" class="form-control" name="uf_loopback0_ipv4_address" id="uf_loopback0_ipv4_address">
+ </div>
+ <div class="form-group">
+ <label for="uf_vlan_id_outer">VLAN ID Outer</label>
+ <input type="text" class="form-control" name="uf_vlan_id_outer" id="uf_vlan_id_outer">
+ </div>
+ <div class="form-group">
+ <label for="uf_vplspe_uuid">VPLSPE UUID</label>
+ <input type="text" class="form-control" name="uf_vplspe_uuid" id="uf_vplspe_uuid">
+ </div>
+ <div class="form-group">
+ <label for="uf_image_filename">Image Filename</label>
+ <input type="text" class="form-control" name="uf_image_filename" id="uf_image_filename">
+ </div>
+ <div class="form-group">
+ <label for="uf_provisioning_status">Provisioning Status</label>
+ <input type="text" class="form-control" name="uf_provisioning_status" id="uf_provisioning_status">
+ </div>
+ <div class="form-group">
+ <label for="uf_vendor">Vendor</label>
+ <input type="text" class="form-control" name="uf_vendor" id="uf_vendor">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_key_availability_zone" id="uf_key_availability_zone">
+ <input type="hidden" name="uf_key_physical_intf_name" id="uf_key_physical_intf_name">
+ <input type="hidden" name="uf_key_vplspe_name" id="uf_key_vplspe_name">
+ <input type="hidden" name="uf_key_aic_site_id" id="uf_key_aic_site_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="submit" class="btn btn-primary">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/userform.ejs b/admportal/views/partials/userform.ejs
new file mode 100644
index 00000000..fae52ad2
--- /dev/null
+++ b/admportal/views/partials/userform.ejs
@@ -0,0 +1,41 @@
+ <div class="modal fade" id="myUserModal" tabindex="-1" role="dialog" aria-labelledby="myUserModalLabel" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="myUserModalLabel">Update User</h4>
+ </div>
+ <div class="modal-body">
+ <form id="updateForm" name="updateForm" role="form" action="/user/updateUser" method="POST">
+ <div class="form-group">
+ <label for="uf_email">attuid</label>
+ <input type="email" class="form-control" name="uf_email" id="uf_email">
+ </div>
+ <div class="form-group">
+ <label for="uf_password">Password</label>
+ <input type="password" class="form-control" name="uf_password" id="uf_password">
+ </div>
+ <div class="form-group">
+ <label for="uf_confirm_password">Confirm Password</label>
+ <input type="password" class="form-control" name="uf_confirm_password" id="uf_confirm_password">
+ </div>
+ <div class="form-group">
+ <label for="privilege">Privilege</label>
+ <select class="form-control" name="uf_privilege" id="uf_privilege">
+ <option value=admin>Administrator</option>
+ <option value=readonly>Readonly</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_email" id="uf_key_email">
+ <button type="button" class="btn btn-primary" onclick="submitUserAdmin(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
diff --git a/admportal/views/partials/v4_dhcp_pools.ejs b/admportal/views/partials/v4_dhcp_pools.ejs
new file mode 100644
index 00000000..5a67aeb1
--- /dev/null
+++ b/admportal/views/partials/v4_dhcp_pools.ejs
@@ -0,0 +1,50 @@
+ <div class="modal fade" id="v4-dhcp-pools-modal" tabindex="-1" role="dialog"
+ aria-labelledby="v4-dhcp-pools-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">dhcp</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="v4_dhcp_relay_next_hop_address">v4-dhcp-relay-next-hop-address</label>
+ <input type="text" class="form-control" name="v4_dhcp_relay_next_hop_address" id="v4_dhcp_relay_next_hop_address">
+ </div>
+ <div class="form-group">
+ <label for="v4_dhcp_pool_prefix">v4-dhcp-pool-prefix</label>
+ <input type="text" class="form-control" name="v4_dhcp_pool_prefix" id="v4_dhcp_pool_prefix">
+ </div>
+ <div class="form-group">
+ <label for="v4_dhcp_pool_prefix_length">v4-dhcp-pool-prefix-length</label>
+ <input type="text" class="form-control" name="v4_dhcp_pool_prefix_length" id="v4_dhcp_pool_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="v4_dhcp_relay_gateway_address">v4-dhcp-relay-gateway-address</label>
+ <input type="text" class="form-control" name="v4_dhcp_relay_gateway_address" id="v4_dhcp_relay_gateway_address">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#v4-dhcp-pools-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/v4_firewall_packet_filters.ejs b/admportal/views/partials/v4_firewall_packet_filters.ejs
new file mode 100644
index 00000000..0b091d15
--- /dev/null
+++ b/admportal/views/partials/v4_firewall_packet_filters.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade" id="v4-firewall-packet-filters-modal" tabindex="-1" role="dialog"
+ aria-labelledby="v4-firewall-packet-filters-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">v4-firewall-packet-filters</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="v4_firewall_prefix">v4-firewall-prefix</label>
+ <input type="text" class="form-control" name="v4_firewall_prefix" id="v4_firewall_prefix">
+ </div>
+ <div class="form-group">
+ <label for="v4_firewall_prefix_length">v4-firewall-prefix-length</label>
+ <input type="text" class="form-control" name="v4_firewall_prefix_length" id="v4_firewall_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="v4_allow_icmp_ping">allow-icmp-ping</label>
+ <input type="text" class="form-control" name="v4_allow_icmp_ping" id="v4_allow_icmp_ping">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#v4-firewall-packet-filters-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/v4_nat_mapping_entries.ejs b/admportal/views/partials/v4_nat_mapping_entries.ejs
new file mode 100644
index 00000000..ef80022f
--- /dev/null
+++ b/admportal/views/partials/v4_nat_mapping_entries.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade" id="v4-nat-mapping-entries-modal" tabindex="-1" role="dialog"
+ aria-labelledby="v4-nat-mapping-entries-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">v4-nat-mapping-entries</h4>
+ </div>
+ <div class="modal-body">
+ <form id="v4_nat_mapping_entries_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="v4_nat_external">v4-nat-external</label>
+ <input type="text" class="form-control" name="v4_nat_external" id="v4_nat_external">
+ </div>
+ <div class="form-group">
+ <label for="v4_nat_next_hop_address">v4-nat-next-hop-address</label>
+ <input type="text" class="form-control" name="v4_nat_next_hop_address" id="v4_nat_next_hop_address">
+ </div>
+ <div class="form-group">
+ <label for="v4_nat_internal">v4-nat-internal</label>
+ <input type="text" class="form-control" name="v4_nat_internal" id="v4_nat_internal">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#v4-nat-mapping-entries-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/v4_static_routes.ejs b/admportal/views/partials/v4_static_routes.ejs
new file mode 100644
index 00000000..0474dd33
--- /dev/null
+++ b/admportal/views/partials/v4_static_routes.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade" id="v4-static-routes-modal" tabindex="-1" role="dialog"
+ aria-labelledby="v4-static-routes-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">v4-static-routes</h4>
+ </div>
+ <div class="modal-body">
+ <form id="v4_static_route_prefix_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="v4_static_route_prefix">v4-static-route-prefix</label>
+ <input type="text" class="form-control" name="v4_static_route_prefix" id="v4_static_route_prefix">
+ </div>
+ <div class="form-group">
+ <label for="v4_static_route_prefix_length">v4-static-route-prefix-length</label>
+ <input type="text" class="form-control" name="v4_static_route_prefix_length" id="v4_static_route_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="static_v4_next_hop_address">v4-next-hop-address</label>
+ <input type="text" class="form-control" name="static_v4_next_hop_address" id="static_v4_next_hop_address">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#v4-static-routes-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/v6_dhcp_pools.ejs b/admportal/views/partials/v6_dhcp_pools.ejs
new file mode 100644
index 00000000..7dc54abe
--- /dev/null
+++ b/admportal/views/partials/v6_dhcp_pools.ejs
@@ -0,0 +1,50 @@
+ <div class="modal fade" id="v6-dhcp-pools-modal" tabindex="-1" role="dialog"
+ aria-labelledby="v6-dhcp-pools-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">v6-dhcp-pools</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="v6_dhcp_relay_next_hop_address">v6-dhcp-relay-next-hop-address</label>
+ <input type="text" class="form-control" name="v6_dhcp_relay_next_hop_address" id="v6_dhcp_relay_next_hop_address">
+ </div>
+ <div class="form-group">
+ <label for="v6_dhcp_pool_prefix">v6-dhcp-pool-prefix</label>
+ <input type="text" class="form-control" name="v6_dhcp_pool_prefix" id="v6_dhcp_pool_prefix">
+ </div>
+ <div class="form-group">
+ <label for="v6_dhcp_pool_prefix_length">v6-dhcp-pool-prefix-length</label>
+ <input type="text" class="form-control" name="v6_dhcp_pool_prefix_length" id="v6_dhcp_pool_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="v6_dhcp_relay_gateway_address">v6-dhcp-relay-gateway-address</label>
+ <input type="text" class="form-control" name="v6_dhcp_relay_gateway_address" id="v6_dhcp_relay_gateway_address">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#v6-dhcp-pools-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/v6_firewall_packet_filters.ejs b/admportal/views/partials/v6_firewall_packet_filters.ejs
new file mode 100644
index 00000000..09e2e3d5
--- /dev/null
+++ b/admportal/views/partials/v6_firewall_packet_filters.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade" id="v6-firewall-packet-filters-modal" tabindex="-1" role="dialog"
+ aria-labelledby="v6-firewall-packet-filters-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">v6-firewall-packet-filters</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="v6_firewall_prefix">v6-firewall-prefix</label>
+ <input type="text" class="form-control" name="v6_firewall_prefix" id="v6_firewall_prefix">
+ </div>
+ <div class="form-group">
+ <label for="v6_firewall_prefix_length">v6-firewall-prefix-length</label>
+ <input type="text" class="form-control" name="v6_firewall_prefix_length" id="v6_firewall_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="v6_allow_icmp_ping">allow-icmp-ping</label>
+ <input type="text" class="form-control" name="v6_allow_icmp_ping" id="v6_allow_icmp_ping">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#v6-firewall-packet-filters-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/v6_static_routes.ejs b/admportal/views/partials/v6_static_routes.ejs
new file mode 100644
index 00000000..bea721df
--- /dev/null
+++ b/admportal/views/partials/v6_static_routes.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade" id="v6-static-routes-modal" tabindex="-1" role="dialog"
+ aria-labelledby="v6-static-routes-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">v6-static-routes</h4>
+ </div>
+ <div class="modal-body">
+ <form id="v6_static_route_prefix_form" role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="v6_static_route_prefix">v6-static-route-prefix</label>
+ <input type="text" class="form-control" name="v6_static_route_prefix" id="v6_static_route_prefix">
+ </div>
+ <div class="form-group">
+ <label for="v6_static_route_prefix_length">v6-static-route-prefix-length</label>
+ <input type="text" class="form-control" name="v6_static_route_prefix_length" id="v6_static_route_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="static_v6_next_hop_address">v6-next-hop-address</label>
+ <input type="text" class="form-control" name="static_v6_next_hop_address" id="static_v6_next_hop_address">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#v6-static-routes-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/vlan.ejs b/admportal/views/partials/vlan.ejs
new file mode 100644
index 00000000..99cb8022
--- /dev/null
+++ b/admportal/views/partials/vlan.ejs
@@ -0,0 +1,46 @@
+ <div class="modal fade"
+ id="vlan-modal" tabindex="-1" role="dialog"
+ aria-labelledby="vlan-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">vlan</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="vlan_interface">vlan-interface</label>
+ <input type="text" class="form-control" name="vlan_interface" id="vlan_interface">
+ </div>
+ <div class="form-group">
+ <label for="vlan_id_inner">vlan-id-inner</label>
+ <input type="text" class="form-control" name="vlan_id_inner" id="vlan_id_inner">
+ </div>
+ <div class="form-group">
+ <label for="vlan_id_outer">vlan-id-outer</label>
+ <input type="text" class="form-control" name="vlan_id_outer" id="vlan_id_outer">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#vlan-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/vm_networks.ejs b/admportal/views/partials/vm_networks.ejs
new file mode 100644
index 00000000..f0f73378
--- /dev/null
+++ b/admportal/views/partials/vm_networks.ejs
@@ -0,0 +1,57 @@
+ <div class="modal fade" id="add_vm_network" tabindex="-1" role="dialog"
+ aria-labelledby="add_vm_network" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add VM Network</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/mobility/addVmNetwork" method="POST">
+ <div class="form-group">
+ <label for="nf_vnf_type">*VNF Type</label>
+ <input type="text" class="form-control" name="nf_vnf_type" id="nf_vnf_type" maxlength="200" placeholder="varchar(200)">
+ </div>
+ <div class="form-group">
+ <label for="nf_vm_type">*VM Type</label>
+ <input type="text" class="form-control" name="nf_vm_type" id="nf_vm_type" maxlength="45" placeholder="varchar(45)">
+ </div>
+ <div class="form-group">
+ <label for="nf_network_role">*NETWORK ROLE</label>
+ <input maxlength="45" type="text" class="form-control" name="nf_network_role" id="nf_network_role" placeholder="varchar(45)">
+ </div>
+ <div class="form-group">
+ <label for="nf_ip_count">IP COUNT</label>
+ <input maxlength="3" type="text" class="form-control" name="nf_ip_count" id="nf_ip_count" placeholder="int(11)">
+ </div>
+ <div class="form-group">
+ <label for="nf_assign_ips">ASSIGN IPS</label>
+ <select class="form-control" name="nf_assign_ips" id="nf_assign_ips">
+ <option>true</option>
+ <option>false</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <label for="nf_assign_macs">ASSIGN MACS</label>
+ <select class="form-control" name="nf_assign_macs" id="nf_assign_macs">
+ <option>true</option>
+ <option>false</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <label for="nf_assign_floating_ip">ASSIGN FLOATING IP</label>
+ <select class="form-control" name="nf_assign_floating_ip" id="nf_assign_floating_ip">
+ <option>true</option>
+ <option>false</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="addVmNetwork(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/vm_profile.ejs b/admportal/views/partials/vm_profile.ejs
new file mode 100644
index 00000000..5c437e9e
--- /dev/null
+++ b/admportal/views/partials/vm_profile.ejs
@@ -0,0 +1,32 @@
+ <div class="modal fade" id="add_vm_profile" tabindex="-1" role="dialog"
+ aria-labelledby="add_vm_profile" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add VM Profile</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/mobility/addVmProfile" method="POST">
+ <div class="form-group">
+ <label for="nf_vnf_type">*VNF Type</label>
+ <input type="text" class="form-control" name="nf_vnf_type" id="nf_vnf_type" maxlength="200" placeholder="varchar(200)">
+ </div>
+ <div class="form-group">
+ <label for="nf_vm_type">*VM Type</label>
+ <input type="text" class="form-control" name="nf_vm_type" id="nf_vm_type" maxlength="45" placeholder="varchar(45)">
+ </div>
+ <div class="form-group">
+ <label for="nf_vm_count">VM Count</label>
+ <input type="text" class="form-control" name="nf_vm_count" id="nf_vm_count" maxlength="11" placeholder="int(11)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="addVmProfile(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/vnf_network.ejs b/admportal/views/partials/vnf_network.ejs
new file mode 100644
index 00000000..47580dc0
--- /dev/null
+++ b/admportal/views/partials/vnf_network.ejs
@@ -0,0 +1,28 @@
+ <div class="modal fade" id="add_vnf_network" tabindex="-1" role="dialog"
+ aria-labelledby="add_vnf_network" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add VNF Network</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/mobility/addVnfNetwork" method="POST">
+ <div class="form-group">
+ <label for="nf_vnf_type">*VNF Type</label>
+ <input type="text" class="form-control" name="nf_vnf_type" id="nf_vnf_type" maxlength="200" placeholder="varchar(200)">
+ </div>
+ <div class="form-group">
+ <label for="nf_network_role">*Network Role</label>
+ <input type="text" class="form-control" name="nf_network_role" id="nf_network_role" maxlength="45" placeholder="varchar(45)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="addVnfNetwork(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/vnf_profile.ejs b/admportal/views/partials/vnf_profile.ejs
new file mode 100644
index 00000000..d67cf1a6
--- /dev/null
+++ b/admportal/views/partials/vnf_profile.ejs
@@ -0,0 +1,32 @@
+ <div class="modal fade" id="add_vnf_profile" tabindex="-1" role="dialog"
+ aria-labelledby="add_vnf_profile" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add VNF Profile</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/mobility/addVnfProfile" method="POST">
+ <div class="form-group">
+ <label for="nf_vnf_type">*VNF Type</label>
+ <input type="text" class="form-control" name="nf_vnf_type" id="nf_vnf_type" maxlength="200" placeholder="varchar(200)">
+ </div>
+ <div class="form-group">
+ <label for="nf_availability_zone_count">Availability Zone Count</label>
+ <input type="text" class="form-control" name="nf_availability_zone_count" id="nf_availability_zone_count" maxlength="11" placeholder="int(11)">
+ </div>
+ <div class="form-group">
+ <label for="nf_equipment_role">Equipment Role</label>
+ <input type="text" class="form-control" name="nf_equipment_role" id="nf_equipment_role" maxlength="11" placeholder="varchar(80)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="addVnfProfile(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/partials/vnf_vm_information.ejs b/admportal/views/partials/vnf_vm_information.ejs
new file mode 100644
index 00000000..fb9af735
--- /dev/null
+++ b/admportal/views/partials/vnf_vm_information.ejs
@@ -0,0 +1,42 @@
+ <div class="modal fade"
+ id="vnf-vm-information-modal" tabindex="-1" role="dialog"
+ aria-labelledby="vnf-vm-information-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">vnf-vm-information</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="" method="POST">
+ <div class="form-group">
+ <label for="vserver_type">vserver-type</label>
+ <input type="text" class="form-control" name="vserver_type" id="vserver_type">
+ </div>
+ <div class="form-group">
+ <label for="vserver_name">vserver-name</label>
+ <input type="text" class="form-control" name="vserver_name" id="vserver_name">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#vnf-vm-information-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/vr_lan_interface.ejs b/admportal/views/partials/vr_lan_interface.ejs
new file mode 100644
index 00000000..45f7ec13
--- /dev/null
+++ b/admportal/views/partials/vr_lan_interface.ejs
@@ -0,0 +1,66 @@
+ <div class="modal fade" id="vr-lan-interface-modal" tabindex="-1" role="dialog"
+ aria-labelledby="vr-lan-interface-modal-label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">VR-LAN-INTERFACE</h4>
+ </div>
+ <div class="modal-body">
+ <form id="vr_lan_interface_form" role="form" action="/odl/update_vr_lan_interface" method="POST">
+ <div class="form-group">
+ <label for="vr_designation">vr-designation</label>
+ <input type="text" class="form-control" name="vr_designation" id="vr_designation">
+ </div>
+ <div class="form-group">
+ <label for="v6_vr_lan_prefix">v6-vr-lan-prefix</label>
+ <input type="text" class="form-control" name="v6_vr_lan_prefix" id="v6_vr_lan_prefix">
+ </div>
+ <div class="form-group">
+ <label for="v6_vr_lan_prefix_length">v6-vr-lan-prefix-length</label>
+ <input type="text" class="form-control" name="v6_vr_lan_prefix_length" id="v6_vr_lan_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="v6_vce_wan_address">v6-vce-wan-address</label>
+ <input type="text" class="form-control" name="v6_vce_wan_address" id="v6_vce_wan_address">
+ </div>
+ <div class="form-group">
+ <label for="v4_vr_lan_prefix">v4-vr-lan-prefix</label>
+ <input type="text" class="form-control" name="v4_vr_lan_prefix" id="v4_vr_lan_prefix">
+ </div>
+ <div class="form-group">
+ <label for="v4_vr_lan_prefix_length">v4-vr-lan-prefix-length</label>
+ <input type="text" class="form-control" name="v4_vr_lan_prefix_length" id="v4_vr_lan_prefix_length">
+ </div>
+ <div class="form-group">
+ <label for="t_defaulted_v6_vrlan">t-defaulted-v6-vrlan</label>
+ <input type="text" class="form-control" name="t_defaulted_v6_vrlan" id="t_defaulted_v6_vrlan">
+ </div>
+ <div class="form-group">
+ <label for="v4_vce_loopback_address">v4-vce-loopback-address</label>
+ <input type="text" class="form-control" name="v4_vce_loopback_address" id="v4_vce_loopback_address">
+ </div>
+
+<!--
+ <div class="form-group">
+ <input type="hidden" name="svc_instance_id" id="svc_instance_id">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <button type="button" class="btn btn-primary" onclick="submit(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+-->
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+function submit(form){
+ $('#vr-lan-interface-modal').modal('hide');
+ form.action = form.uf_action.value;
+ form.submit();
+ return;
+}
+</script>
+
diff --git a/admportal/views/partials/vrr_credentials.ejs b/admportal/views/partials/vrr_credentials.ejs
new file mode 100644
index 00000000..620176da
--- /dev/null
+++ b/admportal/views/partials/vrr_credentials.ejs
@@ -0,0 +1,82 @@
+<div class="modal fade" id="add_vrr_credentials" tabindex="-1" role="dialog"
+ aria-labelledby="add_vrr_credentials_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Add VRR Credentials</h4>
+ </div>
+ <div class="modal-body">
+ <form name="addForm" role="form" action="/sdnfc/addVrrCredentials" method="POST">
+ <div class="form-group">
+ <label for="nf_server_name">*Server Name</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_server_name" id="nf_server_name" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="nf_ip_address">*IP Address</label>
+ <input type="text" class="form-control" maxlength="15" name="nf_ip_address" id="nf_ip_address" placeholder="varchar(15)">
+ </div>
+ <div class="form-group">
+ <label for="nf_username">*Username</label>
+ <input type="text" class="form-control" maxlength="50" name="nf_username" id="nf_username" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="nf_password">*Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_password" id="nf_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <label for="nf_confirm_password">*Confirm Password</label>
+ <input type="password" class="form-control" maxlength="255" name="nf_confirm_password" id="nf_confirm_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="nf_action" id="nf_action">
+ <button type="button" class="btn btn-primary" onclick="submitVrrCredentials(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="modal fade" id="update_vrr_credentials" tabindex="-1" role="dialog"
+ aria-labelledby="update_vrr_credentials_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title">Update VRR Credentials</h4>
+ </div>
+ <div class="modal-body">
+ <form role="form" action="/sdnfc/updateVrrCredentials" method="POST">
+ <div class="form-group">
+ <label for="uf_server_name">*Server Name</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_server_name" id="uf_server_name" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="uf_ip_address">*IP Address</label>
+ <input type="text" class="form-control" maxlength="15" name="uf_ip_address" id="uf_ip_address" placeholder="varchar(15)">
+ </div>
+ <div class="form-group">
+ <label for="uf_username">*Username</label>
+ <input type="text" class="form-control" maxlength="50" name="uf_username" id="uf_username" placeholder="varchar(50)">
+ </div>
+ <div class="form-group">
+ <label for="uf_password">*Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_password" id="uf_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <label for="uf_confirm_password">*Confirm Password</label>
+ <input type="password" class="form-control" maxlength="255" name="uf_confirm_password" id="uf_confirm_password" placeholder="varbinary(255)">
+ </div>
+ <div class="form-group">
+ <input type="hidden" name="uf_action" id="uf_action">
+ <input type="hidden" name="uf_key_server_name" id="uf_key_server_name">
+ <button type="button" class="btn btn-primary" onclick="submitVrrCredentials(this.form);">Submit</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
diff --git a/admportal/views/resalloc/max_port_speed.ejs b/admportal/views/resalloc/max_port_speed.ejs
new file mode 100644
index 00000000..b46b14d9
--- /dev/null
+++ b/admportal/views/resalloc/max_port_speed.ejs
@@ -0,0 +1,205 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#max_port_speed').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Max Port Speed</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_max_port_speed">
+ Add Max Port Speed
+ </button>
+ </div>
+ <% } %>
+
+ <table id="max_port_speed" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*ID</th>
+ <th>*Image File Name</th>
+ <th>*End Point Position</th>
+ <th>*Interface Name</th>
+ <th>*Max Speed</th>
+ <th>*Unit</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.max_port_speed_id %></td>
+ <td><%= row.image_file_name %></td>
+ <td><%= row.end_point_position %></td>
+ <td><%= row.interface_name %></td>
+ <td><%= row.max_speed %></td>
+ <td><%= row.unit %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateMaxPortSpeed('<%=row.max_port_speed_id %>','<%= row.image_file_name %>','<%= row.end_point_position %>','<%= row.interface_name %>','<%= row.max_speed %>','<%= row.unit %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteMaxPortSpeed('<%= row.max_port_speed_id %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<% include ../partials/max_port_speed %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitMaxPortSpeed(form)
+{
+ var errorMsg='';
+ var image_file_name = '';
+ var end_point_position = '';
+ var interface_name = '';
+ var max_speed = '';
+ var unit = '';
+
+ if ( form.name == 'addForm' )
+ {
+ image_file_name = form.nf_image_file_name;
+ end_point_position = form.nf_end_point_position;
+ interface_name = form.nf_interface_name;
+ max_speed = form.nf_max_speed;
+ unit = form.nf_unit;
+ }
+ else
+ {
+ image_file_name = form.uf_image_file_name;
+ end_point_position = form.uf_end_point_position;
+ interface_name = form.uf_interface_name;
+ max_speed = form.uf_max_speed;
+ unit = form.uf_unit;
+ }
+
+
+ if ( (image_file_name.value == null) || (image_file_name.value == "") || isblank(image_file_name.value) )
+ {
+ errorMsg += 'Image File Name is required.<br>';
+ }
+ if ( (end_point_position.value == null) || (end_point_position.value == "") || isblank(end_point_position.value) )
+ {
+ errorMsg += 'End Point Position is required.<br>';
+ }
+ if ( (interface_name.value == null) || (interface_name.value == "") || isblank(interface_name.value) ){
+ errorMsg += 'Interface Name is required.<br>';
+ }
+ if ( (max_speed.value == null) || (max_speed.value == "") || isblank(max_speed.value) ){
+ errorMsg += 'Max Speed is required.<br>';
+ }
+ if ( (unit.value == null) || (unit.value == "") || isblank(unit.value) ){
+ errorMsg += 'Unit is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+
+ if ( !isDigit(max_speed.value) )
+ {
+ bootbox.alert('Max Speed must be a number.');
+ return;
+ }
+
+ form.submit();
+}
+
+function updateMaxPortSpeed(max_port_speed_id,image_file_name,end_point_position,interface_name,max_speed,unit) {
+
+ document.getElementById('uf_max_port_speed_id').value=max_port_speed_id;
+ document.getElementById('uf_image_file_name').value=image_file_name;
+ document.getElementById('uf_end_point_position').value=end_point_position;
+ document.getElementById('uf_interface_name').value=interface_name;
+ document.getElementById('uf_max_speed').value=max_speed;
+ document.getElementById('uf_unit').value=unit;
+
+ document.getElementById('uf_key_max_port_speed_id').value=max_port_speed_id;
+
+ $('#update_max_port_speed').modal('show');
+}
+
+function deleteMaxPortSpeed(max_port_speed_id) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete MAX_PORT_SPEED [" + max_port_speed_id + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/resalloc/deleteMaxPortSpeed?max_port_speed_id=" + max_port_speed_id);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/resalloc/max_server_speed.ejs b/admportal/views/resalloc/max_server_speed.ejs
new file mode 100644
index 00000000..c0848df8
--- /dev/null
+++ b/admportal/views/resalloc/max_server_speed.ejs
@@ -0,0 +1,207 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#max_server_speed').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Max Server Speed</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_max_server_speed">
+ Add Max Server Speed
+ </button>
+ </div>
+ <% } %>
+
+ <table id="max_server_speed" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*ID</th>
+ <th>*Server Model</th>
+ <th>*EVC Count</th>
+ <th>*Max Speed</th>
+ <th>*Unit</th>
+ <th>Description</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.max_server_speed_id %></td>
+ <td><%= row.server_model %></td>
+ <td><%= row.evc_count %></td>
+ <td><%= row.max_speed %></td>
+ <td><%= row.unit %></td>
+ <td><%= row.description %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateMaxServerSpeed('<%=row.max_server_speed_id %>','<%= row.server_model %>','<%= row.evc_count %>','<%= row.max_speed %>','<%= row.unit %>', '<%= row.description %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteMaxServerSpeed('<%= row.max_server_speed_id %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<% include ../partials/max_server_speed %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitMaxServerSpeed(form)
+{
+ var errorMsg='';
+ var server_model = '';
+ var evc_count = '';
+ var max_speed = '';
+ var unit = '';
+ var description = '';
+
+ if ( form.name == 'addForm' )
+ {
+ server_model = form.nf_server_model;
+ evc_count = form.nf_evc_count;
+ max_speed = form.nf_max_speed;
+ unit = form.nf_unit;
+ description = form.nf_description;
+ }
+ else
+ {
+ server_model = form.uf_server_model;
+ evc_count = form.uf_evc_count;
+ max_speed = form.uf_max_speed;
+ unit = form.uf_unit;
+ description = form.uf_description;
+ }
+
+
+ if ( (server_model.value == null) || (server_model.value == "") || isblank(server_model.value) )
+ {
+ errorMsg += 'Server Model is required.<br>';
+ }
+ if ( (evc_count.value == null) || (evc_count.value == "") || isblank(evc_count.value) )
+ {
+ errorMsg += 'EVC Count is required.<br>';
+ }
+ if ( (max_speed.value == null) || (max_speed.value == "") || isblank(max_speed.value) ){
+ errorMsg += 'Max Speed is required.<br>';
+ }
+ if ( (unit.value == null) || (unit.value == "") || isblank(unit.value) ){
+ errorMsg += 'Unit is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+
+ if ( !isDigit(evc_count.value) )
+ {
+ bootbox.alert('EVC Count must be a number.');
+ return;
+ }
+ if ( !isDigit(max_speed.value) )
+ {
+ bootbox.alert('Max Speed must be a number.');
+ return;
+ }
+
+ form.submit();
+}
+
+function updateMaxServerSpeed(max_server_speed_id,server_model,evc_count,max_speed,unit,description) {
+
+ document.getElementById('uf_max_server_speed_id').value=max_server_speed_id;
+ document.getElementById('uf_server_model').value=server_model;
+ document.getElementById('uf_evc_count').value=evc_count;
+ document.getElementById('uf_max_speed').value=max_speed;
+ document.getElementById('uf_unit').value=unit;
+ document.getElementById('uf_description').value=description;
+
+ document.getElementById('uf_key_max_server_speed_id').value=max_server_speed_id;
+
+ $('#update_max_server_speed').modal('show');
+}
+
+function deleteMaxServerSpeed(max_server_speed_id) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete MAX_SERVER_SPEED [" + max_server_speed_id + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/resalloc/deleteMaxServerSpeed?max_server_speed_id=" + max_server_speed_id);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/resalloc/resource_rule.ejs b/admportal/views/resalloc/resource_rule.ejs
new file mode 100644
index 00000000..4171fc67
--- /dev/null
+++ b/admportal/views/resalloc/resource_rule.ejs
@@ -0,0 +1,228 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#resource_rule').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well wel-sm">
+<h3>Resource Rule</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_resource_rule">
+ Add Resource Rule
+ </button>
+ </div>
+ <% } %>
+
+ <table id="resource_rule" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*ID</th>
+ <th>*Name</th>
+ <th>*End Point Position</th>
+ <th>*Service Expression</th>
+ <th>*Equipment Level</th>
+ <th>*Equipment Expression</th>
+ <th>*Allocation Expression</th>
+ <th>*Soft Limit Expression</th>
+ <th>*Hard Limit Expression</th>
+ <th>*Service Model</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.resource_rule_id %></td>
+ <td><%= row.resource_name %></td>
+ <td><%= row.end_point_position %></td>
+ <td><%= row.service_expression %></td>
+ <td><%= row.equipment_level %></td>
+ <td><%= row.equipment_expression %></td>
+ <td><%= row.allocation_expression %></td>
+ <td><%= row.soft_limit_expression %></td>
+ <td><%= row.hard_limit_expression %></td>
+ <td><%= row.service_model %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateResourceRule('<%=row.resource_rule_id %>','<%= row.resource_name %>','<%= row.end_point_position %>','<%= row.service_expression %>','<%= row.equipment_level %>','<%= row.equipment_expression %>','<%= row.allocation_expression %>','<%= row.soft_limit_expression %>', '<%= row.hard_limit_expression %>','<%= row.service_model %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteResourceRule('<%= row.resource_rule_id %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<% include ../partials/resource_rule %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitResourceRule(form)
+{
+ var errorMsg='';
+ var resource_name = '';
+ var end_point_position = '';
+ var service_expression = '';
+ var equipment_level = '';
+ var equipment_expression = '';
+ var allocation_expression = '';
+ var soft_limit_expression = '';
+ var hard_limit_expression = '';
+ var service_model = '';
+
+ if ( form.name == 'addForm' )
+ {
+ resource_name = form.nf_resource_name;
+ end_point_position = form.nf_end_point_position;
+ service_expression = form.nf_service_expression;
+ equipment_level = form.nf_equipment_level;
+ allocation_expression = form.nf_allocation_expression;
+ soft_limit_expression = form.nf_soft_limit_expression;
+ hard_limit_expression = form.nf_hard_limit_expression;
+ service_model = form.nf_service_model;
+ }
+ else
+ {
+ resource_name = form.uf_resource_name;
+ end_point_position = form.uf_end_point_position;
+ service_expression = form.uf_service_expression;
+ equipment_level = form.uf_equipment_level;
+ allocation_expression = form.uf_allocation_expression;
+ soft_limit_expression = form.uf_soft_limit_expression;
+ hard_limit_expression = form.uf_hard_limit_expression;
+ service_model = form.uf_service_model;
+ }
+
+
+ if ( (resource_name.value == null) || (resource_name.value == "") || isblank(resource_name.value) )
+ {
+ errorMsg += 'Resource Name is required.<br>';
+ }
+ if ( (end_point_position.value == null) || (end_point_position.value == "") || isblank(end_point_position.value) )
+ {
+ errorMsg += 'End Point Position is required.<br>';
+ }
+ if ( (service_expression.value == null) || (service_expression.value == "") || isblank(service_expression.value) ){
+ errorMsg += 'Service Expression is required.<br>';
+ }
+ if ( (equipment_level.value == null) || (equipment_level.value == "") || isblank(equipment_level.value) ){
+ errorMsg += 'Equipment Level is required.<br>';
+ }
+ if ( (allocation_expression.value == null) || (allocation_expression.value == "") || isblank(allocation_expression.value) ){
+ errorMsg += 'Allocation Expression is required.<br>';
+ }
+ if ( (soft_limit_expression.value == null) || (soft_limit_expression.value == "") || isblank(soft_limit_expression.value) ){
+ errorMsg += 'Soft Limit Expression is required.<br>';
+ }
+ if ( (hard_limit_expression.value == null) || (hard_limit_expression.value == "") || isblank(hard_limit_expression.value) ){
+ errorMsg += 'Hard Limit Expression is required.<br>';
+ }
+ if ( (service_model.value == null) || (service_model.value == "") || isblank(service_model.value) ){
+ errorMsg += 'Service Model is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ form.submit();
+}
+
+function updateResourceRule(resource_rule_id,resource_name,end_point_position,service_expression,equipment_level,equipment_expression,allocation_expression,soft_limit_expression,hard_limit_expression,service_model) {
+
+ document.getElementById('uf_resource_rule_id').value=resource_rule_id;
+ document.getElementById('uf_resource_name').value=resource_name;
+ document.getElementById('uf_end_point_position').value=end_point_position;
+ document.getElementById('uf_service_expression').value=service_expression;
+ document.getElementById('uf_equipment_level').value=equipment_level;
+ document.getElementById('uf_equipment_expression').value=equipment_expression;
+ document.getElementById('uf_allocation_expression').value=allocation_expression;
+ document.getElementById('uf_soft_limit_expression').value=soft_limit_expression;
+ document.getElementById('uf_hard_limit_expression').value=hard_limit_expression;
+ document.getElementById('uf_service_model').value=service_model;
+ document.getElementById('uf_key_resource_rule_id').value=resource_rule_id;
+
+ $('#update_resource_rule').modal('show');
+}
+
+function deleteResourceRule(resource_rule_id) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete RESOURCE_RULE [" + resource_rule_id + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/resalloc/deleteResourceRule?resource_rule_id=" + resource_rule_id);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/resalloc/threshold_alarms.ejs b/admportal/views/resalloc/threshold_alarms.ejs
new file mode 100644
index 00000000..f561bc46
--- /dev/null
+++ b/admportal/views/resalloc/threshold_alarms.ejs
@@ -0,0 +1,186 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#threshold_alarms').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Threshold Alarms</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_threshold_alarm">
+ Add Threshold Alarm
+ </button>
+ </div>
+ <% } %>
+
+ <table id="threshold_alarms" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*Resource Threshold ID</th>
+ <th>*Resource Rule ID</th>
+ <th>Threshold Expression</th>
+ <th>Threshold Message</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.resource_threshold_id %></td>
+ <td><%= row.resource_rule_id %></td>
+ <td><%= row.threshold_expression %></td>
+ <td><%= row.threshold_message %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateThresholdAlarm('<%= row.resource_threshold_id %>','<%=row.resource_rule_id %>','<%= row.threshold_expression %>','<%= row.threshold_message %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteThresholdAlarm('<%= row.resource_threshold_id %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<% include ../partials/threshold_alarm %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitThresholdAlarm(form)
+{
+ var resource_rule_id = '';
+ var threshold_expression = '';
+ var threshold_message = '';
+ var errorMsg = '';
+
+ if ( form.name == 'addForm' )
+ {
+ resource_rule_id = form.nf_resource_rule_id;
+ threshold_expression = form.nf_threshold_expression;
+ threshold_message = form.nf_threshold_message;
+ }
+ else
+ {
+ resource_rule_id = form.uf_resource_rule_id;
+ threshold_expression = form.uf_threshold_expression;
+ threshold_message = form.uf_threshold_message;
+ }
+ if ( (resource_rule_id.value == null) || (resource_rule_id.value == "") || isblank(resource_rule_id.value) )
+ {
+ errorMsg += 'Resource Rule ID is required.\n';
+ }
+ if ( (threshold_expression.value == null) || (threshold_expression.value == "") || isblank(threshold_expression.value) )
+ {
+ errorMsg += 'Threshold Expression is required.\n';
+ }
+ if ( (threshold_message.value == null) || (threshold_message.value == "") || isblank(threshold_message.value) )
+ {
+ errorMsg += 'Threshold Message is required.\n';
+ }
+ if( errorMsg.length > 0 ) {
+ alert(errorMsg);
+ return;
+ }
+
+ if ( !isDigit(resource_rule_id.value) )
+ {
+ alert('Resource Rule ID must be a number.');
+ return;
+ }
+
+ form.submit();
+}
+
+function updateThresholdAlarm(resource_threshold_id,resource_rule_id,threshold_expression,threshold_message) {
+
+ document.getElementById('uf_resource_threshold_id').value=resource_threshold_id;
+ document.getElementById('uf_resource_rule_id').value=resource_rule_id;
+ document.getElementById('uf_threshold_expression').value=threshold_expression;
+ document.getElementById('uf_threshold_message').value=threshold_message;
+
+ document.getElementById('uf_key_resource_threshold_id').value=resource_threshold_id;
+
+ $('#update_threshold_alarm').modal('show');
+}
+
+function deleteThresholdAlarm(resource_threshold_id) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete Threshold Alarm [" + resource_threshold_id + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/resalloc/deleteThresholdAlarm?resource_threshold_id=" + resource_threshold_id);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/sdnfc/viewTables.ejs b/admportal/views/sdnfc/viewTables.ejs
new file mode 100644
index 00000000..b950d8f9
--- /dev/null
+++ b/admportal/views/sdnfc/viewTables.ejs
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+
+<meta charset="UTF-8" />
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<% include ../partials/head %>
+<% include ../partials/header %>
+<script type="text/javascript" src="/javascripts/admportal.js" async></script>
+<title>SDN-FC AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#viewTables').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+</head>
+
+<body>
+
+<div class="well well-sm">
+<h3>View Database Tables
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+<!-- Single button -->
+<nav class="navbar navbar-default">
+<div class="container-fluid">
+<div class="navbar-header">
+
+<div class="btn-group">
+ <button type="button" class="btn btn-primary dropdown-toggle navbar-btn" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+ Table <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu" role="menu">
+ <% for ( var i in vtables ){ %>
+ <li><a href="/sdnfc/getTables?tableName=<%= vtables[i] %>"><%= vtables[i] %></a></li>
+ <% } %>
+ </ul>
+</div>
+</div>
+</div>
+</nav>
+
+<% if (displayTable) { %>
+<div class="container-fluid">
+ <table id="viewTables" class="table table-hover table-condensed">
+ <caption class="text-primary"><%= fields[0].table %></caption>
+ <thead>
+ <tr>
+ <% fields.forEach( function(field) { %>
+ <th><%= field.name %></th>
+ <% }); %>
+ </tr>
+ </thead>
+
+ <tbody>
+ <% for ( var x in rows ){ %>
+ <tr>
+ <% for ( var j in rows[x] ){ %>
+ <td><%= rows[x][j] %></td>
+ <% } %>
+ </tr>
+ <% } %>
+ </tbody>
+ </table>
+</div>
+<% } %>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/sdnfc/vrrCredentials.ejs b/admportal/views/sdnfc/vrrCredentials.ejs
new file mode 100644
index 00000000..85c9e956
--- /dev/null
+++ b/admportal/views/sdnfc/vrrCredentials.ejs
@@ -0,0 +1,223 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-FC AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vrr_credentials').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>VRR Credentials</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vrr_credentials">
+ Add VRR Credentials
+ </button>
+ </div>
+ <% } %>
+
+ <table id="vrr_CREDENTIALS" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*Server Name</th>
+ <th>*IP Address</th>
+ <th>*Username</th>
+ <th>*Password</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.server_name %></td>
+ <td><%= row.ip_address %></td>
+ <td><%= row.username %></td>
+ <td>*****</td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateVrrCredentials('<%= row.server_name %>', '<%= row.ip_address %>', '<%= row.username %>','<%= row.password %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteVrrCredentials('<%= row.server_name %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<% include ../partials/vrr_credentials %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitVrrCredentials(form)
+{
+ var errorMsg='';
+ var server_name = '';
+ var ip_address = '';
+ var username = '';
+ var password = '';
+ var confirm_password = '';
+
+ if ( form.name == 'addForm' )
+ {
+ server_name = form.nf_server_name;
+ ip_address = form.nf_ip_address;
+ username = form.nf_username;
+ password = form.nf_password;
+ confirm_password = form.nf_confirm_password;
+
+ if ( (server_name.value == null) || (server_name.value == "") || isblank(server_name.value) )
+ {
+ errorMsg += 'Server Name is required.<br>';
+ }
+ if ( (ip_address.value == null) || (ip_address.value == "") || isblank(ip_address.value) )
+ {
+ errorMsg += 'IP Address is required.<br>';
+ }
+ if ( (password.value == null) || (password.value == "") || isblank(password.value) )
+ {
+ errorMsg += 'Password is required.<br>';
+ }
+ if ( (confirm_password.value == null) || (confirm_password.value == "") || isblank(confirm_password.value) )
+ {
+ errorMsg += 'Confirm Password is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ if ( password.value != confirm_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ else
+ {
+ server_name = form.uf_server_name;
+ ip_address = form.uf_ip_address;
+ username = form.uf_username;
+ password = form.uf_password;
+ confirm_password = form.uf_confirm_password;
+
+ if ( (server_name.value == null) || (server_name.value == "") || isblank(server_name.value) )
+ {
+ errorMsg += 'Server Name is required.<br>';
+ }
+ if ( (ip_address.value == null) || (ip_address.value == "") || isblank(ip_address.value) )
+ {
+ errorMsg += 'IP Address is required.<br>';
+ }
+ if ( (password.value == null) || (password.value == "") || isblank(password.value) )
+ {
+ errorMsg += 'Password is required.<br>';
+ }
+ if ( (confirm_password.value == null) || (confirm_password.value == "") || isblank(confirm_password.value) )
+ {
+ errorMsg += 'Confirm Password is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+
+ if ( password.value != confirm_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ form.submit();
+}
+
+function updateVrrCredentials(server_name,ip_address,username,password) {
+
+ document.getElementById('uf_server_name').value=server_name;
+ document.getElementById('uf_key_server_name').value=server_name;
+ document.getElementById('uf_ip_address').value=ip_address;
+ document.getElementById('uf_username').value=username;
+ document.getElementById('uf_password').value=password;
+ document.getElementById('uf_confirm_password').value=password;
+
+ $('#update_vrr_credentials').modal('show');
+}
+
+function deleteVrrCredentials(server_name) {
+
+ var url_string = encodeURI("/sdnfc/deleteVrrCredentials?server_name=" + server_name);
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete VRR Credential [ " + server_name + " ]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/sla/list.ejs b/admportal/views/sla/list.ejs
new file mode 100644
index 00000000..10bd4f4c
--- /dev/null
+++ b/admportal/views/sla/list.ejs
@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#sla').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Service Logic Administration</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'><%=result.msg %></div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'><%=result.msg %></div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+<div class="container-fluid">
+ <table id="sla" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Module</th>
+ <th>RPC</th>
+ <th>Version</th>
+ <th>Mode</th>
+ <th>Active</th>
+ <% if(priv == 'A') { %>
+ <th>Activate/Deactive</th>
+ <% } %>
+ <th>Display</th>
+ <th>XML code</th>
+ <% if(priv=='A') { %>
+ <th>Delete</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% var i=0; rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.module %></td>
+ <td><%= row.rpc %></td>
+ <td><%= row.version %></td>
+ <td><%= row.mode %></td>
+ <td><%= row.active %></td>
+ <% if ( priv == 'A' ) {
+ if (row.active == "Y") { %>
+ <td><button type="button" class="btn btn-default btn-xs" onclick="toggleState('deactivate','<%= row.module %>','<%= row.rpc %>','<%= row.version %>','<%= row.mode %>');" >Deactivate</button> </td>
+ <% } else { %>
+ <td><button type="button" class="btn btn-default btn-xs" onclick="toggleState('activate','<%= row.module %>','<%= row.rpc %>','<%= row.version %>','<%= row.mode %>');" >Activate</button></td>
+ <% } %>
+ <% } %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick='location.assign("/sla/printAsGv?module=<%= row.module %>&rpc=<%= row.rpc %>&version=<%= row.version %>&mode=<%= row.mode %>");'>Display</button>
+ </td>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick='location.assign("/sla/printAsXml?module=<%= row.module %>&rpc=<%= row.rpc %>&version=<%= row.version %>&mode=<%= row.mode %>");'>XML code</button>
+ </td>
+ <% if ( priv == 'A' ) { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteGraph('<%=row.module %>',
+ '<%=row.rpc %>', '<%=row.version %>','<%=row.mode %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% i++; }); %>
+ </tbody>
+ </table>
+
+ <% if(priv == 'A') { %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/sla/upload" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <%
+ if ( priv == 'A' )
+ {
+ %>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } else { %>
+ <button type="button" class="btn btn-default disabled"
+ onclick="uploadFile(this.form);">Upload File</button>
+ <% } %>
+ </form>
+ </div>
+ <% } %>
+</div>
+
+
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function deleteGraph(_module,rpc,version,mode) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete Directed Graph [" + _module + "][" + rpc + "][" + version + "] ?",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/sla/deleteDG?module=" + _module
+ + "&rpc=" + rpc + "&version=" + version + "&mode=" + mode );
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+function toggleState(laction,_module,rpc,version,mode)
+{
+ var myprompt = '';
+ var myaction = '';
+ if(laction == 'activate'){
+ myprompt = "Are you sure you want to Activate Directed Graph [" + _module + "] ?";
+ myaction = "/sla/activate"
+ + "?module=" + _module
+ + "&rpc=" + rpc
+ + "&version=" + version
+ + "&mode=" + mode;
+ } else {
+ myprompt = "Are you sure you want to Deactivate Directed Graph [" + _module + "] ?";
+ myaction = "/sla/deactivate"
+ + "?module=" + _module
+ + "&rpc=" + rpc
+ + "&version=" + version
+ + "&mode=" + mode;
+ }
+
+ bootbox.confirm({
+ message: myprompt,
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(myaction);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+</script>
+</body>
+</html>
+
diff --git a/admportal/views/sla/printasgv.ejs b/admportal/views/sla/printasgv.ejs
new file mode 100644
index 00000000..66dca131
--- /dev/null
+++ b/admportal/views/sla/printasgv.ejs
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>SDN-C AdminPortal</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+</head>
+<body>
+
+
+
+<div class="well well-sm">
+<h3>Service Logic Graph</h3>
+</div>
+
+<div class="container-fluid">
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+<pre>
+Module : <%= result.module %>
+RPC : <%= result.rpc %>
+Mode : <%= result.mode %>
+Version : <%= result.version %>
+<br>
+<img src='data:image/png;base64,<%= result.msg %>' >
+</pre>
+ <% } else { %>
+ <pre class='alert alert-danger' role='danger'><%=result.msg %></pre>
+ <% } %>
+ <% } %>
+<% } %>
+
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/sla/printasxml.ejs b/admportal/views/sla/printasxml.ejs
new file mode 100644
index 00000000..48b55049
--- /dev/null
+++ b/admportal/views/sla/printasxml.ejs
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <title>SDN-C AdminPortal</title>
+ <meta charset="UTF-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Service Logic Code</h3>
+</div>
+
+<div class="container-fluid">
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <pre class='alert alert-success' role='alert'><%=result.msg %></pre>
+ <% } else { %>
+ <pre class='alert alert-danger' role='danger'><%=result.msg %></pre>
+ <% } %>
+ <% } %>
+<% } %>
+</div>
+
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+</body>
+</html>
+
diff --git a/admportal/views/tunnel/linkLatencyMaster.ejs b/admportal/views/tunnel/linkLatencyMaster.ejs
new file mode 100644
index 00000000..c09adc4e
--- /dev/null
+++ b/admportal/views/tunnel/linkLatencyMaster.ejs
@@ -0,0 +1,240 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+
+<meta charset="UTF-8" />
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<% include ../partials/head %>
+<% include ../partials/header %>
+<script type="text/javascript" src="/javascripts/admportal.js" async></script>
+<title>SDNC-MLC AdminPortal</title>
+
+
+<script class="init">
+ $(document).ready(function() {
+ $('#linkLatencyMaster').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+</head>
+
+<body>
+
+<div class="well well-sm">
+<h3>Link Latency Master</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_link_latency_master">Add Link Latency</button>
+ </div>
+ <% } %>
+
+ <table id="linkLatencyMaster" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*Src CRS Name</th>
+ <th>*Dest CRS Name</th>
+ <th>*Bundle Name</th>
+ <th>*Latency</th>
+ <th>*Intra Inter SNRC</th>
+ <th>*Final Latency</th>
+ <th>*Augmentable</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.source_crs_name %></td>
+ <td><%= row.destination_crs_name %></td>
+ <td><%= row.bundle_name %></td>
+ <td><%= row.latency %></td>
+ <td><%= row.intra_inter_snrc %></td>
+ <td><%= row.final_latency %></td>
+ <td><%= row.augmentable %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs" onclick="updateLinkLatencyMaster('<%= row.source_crs_name %>', '<%= row.destination_crs_name %>', '<%= row.bundle_name %>', '<%= row.latency %>', '<%= row.intra_inter_snrc %>', '<%= row.final_latency %>', '<%= row.augmentable %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs" onclick="deleteLinkLatencyMaster('<%= row.source_crs_name %>','<%= row.destination_crs_name %>','<%= row.bundle_name %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/tunnel/uploadLinkLatencyMaster" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <button type="button" class="btn btn-default" onclick="uploadFile(this.form);">Upload File</button>
+ </form>
+ </div>
+ <% } %>
+
+</div>
+
+<% include ../partials/link_latency_master %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitLinkLatencyMaster(form)
+{
+ var errorMsg='';
+ var source_crs_name = '';
+ var destination_crs_name = '';
+ var bundle_name = '';
+ var latency = '';
+ var intra_inter_snrc = '';
+ var final_latency = '';
+ var augmentable = '';
+
+ if ( form.name == 'addForm' )
+ {
+ source_crs_name = form.nf_source_crs_name;
+ destination_crs_name = form.nf_destination_crs_name;
+ bundle_name = form.nf_bundle_name;
+ latency = form.nf_latency;
+ intra_inter_snrc = form.nf_intra_inter_snrc;
+ final_latency = form.nf_final_latency;
+ augmentable = form.nf_augmentable;
+ }
+ else
+ {
+ source_crs_name = form.uf_source_crs_name;
+ destination_crs_name = form.uf_destination_crs_name;
+ bundle_name = form.uf_bundle_name;
+ latency = form.uf_latency;
+ intra_inter_snrc = form.uf_intra_inter_snrc;
+ final_latency = form.uf_final_latency;
+ augmentable = form.uf_augmentable;
+ }
+
+ if ( (source_crs_name.value == null) || (source_crs_name.value == "") || isblank(source_crs_name.value) )
+ {
+ errorMsg += 'Source CRS Name is required.<br>';
+ }
+ if ( (destination_crs_name.value == null) || (destination_crs_name.value == "") || isblank(destination_crs_name.value) )
+ {
+ errorMsg += 'Destination CRS Name is required.<br>';
+ }
+ if ( (bundle_name.value == null) || (bundle_name.value == "") || isblank(bundle_name.value) )
+ {
+ errorMsg += 'Bundle Name is required.<br>';
+ }
+ if ( (latency.value == null) || (latency.value == "") || isblank(latency.value) )
+ {
+ errorMsg += 'Latency is required.<br>';
+ }
+ if ( (intra_inter_snrc.value == null) || (intra_inter_snrc.value == "") || isblank(intra_inter_snrc.value) )
+ {
+ errorMsg += 'Intra Inter SNRC is required.<br>';
+ }
+ if ( (final_latency.value == null) || (final_latency.value == "") || isblank(final_latency.value) )
+ {
+ errorMsg += 'Final Latency is required.<br>';
+ }
+ if ( (augmentable.value == null) || (augmentable.value == "") || isblank(augmentable.value) )
+ {
+ errorMsg += 'Augmentable is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+
+ if (augmentable.value != 'Y' && augmentable.value != 'N'){
+ bootbox.alert('Augmentable must be Y or N');
+ return;
+ }
+
+ form.submit();
+}
+
+function updateLinkLatencyMaster(source_crs_name,destination_crs_name,bundle_name,latency,intra_inter_snrc,final_latency,augmentable) {
+
+ document.getElementById('uf_source_crs_name').value=source_crs_name;
+ document.getElementById('uf_destination_crs_name').value=destination_crs_name;
+ document.getElementById('uf_bundle_name').value=bundle_name;
+ document.getElementById('uf_latency').value=latency;
+ document.getElementById('uf_intra_inter_snrc').value=intra_inter_snrc;
+ document.getElementById('uf_final_latency').value=final_latency;
+ document.getElementById('uf_augmentable').value=augmentable;
+
+ document.getElementById('uf_key_source_crs_name').value=source_crs_name;
+ document.getElementById('uf_key_destination_crs_name').value=destination_crs_name;
+ document.getElementById('uf_key_bundle_name').value=bundle_name;
+
+ $('#update_link_latency_master').modal('show');
+}
+
+function deleteLinkLatencyMaster(source_crs_name,destination_crs_name,bundle_name) {
+
+ var url_string = encodeURI("/tunnel/deleteLinkLatencyMaster?source_crs_name=" + source_crs_name
+ + "&destination_crs_name=" + destination_crs_name
+ + "&bundle_name=" + bundle_name);
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete this Link Latency entry? [" + source_crs_name + ":" + destination_crs_name + ":" + bundle_name + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/tunnel/linkMaster.ejs b/admportal/views/tunnel/linkMaster.ejs
new file mode 100644
index 00000000..160bb7e6
--- /dev/null
+++ b/admportal/views/tunnel/linkMaster.ejs
@@ -0,0 +1,213 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+
+<meta charset="UTF-8" />
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<% include ../partials/head %>
+<% include ../partials/header %>
+<script type="text/javascript" src="/javascripts/admportal.js" async></script>
+<title>SDNC-MLC AdminPortal</title>
+
+
+<script class="init">
+ $(document).ready(function() {
+ $('#linkMaster').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+</head>
+
+<body>
+
+<div class="well well-sm">
+<h3>Link Master</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_link_master">Add Link</button>
+ </div>
+ <% } %>
+
+ <table id="linkMaster" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*Link Interface IP</th>
+ <th>Source CRS Name</th>
+ <th>Destination CRS Name</th>
+ <th>Max Reserved BW</th>
+ <th>Default Cost</th>
+ <th>Bundle Name</th>
+ <th>Shutdown</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.link_interface_ip %></td>
+ <td><%= row.source_crs_name %></td>
+ <td><%= row.destination_crs_name %></td>
+ <td><%= row.link_speed %></td>
+ <td><%= row.default_cost %></td>
+ <td><%= row.bundle_name %></td>
+ <td><%= row.shutdown %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs" onclick="updateLinkMaster('<%= row.link_interface_ip %>',
+ '<%= row.source_crs_name %>', '<%= row.destination_crs_name %>', '<%= row.link_speed %>', '<%= row.default_cost %>',
+ '<%= row.bundle_name %>', '<%= row.shutdown %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs" onclick="deleteLinkMaster('<%= row.link_interface_ip %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+</div>
+
+<% include ../partials/link_master %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function saveLinkMaster(form)
+{
+ var errorMsg='';
+ var link_interface_ip = '';
+ var source_crs_name = '';
+ var destination_crs_name = '';
+ var link_speed = '';
+ var default_cost = '';
+ var bundle_name = '';
+ var shutdown = '';
+
+ if ( form.name == 'addForm' )
+ {
+ link_interface_ip = form.nf_link_interface_ip;
+ source_crs_name = form.nf_source_crs_name;
+ destination_crs_name = form.nf_destination_crs_name;
+ link_speed = form.nf_link_speed;
+ default_cost = form.nf_default_cost;
+ bundle_name = form.nf_bundle_name;
+ shutdown = form.nf_shutdown;
+ }
+ else
+ {
+ link_interface_ip = form.uf_link_interface_ip;
+ source_crs_name = form.uf_source_crs_name;
+ destination_crs_name = form.uf_destination_crs_name;
+ link_speed = form.uf_link_speed;
+ default_cost = form.uf_default_cost;
+ bundle_name = form.uf_bundle_name;
+ shutdown = form.uf_shutdown;
+ }
+
+
+ if ( (link_interface_ip.value == null) || (link_interface_ip.value == "") || isblank(link_interface_ip.value) )
+ {
+ errorMsg += 'Link Interface IP is required.<br>';
+ }
+ if ( (source_crs_name.value == null) || (source_crs_name.value == "") || isblank(source_crs_name.value) )
+ {
+ errorMsg += 'Source CRS Name is required.<br>';
+ }
+ if ( (destination_crs_name.value == null) || (destination_crs_name.value == "") || isblank(destination_crs_name.value) )
+ {
+ errorMsg += 'Destination CRS Name is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+
+ if ( link_speed.value.length >0 && !isDigit(link_speed.value) )
+ {
+ bootbox.alert('Max Reserved BW must be a number.');
+ return;
+ }
+ if ( default_cost.value.length >0 && !isDigit(default_cost.value) )
+ {
+ bootbox.alert('Default Cost must be a number.');
+ return;
+ }
+ form.submit();
+}
+
+function updateLinkMaster(link_interface_ip,source_crs_name,destination_crs_name,link_speed,default_cost,bundle_name,shutdown) {
+
+ document.getElementById('uf_link_interface_ip').value=link_interface_ip;
+ document.getElementById('uf_source_crs_name').value=source_crs_name;
+ document.getElementById('uf_destination_crs_name').value=destination_crs_name;
+ document.getElementById('uf_link_speed').value=link_speed;
+ document.getElementById('uf_default_cost').value=default_cost;
+ document.getElementById('uf_bundle_name').value=bundle_name;
+ document.getElementById('uf_shutdown').value=shutdown;
+ document.getElementById('uf_key_link_interface_ip').value=link_interface_ip;
+
+ $('#update_link_master').modal('show');
+}
+
+function deleteLinkMaster(link_interface_ip) {
+
+ var url_string = encodeURI("/tunnel/deleteLinkMaster?link_interface_ip=" + link_interface_ip);
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete this Link [" + link_interface_ip + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/tunnel/metroRoadmServiceRequest.ejs b/admportal/views/tunnel/metroRoadmServiceRequest.ejs
new file mode 100644
index 00000000..efc81afe
--- /dev/null
+++ b/admportal/views/tunnel/metroRoadmServiceRequest.ejs
@@ -0,0 +1,300 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#metroRoadmServiceRequest').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Metro ROADM Service Request</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <!--
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_metroroadm_service_request">
+ Add Metro ROADM Serice Request
+ </button>
+ </div>
+ <% } %>
+ -->
+
+ <table id="metroRoadmServiceRequest" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>ReqId</th>
+ <th>ReqSource</th>
+ <th>NotificationURL</th>
+ <th>Action</th>
+ <th>ReqTimestamp</th>
+ <th>UpdateTimestamp</th>
+ <th>ReqStatus</th>
+ <th>ProcStatus</th>
+ <th>ReasonCode</th>
+ <th>ReasonMsg</th>
+ <th>ServiceId</th>
+ <th>CommonId</th>
+ <th>Clli_A</th>
+ <th>Clli_Z</th>
+ <th>Customer</th>
+ <th>ControllerId</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.request_id %></td>
+ <td><%= row.request_source %></td>
+ <td><%= row.notification_url %></td>
+ <td><%= row.action %></td>
+ <td><%= row.request_timestamp %></td>
+ <td><%= row.update_timestamp %></td>
+ <td><%= row.request_status %></td>
+ <td><%= row.processing_status %></td>
+ <td><%= row.reason_code %></td>
+ <td><%= row.reason_message %></td>
+ <td><%= row.service_id %></td>
+ <td><%= row.common_id %></td>
+ <td><%= row.clli_a %></td>
+ <td><%= row.clli_z %></td>
+ <td><%= row.customer %></td>
+ <td><%= row.controller_id %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateMetroRoadmServiceRequest('<%=row.request_id %>','<%= row.request_source %>',
+ '<%=row.notification_url %>','<%= row.action %>','<%= row.request_timestamp %>',
+ '<%= row.update_timestamp %>','<%= row.request_status %>', '<%= row.processing_status %>',
+ '<%= row.reason_code %>', '<%= row.reason_message %>','<%= row.service_id %>',
+ '<%= row.common_id %>','<%= row.clli_a %>', '<%= row.clli_z %>','<%= row.customer %>',
+ '<%= row.controller_id %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteMetroRoadmServiceRequest('<%= row.request_id %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+</div>
+
+<% include ../partials/metroroadm_service_request %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitMetroRoadmServiceRequest(form)
+{
+ var errorMsg='';
+ var request_id='';
+ var request_source = '';
+ var notification_url = '';
+ var action = '';
+ var request_timestamp = '';
+ var update_timestamp = '';
+ var request_status = '';
+ var processing_status = '';
+ var reason_code = '';
+ var reason_message = '';
+ var service_id = '';
+ var common_id = '';
+ var clli_a = '';
+ var clli_z = '';
+ var customer = '';
+ var controller_id = '';
+
+ if ( form.name == 'addForm' )
+ {
+ request_id = form.nf_request_id;
+ request_source = form.nf_request_source;
+ notification_url = form.nf_notification_url;
+ action = form.nf_l_action;
+ request_timestamp = form.nf_request_timestamp;
+ update_timestamp = form.nf_update_timestamp;
+ request_status = form.nf_request_status;
+ processing_status = form.nf_processing_status;
+ reason_code = form.nf_reason_code;
+ reason_message = form.nf_reason_message;
+ service_id = form.nf_service_id;
+ common_id = form.nf_common_id;
+ clli_a = form.nf_clli_a;
+ clli_z = form.nf_clli_z;
+ customer = form.nf_customer;
+ controller_id = form.nf_controller_id;
+ }
+ else
+ {
+ request_id = form.uf_request_id;
+ request_source = form.uf_request_source;
+ notification_url = form.uf_notification_url;
+ action = form.uf_l_action;
+ request_timestamp = form.uf_request_timestamp;
+ update_timestamp = form.uf_update_timestamp;
+ request_status = form.uf_request_status;
+ processing_status = form.uf_processing_status;
+ reason_code = form.uf_reason_code;
+ reason_message = form.uf_reason_message;
+ service_id = form.uf_service_id;
+ common_id = form.uf_common_id;
+ clli_a = form.uf_clli_a;
+ clli_z = form.uf_clli_z;
+ customer = form.uf_customer;
+ controller_id = form.uf_controller_id;
+ }
+ if ( (request_id.value == null) || (request_id.value == "") || isblank(request_id.value) )
+ {
+ errorMsg += 'Request Id is required.\n';
+ }
+ if ( (action.value == null) || (action.value == "") || isblank(action.value) )
+ {
+ errorMsg += 'Action is required.\n';
+ }
+ if ( (request_timestamp.value == null) || (request_timestamp.value == "") || isblank(request_timestamp.value) )
+ {
+ errorMsg += 'Request Timestamp is required.\n';
+ }
+ if ( (request_status.value == null) || (request_status.value == "") || isblank(request_status.value) )
+ {
+ errorMsg += 'Request Status is required.\n';
+ }
+ if ( (processing_status.value == null) || (processing_status.value == "") || isblank(processing_status.value) )
+ {
+ errorMsg += 'Processing Status is required.\n';
+ }
+ if ( (service_id.value == null) || (service_id.value == "") || isblank(service_id.value) )
+ {
+ errorMsg += 'Service Id is required.\n';
+ }
+ if ( (controller_id.value == null) || (controller_id.value == "") || isblank(controller_id.value) )
+ {
+ errorMsg += 'Controller Id is required.\n';
+ }
+ if( errorMsg.length > 0 ) {
+ alert(errorMsg);
+ return;
+ }
+
+ // edit request_timestamp, update_timestamp
+ if (!isValid(request_timestamp.value)){
+ alert('Request Timestamp must be in format YYYY-MM-DD HH:MM:SS');
+ return;
+ }
+ if ( update_timestamp.length > 0 )
+ {
+ if (!isValid(update_timestamp.value)){
+ alert('Update Timestamp must be in format YYYY-MM-DD HH:MM:SS');
+ return;
+ }
+ }
+ form.submit();
+}
+
+function isValid(dateString) {
+ if (dateString == '0000-00-00 00:00:00'){
+ return(true);
+ }
+ var minDate = new Date('1970-01-01 00:00:01');
+ var maxDate = new Date('2038-01-19 03:14:07');
+ var date = new Date(dateString);
+ return date > minDate && date < maxDate;
+}
+
+function updateMetroRoadmServiceRequest(request_id,request_source,notification_url,action,request_timestamp,update_timestamp,
+ request_status,processing_status,reason_code,reason_message,service_id,common_id,clli_a,clli_z,customer,controller_id) {
+
+ document.getElementById('uf_request_id').value=request_id;
+ document.getElementById('uf_key_request_id').value=request_id;
+ document.getElementById('uf_request_source').value=request_source;
+ document.getElementById('uf_notification_url').value=notification_url;
+ document.getElementById('uf_l_action').value=action;
+ document.getElementById('uf_request_timestamp').value=request_timestamp;
+ document.getElementById('uf_update_timestamp').value=update_timestamp;
+ document.getElementById('uf_request_status').value=request_status;
+ document.getElementById('uf_processing_status').value=processing_status;
+ document.getElementById('uf_reason_code').value=reason_code;
+ document.getElementById('uf_reason_message').value=reason_message;
+ document.getElementById('uf_service_id').value=service_id;
+ document.getElementById('uf_common_id').value=common_id;
+ document.getElementById('uf_clli_a').value=clli_a;
+ document.getElementById('uf_clli_z').value=clli_z;
+ document.getElementById('uf_customer').value=customer;
+ document.getElementById('uf_controller_id').value=controller_id;
+
+ $('#update_metroroadm_service_request').modal('show');
+}
+
+function deleteMetroRoadmServiceRequest(request_id) {
+
+ var url_string = encodeURI("/tunnel/deleteMetroRoadmServiceRequest?request_id=" + request_id );
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete Metro ROADM Service Request? " + request_id,
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/tunnel/owbcProperties.ejs b/admportal/views/tunnel/owbcProperties.ejs
new file mode 100644
index 00000000..37b02fea
--- /dev/null
+++ b/admportal/views/tunnel/owbcProperties.ejs
@@ -0,0 +1,223 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#owbc_properties').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>OWBC Properties</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_owbc_properties">
+ Add OWBC Properties
+ </button>
+ </div>
+ <% } %>
+
+ <table id="owbc_properties" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Controller ID</th>
+ <th>Base URL</th>
+ <th>Service Create Extension</th>
+ <th>Service Delete Extension</th>
+ <th>Auth Username</th>
+ <th>Auth Password</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.controller_id %></td>
+ <td><%= row.base_uri %></td>
+ <td><%= row.service_create_extension %></td>
+ <td><%= row.service_delete_extension %></td>
+ <td><%= row.auth_username %></td>
+ <td>*****</td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateOwbcProperties('<%=row.controller_id %>','<%= row.base_uri %>','<%= row.service_create_extension %>','<%= row.service_delete_extension %>','<%= row.auth_username %>','<%= row.auth_password %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteOwbcProperties('<%= row.controller_id %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<% include ../partials/owbc_properties %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitOwbcProperties(form)
+{
+ var errorMsg='';
+ var controller_id = '';
+ var base_uri = '';
+ var service_create_extension = '';
+ var service_delete_extension = '';
+ var auth_username = '';
+ var auth_password = '';
+ var confirm_auth_password = '';
+
+ if ( form.name == 'addForm' )
+ {
+ controller_id = form.nf_controller_id;
+ base_uri = form.nf_base_uri;
+ service_create_extension = form.nf_service_create_extension;
+ service_delete_extension = form.nf_service_delete_extension;
+ auth_username = form.nf_auth_username;
+ auth_password = form.nf_auth_password;
+ confirm_auth_password = form.nf_confirm_auth_password;
+
+ if ( auth_password.value != confirm_auth_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ else
+ {
+ controller_id = form.uf_controller_id;
+ base_uri = form.uf_base_uri;
+ service_create_extension = form.uf_service_create_extension;
+ service_delete_extension = form.uf_service_delete_extension;
+ auth_username = form.uf_auth_username;
+ auth_password = form.uf_auth_password;
+ confirm_auth_password = form.uf_confirm_auth_password;
+
+ if ( auth_password.value != confirm_auth_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ if ( (controller_id.value == null) || (controller_id.value == "") || isblank(controller_id.value) )
+ {
+ errorMsg += 'Controller Id is required.<br>';
+ }
+ if ( (base_uri.value == null) || (base_uri.value == "") || isblank(base_uri.value) )
+ {
+ errorMsg += 'Base URL is required.<br>';
+ }
+ if ( (service_create_extension.value == null) || (service_create_extension.value == "") || isblank(service_create_extension.value) )
+ {
+ errorMsg += 'Service Create Extension is required.<br>';
+ }
+ if ( (service_delete_extension.value == null) || (service_delete_extension.value == "") || isblank(service_delete_extension.value) )
+ {
+ errorMsg += 'Service Delete Extension is required.<br>';
+ }
+ if ( (auth_username.value == null) || (auth_username.value == "") || isblank(auth_username.value) )
+ {
+ errorMsg += 'Auth Username is required.<br>';
+ }
+ if ( (auth_password.value == null) || (auth_password.value == "") || isblank(auth_password.value) )
+ {
+ errorMsg += 'Auth Password is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ form.submit();
+}
+
+function updateOwbcProperties(controller_id,base_uri,service_create_extension,service_delete_extension,auth_username,auth_password) {
+
+ document.getElementById('uf_controller_id').value=controller_id;
+ document.getElementById('uf_key_controller_id').value=controller_id;
+ document.getElementById('uf_base_uri').value=base_uri;
+ document.getElementById('uf_service_create_extension').value=service_create_extension;
+ document.getElementById('uf_service_delete_extension').value=service_delete_extension;
+ document.getElementById('uf_auth_username').value=auth_username;
+ document.getElementById('uf_auth_password').value=auth_password;
+ document.getElementById('uf_confirm_auth_password').value=auth_password;
+
+ $('#update_owbc_properties').modal('show');
+}
+
+function deleteOwbcProperties(controller_id) {
+
+ var url_string = encodeURI("/tunnel/deleteOwbcProperties?controller_id=" + controller_id );
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete OWBC Properties? " + controller_id,
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/tunnel/partnerProperties.ejs b/admportal/views/tunnel/partnerProperties.ejs
new file mode 100644
index 00000000..af51c864
--- /dev/null
+++ b/admportal/views/tunnel/partnerProperties.ejs
@@ -0,0 +1,184 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDNC-MLC AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#partner_properties').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Partner Properties</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_partner_properties">
+ Add Partner Properties
+ </button>
+ </div>
+ <% } %>
+
+ <table id="partner_properties" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*Partner</th>
+ <th>*Username</th>
+ <th>*Password</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.partner %></td>
+ <td><%= row.auth_username %></td>
+ <td>*****</td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updatePartnerProperties('<%= row.partner %>','<%= row.auth_username %>','<%= row.auth_password %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deletePartnerProperties('<%= row.partner %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<% include ../partials/partner_properties %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitPartnerProperties(form)
+{
+ var errorMsg='';
+ var partner = '';
+ var auth_username = '';
+ var auth_password = '';
+ var confirm_auth_password = '';
+
+ if ( form.name == 'addForm' )
+ {
+ partner = form.nf_partner;
+ auth_username = form.nf_auth_username;
+ auth_password = form.nf_auth_password;
+ confirm_auth_password = form.nf_confirm_auth_password;
+
+ if ( (partner.value == null) || (partner.value == "") || isblank(partner.value) )
+ {
+ errorMsg += 'Partner is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ if ( auth_password.value != confirm_auth_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ else
+ {
+ partner = form.uf_partner;
+ auth_username = form.uf_auth_username;
+ auth_password = form.uf_auth_password;
+ confirm_auth_password = form.uf_confirm_auth_password;
+ if ( auth_password.value != confirm_auth_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ form.submit();
+}
+
+function updatePartnerProperties(partner,auth_username,auth_password) {
+
+ document.getElementById('uf_partner').value=partner;
+ document.getElementById('uf_key_partner').value=partner;
+ document.getElementById('uf_auth_username').value=auth_username;
+ document.getElementById('uf_auth_password').value=auth_password;
+ document.getElementById('uf_confirm_auth_password').value=auth_password;
+
+ $('#update_partner_properties').modal('show');
+}
+
+function deletePartnerProperties(partner) {
+
+ var url_string = encodeURI("/tunnel/deletePartnerProperties?partner=" + partner);
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete Partner Property [ " + partner + " ]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/tunnel/roadmMapping.ejs b/admportal/views/tunnel/roadmMapping.ejs
new file mode 100644
index 00000000..347cf03e
--- /dev/null
+++ b/admportal/views/tunnel/roadmMapping.ejs
@@ -0,0 +1,230 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+
+<meta charset="UTF-8" />
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<% include ../partials/head %>
+<% include ../partials/header %>
+<script type="text/javascript" src="/javascripts/admportal.js" async></script>
+<title>SDNC-MLC AdminPortal</title>
+
+
+<script class="init">
+ $(document).ready(function() {
+ $('#roadmMapping').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+</head>
+
+<body>
+
+<div class="well well-sm">
+<h3>ROADM Mapping</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_roadm_mapping">Add Mapping</button>
+ </div>
+ <% } %>
+
+ <table id="roadmMapping" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*Router Name</th>
+ <th>*ROADM Name</th>
+ <th>*CLLI</th>
+ <th>*City Name</th>
+ <th>*LAT</th>
+ <th>*LON</th>
+ <th>*SNRC</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.router_name %></td>
+ <td><%= row.roadm_name %></td>
+ <td><%= row.clli %></td>
+ <td><%= row.city_name %></td>
+ <td><%= row.lat %></td>
+ <td><%= row.lon %></td>
+ <td><%= row.snrc %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs" onclick="updateRoadmMapping('<%= row.router_name %>',
+ '<%= row.roadm_name %>', '<%= row.clli %>', '<%= row.city_name %>', '<%= row.lat %>', '<%= row.lon %>', '<%= row.snrc %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs" onclick="deleteRoadmMapping('<%= row.router_name %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/tunnel/uploadRoadmMapping" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <button type="button" class="btn btn-default" onclick="uploadFile(this.form);">Upload File</button>
+ </form>
+ </div>
+ <% } %>
+
+</div>
+
+<% include ../partials/roadm_mapping %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function saveRoadmMapping(form)
+{
+ var errorMsg='';
+ var router_name = '';
+ var roadm_name = '';
+ var clli = '';
+ var city_name = '';
+ var lat = '';
+ var lon = '';
+ var snrc = '';
+
+ if ( form.name == 'addForm' )
+ {
+ router_name = form.nf_router_name;
+ roadm_name = form.nf_roadm_name;
+ clli = form.nf_clli;
+ city_name = form.nf_city_name;
+ lat = form.nf_lat;
+ lon = form.nf_lon;
+ snrc = form.nf_snrc;
+ }
+ else
+ {
+ router_name = form.uf_router_name;
+ roadm_name = form.uf_roadm_name;
+ clli = form.uf_clli;
+ city_name = form.uf_city_name;
+ lat = form.uf_lat;
+ lon = form.uf_lon;
+ snrc = form.uf_snrc;
+ }
+
+ if ( (router_name.value == null) || (router_name.value == "") || isblank(router_name.value) )
+ {
+ errorMsg += 'Router Name is required.<br>';
+ }
+ if ( (roadm_name.value == null) || (roadm_name.value == "") || isblank(roadm_name.value) )
+ {
+ errorMsg += 'ROADM Name is required.<br>';
+ }
+ if ( (clli.value == null) || (clli.value == "") || isblank(clli.value) )
+ {
+ errorMsg += 'CLLI is required.<br>';
+ }
+ if ( (city_name.value == null) || (city_name.value == "") || isblank(city_name.value) )
+ {
+ errorMsg += 'City Name is required.<br>';
+ }
+ if ( (lat.value == null) || (lat.value == "") || isblank(lat.value) )
+ {
+ errorMsg += 'LAT (latitude) is required.<br>';
+ }
+ if ( (lon.value == null) || (lon.value == "") || isblank(lon.value) )
+ {
+ errorMsg += 'LON (longitude) is required.<br>';
+ }
+ if ( (snrc.value == null) || (snrc.value == "") || isblank(snrc.value) )
+ {
+ errorMsg += 'SNRC is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ form.submit();
+}
+
+function updateRoadmMapping(router_name,roadm_name,clli,city_name,lat,lon,snrc) {
+
+ document.getElementById('uf_router_name').value=router_name;
+ document.getElementById('uf_roadm_name').value=roadm_name;
+ document.getElementById('uf_clli').value=clli;
+ document.getElementById('uf_city_name').value=city_name;
+ document.getElementById('uf_lat').value=lat;
+ document.getElementById('uf_lon').value=lon;
+ document.getElementById('uf_snrc').value=snrc;
+ document.getElementById('uf_key_router_name').value=router_name;
+
+ $('#update_roadm_mapping').modal('show');
+}
+
+function deleteRoadmMapping(router_name) {
+
+ var url_string = encodeURI("/tunnel/deleteRoadmMapping?router_name=" + router_name);
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete this mapping? [" + router_name + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/tunnel/routerMaster.ejs b/admportal/views/tunnel/routerMaster.ejs
new file mode 100644
index 00000000..eada3f39
--- /dev/null
+++ b/admportal/views/tunnel/routerMaster.ejs
@@ -0,0 +1,167 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+
+<meta charset="UTF-8" />
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<% include ../partials/head %>
+<% include ../partials/header %>
+<script type="text/javascript" src="/javascripts/admportal.js" async></script>
+<title>SDN-C AdminPortal</title>
+
+
+<script class="init">
+ $(document).ready(function() {
+ $('#routerMaster').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+</head>
+
+<body>
+
+<div class="well well-sm">
+<h3>Router Master</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary btn-md" data-toggle="modal" data-target="#add_router_master">Add Router</button>
+ </div>
+ <% } %>
+
+ <table id="routerMaster" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*CRS Name</th>
+ <th>Loopback IP</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.crs_name %></td>
+ <td><%= row.loopback_ip %></td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs" onclick="updateRouterMaster('<%= row.crs_name %>',
+ '<%= row.loopback_ip %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs" onclick="deleteRouterMaster('<%= row.crs_name %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+</div>
+
+<% include ../partials/router_master %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function saveRouterMaster(form)
+{
+ var errorMsg='';
+ var crs_name = '';
+ var loopback_ip = '';
+
+ if ( form.name == 'addForm' )
+ {
+ crs_name = form.nf_crs_name;
+ loopback_ip = form.nf_loopback_ip;
+ }
+ else
+ {
+ crs_name = form.uf_crs_name;
+ loopback_ip = form.uf_loopback_ip;
+ }
+
+
+ if ( (crs_name.value == null) || (crs_name.value == "") || isblank(crs_name.value) )
+ {
+ errorMsg += 'CRS Name is required.<br>';
+ }
+ if ( (loopback_ip.value == null) || (loopback_ip.value == "") || isblank(loopback_ip.value) )
+ {
+ errorMsg += 'Loopback IP is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ form.submit();
+}
+
+function updateRouterMaster(crs_name,loopback_ip) {
+
+ document.getElementById('uf_crs_name').value=crs_name;
+ document.getElementById('uf_loopback_ip').value=loopback_ip;
+ document.getElementById('uf_key_crs_name').value=crs_name;
+
+ $('#update_router_master').modal('show');
+}
+
+function deleteRouterMaster(crs_name) {
+
+ var url_string = encodeURI("/tunnel/deleteRouterMaster?crs_name=" + crs_name);
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete this Router [" + crs_name + "]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/altsCredentials.ejs b/admportal/views/ucpe/altsCredentials.ejs
new file mode 100644
index 00000000..54ca0208
--- /dev/null
+++ b/admportal/views/ucpe/altsCredentials.ejs
@@ -0,0 +1,171 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#alts_credentials').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>ALTS Credentials</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_alts_credentials">
+ Add ALTS Credentials
+ </button>
+ </div>
+ <% } %>
+
+ <table id="alts_credentials" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>ALTS Username</th>
+ <th>ALTS Password</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.alts_username %></td>
+ <td>*****</td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateAltsCredentials('<%=row.alts_username %>','<%= row.alts_password %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteAltsCredentials('<%= row.alts_username %>', '<%= row.alts_password %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<% include ../partials/alts_credentials %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitAltsCredentials(form)
+{
+ var errorMsg='';
+ var alts_username = '';
+ var alts_password = '';
+ var confirm_alts_password = '';
+
+ if ( form.name == 'addForm' )
+ {
+ alts_username = form.nf_alts_username;
+ alts_password = form.nf_alts_password;
+ confirm_alts_password = form.nf_confirm_alts_password;
+
+ if ( alts_password.value != confirm_alts_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ else
+ {
+ alts_username = form.uf_alts_username;
+ alts_password = form.uf_alts_password;
+ confirm_alts_password = form.uf_confirm_alts_password;
+
+ if ( alts_password.value != confirm_alts_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ form.submit();
+}
+
+function updateAltsCredentials(alts_username,alts_password) {
+
+ document.getElementById('uf_alts_username').value=alts_username;
+ document.getElementById('uf_alts_password').value=alts_password;
+
+ $('#update_alts_credentials').modal('show');
+}
+
+function deleteAltsCredentials(alts_username, alts_password) {
+
+ var url_string = encodeURI("/ucpe/deleteAltsCredentials?alts_username=" + alts_username
+ + "&alts_password=" + alts_password);
+
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete ALTS Credentials? " + alts_username,
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/apiLogins.ejs b/admportal/views/ucpe/apiLogins.ejs
new file mode 100644
index 00000000..ddb50c8b
--- /dev/null
+++ b/admportal/views/ucpe/apiLogins.ejs
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#api_logins').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+
+<body>
+
+<div class="well well-sm">
+<h3>uCPE API Logins</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="api_logins" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*CUSTOMER_NAME</th>
+ <th>PHS_NCS_USERNAME</th>
+ <th>NCS_PUBLIC_SSH_KEY</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.customer_name %></td>
+ <td><%= row.phs_ncs_username %></td>
+ <td><%= row.ncs_public_ssh_key %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/chainingTopologies.ejs b/admportal/views/ucpe/chainingTopologies.ejs
new file mode 100644
index 00000000..2717062a
--- /dev/null
+++ b/admportal/views/ucpe/chainingTopologies.ejs
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#chaining_topologies').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE Chaining Topologies</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="chaining_topologies" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*TOPOLOGY_NAME</th>
+ <th>*START_VNF_TYPE</th>
+ <th>*SEQUENCE_NUMBER</th>
+ <th>START_SERVIVE_PORT_NAME</th>
+ <th>VNF_TYPE</th>
+ <th>SERVICE_PORT_NAME</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.topology_name %></td>
+ <td><%= row.start_vnf_type %></td>
+ <td><%= row.sequence_number %></td>
+ <td><%= row.start_service_port_name %></td>
+ <td><%= row.vnf_type %></td>
+ <td><%= row.service_port_name %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/customerNcsServers.ejs b/admportal/views/ucpe/customerNcsServers.ejs
new file mode 100644
index 00000000..082384a8
--- /dev/null
+++ b/admportal/views/ucpe/customerNcsServers.ejs
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#ncs_servers').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE Customer NCS Servers</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="ncs_servers" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*CUSTOMER_NAME</th>
+ <th>URL</th>
+ <th>NCS_SM_IP_ADDRESS</th>
+ <th>NCS_DM_V6_IP_ADDRESS</th>
+ <th>NCS_DM_V6_IP_NETWORK</th>
+ <th>DR_NCS_DM_V6_IP_NETWORK</th>
+ <th>NCS_DM_V4_IP_NETWORK</th>
+ <th>DR_NCS_DM_V4_IP_NETWORK</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.customer_name %></td>
+ <td><%= row.url %></td>
+ <td><%= row.ncs_sm_ip_address %></td>
+ <td><%= row.ncs_dm_v6_ip_address %></td>
+ <td><%= row.ncs_dm_v6_ip_network %></td>
+ <td><%= row.dr_ncs_dm_v6_ip_network %></td>
+ <td><%= row.ncs_dm_v4_ip_network %></td>
+ <td><%= row.dr_ncs_dm_v4_ip_network %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/mappedServicePort.ejs b/admportal/views/ucpe/mappedServicePort.ejs
new file mode 100644
index 00000000..1c55eb5c
--- /dev/null
+++ b/admportal/views/ucpe/mappedServicePort.ejs
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#mapped_service_port').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE Mapped Service Port</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="mapped_service_port" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*DEVICE_VENDOR_NAME</th>
+ <th>*DEVICE_MODEL</th>
+ <th>*SERVICE_PORT_NAME</th>
+ <th>*VNF_VENDOR_NAME</th>
+ <th>*VNF_MODEL</th>
+ <th>*PORT_NAME</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.device_vendor_name %></td>
+ <td><%= row.device_model %></td>
+ <td><%= row.service_port_name %></td>
+ <td><%= row.vnf_vendor_name %></td>
+ <td><%= row.vnf_model %></td>
+ <td><%= row.port_name %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/mcapServers.ejs b/admportal/views/ucpe/mcapServers.ejs
new file mode 100644
index 00000000..a51abd09
--- /dev/null
+++ b/admportal/views/ucpe/mcapServers.ejs
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#mcap_servers').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE MCAP Servers</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="mcap_servers" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*CUSTOMER_NAME</th>
+ <th>*MCAP_IP_ADDRESS</th>
+ <th>*MCAP_POLLER_IP_ADDRESS</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.customer_name %></td>
+ <td><%= row.mcap_ip_address %></td>
+ <td><%= row.mcap_poller_ip_address %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/ncsCredentials.ejs b/admportal/views/ucpe/ncsCredentials.ejs
new file mode 100644
index 00000000..f860b075
--- /dev/null
+++ b/admportal/views/ucpe/ncsCredentials.ejs
@@ -0,0 +1,180 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#ncs_server_credentials').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>NCS Server Credentials</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_ncs_credentials">
+ Add NCS Credentials
+ </button>
+ </div>
+ <% } %>
+
+ <table id="ncs_server_credentials" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*Customer Name</th>
+ <th>NCS Username</th>
+ <th>NCS Password</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.customer_name %></td>
+ <td><%= row.ncs_username %></td>
+ <td>*****</td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateNcsCredentials('<%= row.customer_name %>','<%= row.ncs_username %>','<%= row.ncs_password %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteNcsCredentials('<%= row.customer_name %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<% include ../partials/ncs_credentials %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitNcsCredentials(form)
+{
+ var errorMsg='';
+ var customer_name = '';
+ var ncs_username = '';
+ var ncs_password = '';
+ var confirm_ncs_password = '';
+
+ if ( form.name == 'addForm' )
+ {
+ customer_name = form.nf_customer_name;
+ ncs_username = form.nf_ncs_username;
+ ncs_password = form.nf_ncs_password;
+ confirm_ncs_password = form.nf_confirm_ncs_password;
+
+ if ( (customer_name.value == null) || (customer_name.value == "") || isblank(customer_name.value) )
+ {
+ errorMsg += 'Customer Name is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+ if ( ncs_password.value != confirm_ncs_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ else
+ {
+ customer_name = form.uf_customer_name;
+ ncs_username = form.uf_ncs_username;
+ ncs_password = form.uf_ncs_password;
+ confirm_ncs_password = form.uf_confirm_ncs_password;
+ if ( ncs_password.value != confirm_ncs_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ form.submit();
+}
+
+function updateNcsCredentials(customer_name,ncs_username,ncs_password) {
+
+ document.getElementById('uf_customer_name').value=customer_name;
+ document.getElementById('uf_ncs_username').value=ncs_username;
+ document.getElementById('uf_ncs_password').value=ncs_password;
+
+ $('#update_ncs_credentials').modal('show');
+}
+
+function deleteNcsCredentials(customer_name) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete NCS Credentials [ " + customer_name + " ]",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/ucpe/deleteNcsCredentials?customer_name=" + customer_name);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/nmInterfaces.ejs b/admportal/views/ucpe/nmInterfaces.ejs
new file mode 100644
index 00000000..50b15c4b
--- /dev/null
+++ b/admportal/views/ucpe/nmInterfaces.ejs
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#nm_interfaces').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE NM Interfaces</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="nm_interfaces" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*DEVICE_VENDOR_NAME</th>
+ <th>*DEVICE_MODEL</th>
+ <th>NM_VLAN_NUMBER</th>
+ <th>DEVICE_MANAGER_NM_LAN_INTERFACE</th>
+ <th>SWITCH_MANAGER_NM_LAN_INTERFACE</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.device_vendor_name %></td>
+ <td><%= row.device_model %></td>
+ <td><%= row.nm_lan_vlan_number %></td>
+ <td><%= row.device_manager_nm_lan_interface %></td>
+ <td><%= row.switch_manager_nm_lan_interface %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/phsCredentials.ejs b/admportal/views/ucpe/phsCredentials.ejs
new file mode 100644
index 00000000..508b5a25
--- /dev/null
+++ b/admportal/views/ucpe/phsCredentials.ejs
@@ -0,0 +1,202 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#phs_server_credentials').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>PHS Server Credentials</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_phs_credentials">
+ Add PHS Credentials
+ </button>
+ </div>
+ <% } %>
+
+ <table id="phs_server_credentials" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*Device Vendor Name</th>
+ <th>*Customer Name</th>
+ <th>*IP Addresses</th>
+ <th>PHS Username</th>
+ <th>PHS Password</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.device_vendor_name %></td>
+ <td><%= row.customer_name %></td>
+ <td><%= row.ip_addresses %></td>
+ <td><%= row.phs_username %></td>
+ <td>*****</td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updatePhsCredentials('<%=row.device_vendor_name %>','<%= row.customer_name %>','<%= row.ip_addresses %>','<%= row.phs_username %>','<%= row.phs_password %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deletePhsCredentials('<%= row.device_vendor_name %>', '<%= row.customer_name %>', '<%= row.ip_addresses %>' );">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<% include ../partials/phs_credentials %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitPhsCredentials(form)
+{
+ var errorMsg='';
+ var device_vendor_name = '';
+ var customer_name = '';
+ var ip_addresses = '';
+ var phs_username = '';
+ var phs_password = '';
+ var confirm_phs_password = '';
+
+ if ( form.name == 'addForm' )
+ {
+ device_vendor_name = form.nf_device_vendor_name;
+ customer_name = form.nf_customer_name;
+ ip_addresses = form.nf_ip_addresses;
+ phs_username = form.nf_phs_username;
+ phs_password = form.nf_phs_password;
+ confirm_phs_password = form.nf_confirm_phs_password;
+
+ if ( (device_vendor_name.value == null) || (device_vendor_name.value == "") || isblank(device_vendor_name.value) )
+ {
+ errorMsg += 'Device Vendor Name is required.<br>';
+ }
+ if ( (customer_name.value == null) || (customer_name.value == "") || isblank(customer_name.value) )
+ {
+ errorMsg += 'Customer Name is required.<br>';
+ }
+ if ( (ip_addresses.value == null) || (ip_addresses.value == "") || isblank(ip_addresses.value) ){
+ errorMsg += 'IP Addresses is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+
+ if ( phs_password.value != confirm_phs_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ else
+ {
+ device_vendor_name = form.uf_device_vendor_name;
+ customer_name = form.uf_customer_name;
+ ip_addresses = form.uf_ip_addresses;
+ phs_username = form.uf_phs_username;
+ phs_password = form.uf_phs_password;
+ confirm_phs_password = form.uf_confirm_phs_password;
+
+ if ( phs_password.value != confirm_phs_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ form.submit();
+}
+
+function updatePhsCredentials(device_vendor_name,customer_name,ip_addresses,phs_username,phs_password) {
+
+ document.getElementById('uf_device_vendor_name').value=device_vendor_name;
+ document.getElementById('uf_customer_name').value=customer_name;
+ document.getElementById('uf_ip_addresses').value=ip_addresses;
+ document.getElementById('uf_phs_username').value=phs_username;
+ document.getElementById('uf_phs_password').value=phs_password;
+
+ $('#update_phs_credentials').modal('show');
+}
+
+function deletePhsCredentials(device_vendor_name, customer_name, ip_addresses) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete PHS Credentials " + device_vendor_name + "|" + customer_name + "|" + ip_addresses,
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/ucpe/deletePhsCredentials?device_vendor_name=" + device_vendor_name
+ + "&customer_name=" + customer_name + "&ip_addresses=" + ip_addresses);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/phsServers.ejs b/admportal/views/ucpe/phsServers.ejs
new file mode 100644
index 00000000..1f28dbb2
--- /dev/null
+++ b/admportal/views/ucpe/phsServers.ejs
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#phs_servers').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE PHS Servers</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="phs_servers" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*DEVICE_VENDOR_NAME</th>
+ <th>*CUSTOMER_NAME</th>
+ <th>IP_ADDRESSES</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.device_vendor_name %></td>
+ <td><%= row.customer_name %></td>
+ <td><%= row.ip_addresses %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/physicalDeviceLogins.ejs b/admportal/views/ucpe/physicalDeviceLogins.ejs
new file mode 100644
index 00000000..0dd78d41
--- /dev/null
+++ b/admportal/views/ucpe/physicalDeviceLogins.ejs
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#device_logins').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE Physical Device Logins</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="device_logins" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*CUSTOMER_NAME</th>
+ <th>*DEVICE_VENDOR_NAME</th>
+ <th>*DEVICE_MODEL</th>
+ <th>*DEVICE_MANAGER_HASHED_PASSWORD</th>
+ <th>*SWITCH_MANAGER_HASHED_PASSWORD</th>
+ <th>*OS_HASHED_PASSWORD</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.customer_name %></td>
+ <td><%= row.device_vendor_name %></td>
+ <td><%= row.device_model %></td>
+ <td><%= row.device_manager_hashed_password %></td>
+ <td><%= row.switch_manager_hashed_password %></td>
+ <td><%= row.os_hashed_password %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/referenceData.ejs b/admportal/views/ucpe/referenceData.ejs
new file mode 100644
index 00000000..6196c46e
--- /dev/null
+++ b/admportal/views/ucpe/referenceData.ejs
@@ -0,0 +1,224 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#reference_data').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE Reference Data</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <table id="reference_data" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>REFERENCE_ID</th>
+ <th>STATUS</th>
+ <th>FILENAME</th>
+ <th>ATTUID</th>
+ <th>DATE</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% var i=0; retData.forEach( function(rowObj) { %>
+ <tr>
+ <td><%= rowObj.row.reference_id %></td>
+ <td><%= rowObj.row.status %></td>
+ <td>
+ <a data-toggle="collapse"
+ href="#collapseExample<%= i %>" aria-expanded="false"
+ aria-controls="collapseExample"><%= rowObj.row.filename %>
+ </a>
+ <div class="collapse" id="collapseExample<%= i %>">
+ <div class="well">
+ <pre><%= rowObj.filecontent %></pre>
+ </div>
+ </div>
+ </td>
+ <td><%= rowObj.row.attuid %></td>
+ <td><%= rowObj.row.ts %></td>
+ <% if(priv == 'A' ) { %>
+ <td>
+ <% if ( rowObj.row.status == 'pending' ) { %>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="importReferenceData('<%= rowObj.row.reference_id %>','<%= rowObj.row.status %>','<%= rowObj.row.filename %>','<%= rowObj.row.ts %>');">Import</button>
+ <% } %>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteReferenceData('<%= rowObj.row.reference_id %>','<%= rowObj.row.filename %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% i++; }); %>
+ </tbody>
+ </table>
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:0px 25px;">
+ <form method="POST" action="/ucpe/uploadReferenceData" enctype="multipart/form-data">
+ <div class="form-group">
+ <label for="dest">File input</label>
+ <input name="filename" type="file" id="dest">
+ <p class="help-block">Choose a file to upload.</p>
+ </div>
+ <button type="button" class="btn btn-default"
+ onclick="uploadFile(this.form);">Upload File</button>
+ </form>
+ </div>
+ <% } %>
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+
+function getVnfData(vnf_name,vnf_type,svc_request_id)
+{
+ location.assign("/mobility/viewVnfData?vnf_name=" + vnf_name + "&vnf_type=" + vnf_type );
+ return;
+}
+function importReferenceData(reference_id,status,filename,ts)
+{
+ var alertMessage = '';
+ if ( status != 'pending' )
+ {
+ bootbox.alert("Upload Status must be in 'pending' state.");
+ return;
+ }
+ if ( filename.substring(0,11) == 'ucpedevice_' ){
+ alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_MAPPED_SERVICE_PORT and UCPE_SERVICE_PORT tables?";
+ }else if ( filename.substring(0,14) == 'ucpeapilogins_' ){
+ alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_VNF_LOGINS, UCPE_PHYSICAL_DEVICE_LOGINS and UCPE_API_LOGINS tables?";
+ }else if ( filename.substring(0,17) == 'ucpenminterfaces_' ){
+ alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_VNF_NM_INTERFACES and UCPE_NM_INTERFACES tables?";
+ }else if ( filename.substring(0,15) == 'ucpephsservers_' ){
+ alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_PHS_SERVERS table?";
+ }else if ( filename.substring(0,15) == 'ucpencsservers_' ){
+ alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_CUSTOMER_NCS_SERVERS table?";
+ }else if ( filename.substring(0,15) == 'ucpevnfcatalog_' ){
+ alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_VNF_MODELS, UCPE_VNF_MODEL_SOFTWARE and UCPE_VNF_MODEL_FEATURES tables?";
+ }else if ( filename.substring(0,16) == 'ucpemcapservers_' ){
+ alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_MCAP_SERVERS table?";
+ }else if ( filename.substring(0,23) == 'ucpechainingtopologies_' ){
+ alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_CHAINING_TOPOLOGIES table?";
+ }else if ( filename.substring(0,16) == 'ucpevnfportinfo_' ){
+ alertMessage = "Are you sure you want to import file:" + filename + " and replace the UCPE_VNF_PORT and UCPE_MAP_TO_DEVICE tables?";
+ } else {
+ bootbox.alert('Invalid Filename in database: ' + filename);
+ return;
+ }
+ bootbox.confirm({
+ message: alertMessage,
+ callback: function(result) {
+ if ( result )
+ {
+ if ( filename.substring(0,11) == 'ucpedevice_' ){
+ location.assign("/ucpe/importUcpeDevices?id=" + reference_id + "&filename=" + filename + "&status=" + status);
+ }else if ( filename.substring(0,14) == 'ucpeapilogins_' ){
+ location.assign("/ucpe/importApiLogins?id=" + reference_id + "&filename=" + filename + "&status=" + status);
+ }else if ( filename.substring(0,17) == 'ucpenminterfaces_' ){
+ location.assign("/ucpe/importNmInterfaces?id=" + reference_id + "&filename=" + filename + "&status=" + status);
+ }else if ( filename.substring(0,15) == 'ucpephsservers_' ){
+ location.assign("/ucpe/importPhsServers?id=" + reference_id + "&filename=" + filename + "&status=" + status);
+ }else if ( filename.substring(0,15) == 'ucpencsservers_' ){
+ location.assign("/ucpe/importNcsServers?id=" + reference_id + "&filename=" + filename + "&status=" + status);
+ }else if ( filename.substring(0,15) == 'ucpevnfcatalog_' ){
+ location.assign("/ucpe/importVnfCatalog?id=" + reference_id + "&filename=" + filename + "&status=" + status);
+ }else if ( filename.substring(0,16) == 'ucpemcapservers_' ){
+ location.assign("/ucpe/importMcapServers?id=" + reference_id + "&filename=" + filename + "&status=" + status);
+ }else if ( filename.substring(0,23) == 'ucpechainingtopologies_' ){
+ location.assign("/ucpe/importChainTopo?id=" + reference_id + "&filename=" + filename + "&status=" + status);
+ }else if ( filename.substring(0,16) == 'ucpevnfportinfo_' ){
+ location.assign("/ucpe/importVnfPortInfo?id=" + reference_id + "&filename=" + filename + "&status=" + status);
+ } else {
+ bootbox.alert('Invalid Filename: ' + filename);
+ return;
+ }
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+function deleteReferenceData(reference_id,filename)
+{
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete uploaded file [" + filename + "]? (This action will not effect the database.)",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/ucpe/deleteReferenceData?id=" + reference_id + "&filename=" + filename);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/serviceManagerCredentials.ejs b/admportal/views/ucpe/serviceManagerCredentials.ejs
new file mode 100644
index 00000000..9e156f2a
--- /dev/null
+++ b/admportal/views/ucpe/serviceManagerCredentials.ejs
@@ -0,0 +1,171 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#service_manager_credentials').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>Service Manager Credentials</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <% if(priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_service_manager_credentials">
+ Add Service Manager Credentials
+ </button>
+ </div>
+ <% } %>
+
+ <table id="service_manager_credentials" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Service Manager Username</th>
+ <th>Service Manager Password</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.service_manager_username %></td>
+ <td>*****</td>
+ <% if(priv == 'A') { %>
+ <td>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateServiceManagerCredentials('<%=row.service_manager_username %>','<%= row.service_manager_password %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteServiceManagerCredentials('<%= row.service_manager_username %>', '<%= row.service_manager_password %>');">Delete</button>
+ </td>
+ <% } %>
+
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<% include ../partials/service_manager_credentials %>
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+<script type="text/javascript">
+function submitServiceManagerCredentials(form)
+{
+ var errorMsg='';
+ var service_manager_username = '';
+ var service_manager_password = '';
+ var confirm_service_manager_password = '';
+
+ if ( form.name == 'addForm' )
+ {
+ service_manager_username = form.nf_service_manager_username;
+ service_manager_password = form.nf_service_manager_password;
+ confirm_service_manager_password = form.nf_confirm_service_manager_password;
+
+ if ( service_manager_password.value != confirm_service_manager_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ else
+ {
+ service_manager_username = form.uf_service_manager_username;
+ service_manager_password = form.uf_service_manager_password;
+ confirm_service_manager_password = form.uf_confirm_service_manager_password;
+
+ if ( service_manager_password.value != confirm_service_manager_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ form.submit();
+}
+
+function updateServiceManagerCredentials(service_manager_username,service_manager_password) {
+
+ document.getElementById('uf_service_manager_username').value=service_manager_username;
+ document.getElementById('uf_service_manager_password').value=service_manager_password;
+
+ $('#update_service_manager_credentials').modal('show');
+}
+
+function deleteServiceManagerCredentials(service_manager_username, service_manager_password) {
+
+ var url_string = encodeURI("/ucpe/deleteServiceManagerCredentials?service_manager_username=" + service_manager_username
+ + "&service_manager_password=" + service_manager_password);
+
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete Service Manager Credentials? " + service_manager_username,
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign(url_string);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+
+</script>
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/servicePort.ejs b/admportal/views/ucpe/servicePort.ejs
new file mode 100644
index 00000000..80537133
--- /dev/null
+++ b/admportal/views/ucpe/servicePort.ejs
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#service_port').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE Service Port</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+ <table id="service_port" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*DEVICE_VENDOR_NAME</th>
+ <th>*DEVICE_MODEL</th>
+ <th>*SERVICE_PORT_NAME</th>
+ <th>PHYSICAL_PORT_NAME</th>
+ <th>PHYSICAL_SPEED</th>
+ <th>PHYSICAL_SPEED_UNITS</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.device_vendor_name %></td>
+ <td><%= row.device_model %></td>
+ <td><%= row.service_port_name %></td>
+ <td><%= row.physical_port_name %></td>
+ <td><%= row.physical_speed %></td>
+ <td><%= row.physical_speed_units %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/vnfLogins.ejs b/admportal/views/ucpe/vnfLogins.ejs
new file mode 100644
index 00000000..f5e88731
--- /dev/null
+++ b/admportal/views/ucpe/vnfLogins.ejs
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vnf_logins').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE VNF Logins</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="vnf_logins" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*CUSTOMER_NAME</th>
+ <th>*VNF_VENDOR_NAME</th>
+ <th>*VNF_MODEL</th>
+ <th>HASHED_PASSWORD</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.customer_name %></td>
+ <td><%= row.vnf_vendor_name %></td>
+ <td><%= row.vnf_model %></td>
+ <td><%= row.hashed_password %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/vnfMapDevice.ejs b/admportal/views/ucpe/vnfMapDevice.ejs
new file mode 100644
index 00000000..fbfa2ba5
--- /dev/null
+++ b/admportal/views/ucpe/vnfMapDevice.ejs
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vnf_map_to_device').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE VNF Map to Device</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="vnf_map_to_device" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*VNF_VENDOR_NAME</th>
+ <th>*VNF_MODEL</th>
+ <th>*SERVICE_PORT_NAME</th>
+ <th>*DEVICE_VENDOR_NAME</th>
+ <th>*DEVICE_MODEL</th>
+ <th>*MAPPED_SERVICE_PORT_NAME</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.vnf_vendor_name %></td>
+ <td><%= row.vnf_model %></td>
+ <td><%= row.service_port_name %></td>
+ <td><%= row.device_vendor_name %></td>
+ <td><%= row.device_model %></td>
+ <td><%= row.mapped_service_port_name %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/vnfModelFeatures.ejs b/admportal/views/ucpe/vnfModelFeatures.ejs
new file mode 100644
index 00000000..40151790
--- /dev/null
+++ b/admportal/views/ucpe/vnfModelFeatures.ejs
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vnf_model_features').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE VNF Model Features</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="vnf_model_features" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*ATT PART NUMBER</th>
+ <th>*VNF_FEATURE</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.att_part_number %></td>
+ <td><%= row.vnf_feature %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/vnfModelSoftware.ejs b/admportal/views/ucpe/vnfModelSoftware.ejs
new file mode 100644
index 00000000..f82b5b8a
--- /dev/null
+++ b/admportal/views/ucpe/vnfModelSoftware.ejs
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vnf_model_software').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE VNF Model Software</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="vnf_model_software" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*ATT PART NUMBER</th>
+ <th>*SOFTWARE_VERSION</th>
+ <th>SOFTWARE_VERSION_STATE</th>
+ <th>SOFTWARE_FILENAME</th>
+ <th>SOFTWARE_FILETYPE</th>
+ <th>FILE_MD5_VALUE</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.att_part_number %></td>
+ <td><%= row.software_version %></td>
+ <td><%= row.software_version_state %></td>
+ <td><%= row.software_filename %></td>
+ <td><%= row.software_filetype %></td>
+ <td><%= row.file_md5_value %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/vnfModels.ejs b/admportal/views/ucpe/vnfModels.ejs
new file mode 100644
index 00000000..df71306b
--- /dev/null
+++ b/admportal/views/ucpe/vnfModels.ejs
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vnf_models').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE VNF Models</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="vnf_models" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*ATT PART NUMBER</th>
+ <th>VNF_TYPE</th>
+ <th>VENDOR_NAME</th>
+ <th>VENDOR_PART_NUMBER</th>
+ <th>VENDOR_MODEL</th>
+ <th>VCPU_DEFAULT</th>
+ <th>VCPU_MIN</th>
+ <th>VCPU_MAX</th>
+ <th>VMEMORY_DEFAULT</th>
+ <th>VMEMORY_UNITS</th>
+ <th>VMEMORY_MIN</th>
+ <th>VMEMORY_MAX</th>
+ <th>VDISK_DEFAULT</th>
+ <th>VDISK_UNITS</th>
+ <th>VDISK_MIN</th>
+ <th>VDISK_MAX</th>
+ <th>SPEED_UNITS</th>
+ <th>SPEED</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.att_part_number %></td>
+ <td><%= row.vnf_type %></td>
+ <td><%= row.vendor_name %></td>
+ <td><%= row.vendor_part_number %></td>
+ <td><%= row.vendor_model %></td>
+ <td><%= row.vcpu_default %></td>
+ <td><%= row.vcpu_min %></td>
+ <td><%= row.vcpu_max %></td>
+ <td><%= row.vmemory_default %></td>
+ <td><%= row.vmemory_units %></td>
+ <td><%= row.vmemory_min %></td>
+ <td><%= row.vmemory_max %></td>
+ <td><%= row.vdisk_default %></td>
+ <td><%= row.vdisk_units %></td>
+ <td><%= row.vdisk_min %></td>
+ <td><%= row.vdisk_max %></td>
+ <td><%= row.speed_units %></td>
+ <td><%= row.speed %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/vnfNmInterfaces.ejs b/admportal/views/ucpe/vnfNmInterfaces.ejs
new file mode 100644
index 00000000..3430f6b0
--- /dev/null
+++ b/admportal/views/ucpe/vnfNmInterfaces.ejs
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vnf_nm_interfaces').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE VNF NM Interfaces</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="vnf_nm_interfaces" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*DEVICE_VENDOR_NAME</th>
+ <th>*DEVICE_MODEL</th>
+ <th>*VNF_VENDOR_NAME</th>
+ <th>*VNF_MODEL</th>
+ <th>NM_LAN_INTERFACE</th>
+ <th>NM_LOOPBACK_INTERFACE</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.device_vendor_name %></td>
+ <td><%= row.device_model %></td>
+ <td><%= row.vnf_vendor_name %></td>
+ <td><%= row.vnf_model %></td>
+ <td><%= row.nm_lan_interface %></td>
+ <td><%= row.nm_loopback_interface %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/ucpe/vnfPorts.ejs b/admportal/views/ucpe/vnfPorts.ejs
new file mode 100644
index 00000000..834eada9
--- /dev/null
+++ b/admportal/views/ucpe/vnfPorts.ejs
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>SDN-C AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#vnf_ports').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+<body>
+
+<div class="well well-sm">
+<h3>uCPE VNF Ports</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'>
+ <%
+ for ( x in result.msg ){ %>
+ <div><%= result.msg[x] %></div>
+ <% } %>
+ </div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+
+<!--
+ <% if (priv == 'A'){ %>
+ <div class="actions" style="padding:15px 0px;">
+ <button class="btn btn-primary" data-toggle="modal" data-target="#add_vnf_profile">
+ Add VNF Profile
+ </button>
+ </div>
+ <% } %>
+-->
+
+ <table id="vnf_ports" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>*VNF_VENDOR_NAME</th>
+ <th>*VNF_MODEL</th>
+ <th>*SERVICE_PORT_NAME</th>
+ <th>PHYSICAL_PORT_NAME</th>
+ </tr>
+ </thead>
+ <tbody>
+ <% rows.forEach( function(row) { %>
+ <tr>
+ <td><%= row.vnf_vendor_name %></td>
+ <td><%= row.vnf_model %></td>
+ <td><%= row.service_port_name %></td>
+ <td><%= row.physical_port_name %></td>
+ </tr>
+ <% }); %>
+ </tbody>
+ </table>
+
+</div>
+
+<footer>
+ <% include ../partials/footer %>
+</footer>
+
+
+</body>
+</html>
+
diff --git a/admportal/views/user/list.ejs b/admportal/views/user/list.ejs
new file mode 100644
index 00000000..4a4e909c
--- /dev/null
+++ b/admportal/views/user/list.ejs
@@ -0,0 +1,194 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <% include ../partials/head %>
+ <% include ../partials/header %>
+ <script type="text/javascript" src="/javascripts/admportal.js" async></script>
+ <title>AdminPortal</title>
+<script class="init">
+ $(document).ready(function() {
+ $('#user_admin').DataTable( {
+ "order": [[ 0, "asc" ]]
+ } );
+} );
+</script>
+
+</head>
+
+<body>
+
+<div class="well well-sm">
+<h3>User Administration</h3>
+</div>
+
+<% if ( typeof result != 'undefined' ) {
+ if (result.code.length > 0) {
+ if ( result.code == 'success' ) { %>
+ <div class='alert alert-success' role='alert'><%=result.msg %></div>
+ <% } else { %>
+ <div class='alert alert-danger' role='danger'><%=result.msg %></div>
+ <% } %>
+ <% } %>
+<% } %>
+
+<% if( typeof privilege != 'undefined'){
+ var priv = privilege.privilege;
+} else {
+ var priv = 'A';
+} %>
+
+
+<div class="container-fluid">
+ <div class="actions" style="padding:15px 0px;">
+ <% if(priv == 'A') { %>
+ <button class="btn btn-primary" data-toggle="modal" data-target="#newUserModal">Add User</button>
+ <% } %>
+
+ </div>
+ <div class="content">
+ <table id="user_admin" class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>Email</th>
+ <th>Password</th>
+ <th>Privilege</th>
+ <% if(priv == 'A'){ %>
+ <th>Action</th>
+ <% } %>
+ </tr>
+ </thead>
+ <tbody>
+ <% if (rows) {
+ rows.forEach(function(row) { %>
+ <tr>
+ <td><%= row.email %></td>
+ <td>**********</td>
+ <td>
+ <% if(row.privilege == 'A'){ %>
+ Administrator
+ <% } else if (row.privilege == 'R') { %>
+ Readonly
+ <% } else { %>
+ unknown
+ <% } %>
+ </td>
+ <% if(priv == 'A') { %>
+ <td><form name="rowform">
+ <input type="hidden" name="rfemail" id="rfemail" value="<%= row.email %>"</input>
+ </form>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="updateRequest('<%=row.email %>', '<%=row.password %>', '<%=row.privilege %>');">Update</button>
+ <button type="button" class="btn btn-default btn-xs"
+ onclick="deleteRequest('<%=row.email %>');">Delete</button>
+ </td>
+ <% } %>
+ </tr>
+ <% }); }; %>
+ </tbody>
+ </table>
+ </div>
+
+ <% include ../partials/newuserform %>
+ <% include ../partials/userform %>
+
+ <footer>
+ <% include ../partials/footer %>
+ </footer>
+
+<script type="text/javascript">
+
+function submitUserAdmin(form)
+{
+ var errorMsg='';
+ var email = '';
+ var password = '';
+ var confirm_password = '';
+ var privilege = '';
+
+ if ( form.name == 'addForm' )
+ {
+ email = form.nf_email;
+ password = form.nf_password;
+ confirm_password = form.nf_confirm_password;
+ privilege = form.nf_privilege;
+
+ if ( (email.value == null) || (email.value == "") || isblank(email.value) )
+ {
+ errorMsg += 'Email is required.<br>';
+ }
+ if( errorMsg.length > 0 ) {
+ bootbox.alert(errorMsg);
+ return;
+ }
+
+ if ( password.value != confirm_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ else
+ {
+ email = form.uf_email;
+ password = form.uf_password;
+ confirm_password = form.uf_confirm_password;
+ privilege = form.uf_privilege;
+
+ if ( (email.value == null) || (email.value == "") || isblank(email.value) )
+ {
+ errorMsg += 'Email is required.<br>';
+ }
+ if ( password.value != confirm_password.value )
+ {
+ bootbox.alert('Passwords do not match.');
+ return;
+ }
+ }
+ form.submit();
+}
+
+function deleteRequest(email) {
+
+ bootbox.confirm({
+ message: "Are you sure you want to delete user [" + email + "] ?",
+ callback: function(result) {
+ if ( result )
+ {
+ location.assign("/user/deleteUser?email=" + email);
+ }
+ return;
+ },
+ buttons: {
+ cancel: {
+ label: "Cancel"
+ },
+ confirm: {
+ label: "Yes"
+ }
+ }
+ });
+}
+function updateRequest(email,password,privilege) {
+
+ document.getElementById('uf_email').value = email;
+ document.getElementById('uf_key_email').value = email;
+ document.getElementById('uf_password').value = password;
+ document.getElementById('uf_confirm_password').value = password;
+ if ( privilege == "A" ){
+ document.getElementById('uf_privilege').value = 'admin';
+ }else if (priv == "R"){
+ document.getElementById('uf_privilege').value = 'readonly';
+ }else{
+ document.getElementById('uf_privilege').value = 'admin';
+ }
+ document.getElementById('uf_action').value = "/user/updateUser";
+ $('#myUserModal').modal('show');
+
+}
+</script>
+
+</body>
+</html>
+