This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
lynxis lazus gerrit-no-reply at lists.osmocom.orglynxis lazus has uploaded this change for review. ( https://gerrit.osmocom.org/10378 Change subject: sgsn: create 3 instances of BSSGP at the same time ...................................................................... sgsn: create 3 instances of BSSGP at the same time Allows to use different BSSGP connection within a single test. Change-Id: I01d7f264a0a52e248d6e754485c807266c0b14bf --- M sgsn/SGSN_Tests.ttcn 1 file changed, 66 insertions(+), 57 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/78/10378/1 diff --git a/sgsn/SGSN_Tests.ttcn b/sgsn/SGSN_Tests.ttcn index c787310..92f139f 100644 --- a/sgsn/SGSN_Tests.ttcn +++ b/sgsn/SGSN_Tests.ttcn @@ -51,8 +51,11 @@ BssgpConfig cfg }; +type record length(3) of GbInstance GbInstances; +type record length(3) of BssgpCellId BssgpCellIds; + type component test_CT { - var GbInstance g_gb[3]; + var GbInstances g_gb; var GSUP_Emulation_CT vc_GSUP; var IPA_Emulation_CT vc_GSUP_IPA; @@ -92,21 +95,21 @@ OCT4 tlli, OCT4 tlli_old optional, RoutingAreaIdentificationV ra optional, - BssgpCellId bssgp_cell_id, + BssgpCellIds bssgp_cell_id, AuthVector vec optional, SGSN_ConnHdlrNetworkPars net, float t_guard }; -private function f_init_gb(inout GbInstance gb, charstring id) runs on test_CT { - gb.vc_NS := NS_CT.create(id & "-NS"); - gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP"); +private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT { + gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset)); + gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset)); /* connect lower end of BSSGP emulation with NS upper port */ connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP); /* connect lower end of NS emulation to NS codec port (on top of IPL4) */ map(gb.vc_NS:NSCP, system:NS_CODEC_PORT); - gb.vc_NS.start(NSStart()); + gb.vc_NS.start(NSStart(offset)); gb.vc_BSSGP.start(BssgpStart(gb.cfg)); } @@ -215,7 +218,9 @@ sgsn_role := false }; - f_init_gb(g_gb[0], "SGSN_Test-Gb0"); + f_init_gb(g_gb[0], "SGSN_Test-Gb0", 0); + f_init_gb(g_gb[1], "SGSN_Test-Gb0", 1); + f_init_gb(g_gb[2], "SGSN_Test-Gb0", 2); f_init_gsup("SGSN_Test"); f_init_gtp("SGSN_Test"); f_init_vty(); @@ -225,7 +230,7 @@ type function void_fn(charstring id) runs on BSSGP_ConnHdlr; /* helper function to create, connect and start a BSSGP_ConnHdlr component */ -function f_start_handler(void_fn fn, charstring id, GbInstance gb, integer imsi_suffix, +function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix, float t_guard := 30.0) runs on test_CT return BSSGP_ConnHdlr { var BSSGP_ConnHdlr vc_conn; @@ -243,15 +248,19 @@ tlli := f_gprs_tlli_random(), tlli_old := omit, ra := omit, - bssgp_cell_id := gb.cfg.cell_id, + bssgp_cell_id := { gb[0].cfg.cell_id, gb[1].cfg.cell_id, gb[2].cfg.cell_id }, vec := omit, net := net_pars, t_guard := t_guard }; vc_conn := BSSGP_ConnHdlr.create(id); - connect(vc_conn:BSSGP[0], gb.vc_BSSGP:BSSGP_SP); - connect(vc_conn:BSSGP_PROC[0], gb.vc_BSSGP:BSSGP_PROC); + connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP:BSSGP_SP); + connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP:BSSGP_PROC); + connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP:BSSGP_SP); + connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP:BSSGP_PROC); + connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP:BSSGP_SP); + connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP:BSSGP_PROC); connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT); connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC); @@ -277,7 +286,7 @@ g_pars := pars; /* register with BSSGP core */ - f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id); + f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]); /* tell GSUP dispatcher to send this IMSI to us */ f_create_gsup_expect(hex2str(g_pars.imsi)); /* tell GTP dispatcher to send this IMSI to us */ @@ -408,9 +417,9 @@ function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr { /* mandatory IE */ var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification); - if (not (g_pars.bssgp_cell_id.ra_id.lai.mcc_mnc == aa_plmn)) { + if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) { setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn) - & "; expected " & hex2str(g_pars.bssgp_cell_id.ra_id.lai.mcc_mnc)); + & "; expected " & hex2str(g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc)); mtc.stop; } g_pars.ra := aa.routingAreaIdentification; @@ -515,7 +524,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb[0], 1); + vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1); vc_conn.done; } @@ -523,7 +532,7 @@ var BSSGP_ConnHdlr vc_conn; f_init('023042'H); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb[0], 1001); + vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001); vc_conn.done; } @@ -535,7 +544,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb[0], 1002); + vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002); vc_conn.done; } @@ -547,7 +556,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb[0], 1003); + vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003); vc_conn.done; } @@ -573,7 +582,7 @@ testcase TC_attach_auth_id_timeout() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_auth_id_timeout), testcasename(), g_gb[0], 2, 40.0); + vc_conn := f_start_handler(refers(f_TC_attach_auth_id_timeout), testcasename(), g_gb, 2, 40.0); vc_conn.done; } @@ -593,7 +602,7 @@ testcase TC_attach_auth_sai_timeout() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb[0], 3); + vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3); vc_conn.done; } @@ -614,7 +623,7 @@ testcase TC_attach_auth_sai_reject() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb[0], 4); + vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4); vc_conn.done; } @@ -643,7 +652,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb[0], 5); + vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5); vc_conn.done; } @@ -673,7 +682,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb[0], 6); + vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6); vc_conn.done; } @@ -698,7 +707,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb[0], 7); + vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7); vc_conn.done; } @@ -722,7 +731,7 @@ f_init(); f_sleep(1.0); f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all"); - vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 8); + vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8); vc_conn.done; } @@ -732,7 +741,7 @@ /* Simulate a foreign IMSI */ g_pars.imsi := '001010123456789'H; - f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id); + f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]); g_pars.net.expect_auth := false; @@ -757,10 +766,10 @@ f_sleep(1.0); f_vty_config(SGSNVTY, "sgsn", "auth-policy closed"); /* test with foreign IMSI: Must Reject */ - vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb[0], 9); + vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9); vc_conn.done; /* test with home IMSI: Must Accept */ - vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 10); + vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10); vc_conn.done; } @@ -781,7 +790,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb[0], 11); + vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11); vc_conn.done; } @@ -810,7 +819,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb[0], 12); + vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12); vc_conn.done; } @@ -855,7 +864,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb[0], 13); + vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13); vc_conn.done; } @@ -867,7 +876,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb[0], 14); + vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14); vc_conn.done; } @@ -882,7 +891,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb[0], 15); + vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15); vc_conn.done; } @@ -897,7 +906,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb[0], 16); + vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16); vc_conn.done; } @@ -1187,7 +1196,7 @@ testcase TC_attach_pdp_act() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb[0], 17); + vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17); vc_conn.done; } @@ -1215,7 +1224,7 @@ testcase TC_pdp_act_unattached() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb[0], 18); + vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18); vc_conn.done; } @@ -1234,7 +1243,7 @@ testcase TC_attach_pdp_act_user() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb[0], 19); + vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19); vc_conn.done; } @@ -1253,7 +1262,7 @@ testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb[0], 20); + vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20); vc_conn.done; } @@ -1274,7 +1283,7 @@ testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user_deact_mo), testcasename(), g_gb[0], 21); + vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user_deact_mo), testcasename(), g_gb, 21); vc_conn.done; } @@ -1295,7 +1304,7 @@ testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user_deact_mt), testcasename(), g_gb[0], 22); + vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user_deact_mt), testcasename(), g_gb, 22); vc_conn.done; } @@ -1314,7 +1323,7 @@ testcase TC_attach_second_attempt() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb[0], 22); + vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22); vc_conn.done; } @@ -1354,7 +1363,7 @@ var BSSGP_ConnHdlr vc_conn; g_use_echo := true f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_restart_ctr_echo), testcasename(), g_gb[0], 23, 30.0); + vc_conn := f_start_handler(refers(f_TC_attach_restart_ctr_echo), testcasename(), g_gb, 23, 30.0); vc_conn.done; g_use_echo := false } @@ -1394,7 +1403,7 @@ testcase TC_attach_restart_ctr_create() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_restart_ctr_create), testcasename(), g_gb[0], 24, 30.0); + vc_conn := f_start_handler(refers(f_TC_attach_restart_ctr_create), testcasename(), g_gb, 24, 30.0); vc_conn.done; } @@ -1430,7 +1439,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_mt_t3395_expire), testcasename(), g_gb[0], 25, 60.0); + vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_mt_t3395_expire), testcasename(), g_gb, 25, 60.0); vc_conn.done; } @@ -1478,7 +1487,7 @@ testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT { var BSSGP_ConnHdlr vc_conn; f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user_error_ind_ggsn), testcasename(), g_gb[0], 26); + vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user_error_ind_ggsn), testcasename(), g_gb, 26); vc_conn.done; } @@ -1490,7 +1499,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb[0], 31); + vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31); vc_conn.done; } @@ -1521,7 +1530,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb[0], 29); + vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29); vc_conn.done; } @@ -1551,7 +1560,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw), testcasename(), g_gb[0], 30); + vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw), testcasename(), g_gb, 30); vc_conn.done; } @@ -1567,7 +1576,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_unknown_subscriber_update), testcasename(), g_gb[0], 30); + vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_unknown_subscriber_update), testcasename(), g_gb, 30); vc_conn.done; } @@ -1586,7 +1595,7 @@ var charstring imsi := hex2str(f_gen_imsi(id)); f_init(); - vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb[0], id); + vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id); vc_conn.done; f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*"); @@ -1633,7 +1642,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach_no_imei_response), testcasename(), g_gb[0], 32, 60.0); + vc_conn := f_start_handler(refers(f_TC_attach_no_imei_response), testcasename(), g_gb, 32, 60.0); vc_conn.done; } @@ -1681,7 +1690,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach_no_imsi_response), testcasename(), g_gb[0], 35, 60.0); + vc_conn := f_start_handler(refers(f_TC_attach_no_imsi_response), testcasename(), g_gb, 35, 60.0); vc_conn.done; } @@ -1699,7 +1708,7 @@ f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb[0], id); + vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id); vc_conn.done; f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*"); @@ -1714,7 +1723,7 @@ f_bssgp_client_unregister(g_pars.imsi); /* Simulate a foreign IMSI */ g_pars.imsi := '001010123456789'H; - f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id); + f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]); /* there is no auth */ g_pars.net.expect_auth := false; @@ -1753,11 +1762,11 @@ f_vty_config(SGSNVTY, "sgsn", "auth-policy closed"); f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789"); /* test with foreign IMSI: Must Reject */ - vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb[0], 9); + vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9); vc_conn.done; f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456789"); /* test with same IMSI: Must Accept */ - vc_conn := f_start_handler(refers(f_TC_attach_closed_imsi_added), testcasename(), g_gb[0], 10); + vc_conn := f_start_handler(refers(f_TC_attach_closed_imsi_added), testcasename(), g_gb, 10); vc_conn.done; } @@ -1794,7 +1803,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); f_sleep(1.0); - vc_conn := f_start_handler(refers(f_TC_attach_check_complete_resend), testcasename(), g_gb[0], 36, 60.0); + vc_conn := f_start_handler(refers(f_TC_attach_check_complete_resend), testcasename(), g_gb, 36, 60.0); vc_conn.done; } -- To view, visit https://gerrit.osmocom.org/10378 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-MessageType: newchange Gerrit-Change-Id: I01d7f264a0a52e248d6e754485c807266c0b14bf Gerrit-Change-Number: 10378 Gerrit-PatchSet: 1 Gerrit-Owner: lynxis lazus <lynxis at fe80.eu> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180807/e032d863/attachment.htm>