<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/23711">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">lots of file definitions for classic SIM and USIM<br><br>Change-Id: I91475df4a5eaca423473aaebba8c69c54c9a0c1a<br>---<br>M pySim/ts_31_102.py<br>M pySim/ts_51_011.py<br>2 files changed, 490 insertions(+), 31 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim/ts_31_102.py b/pySim/ts_31_102.py</span><br><span>index 320a2cd..1558d8d 100644</span><br><span>--- a/pySim/ts_31_102.py</span><br><span>+++ b/pySim/ts_31_102.py</span><br><span>@@ -6,6 +6,7 @@</span><br><span> </span><br><span> #</span><br><span> # Copyright (C) 2020 Supreeth Herle <herlesupreeth@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2021 Harald Welte <laforge@osmocom.org></span><br><span> #</span><br><span> # This program is free software: you can redistribute it and/or modify</span><br><span> # it under the terms of the GNU General Public License as published by</span><br><span>@@ -270,10 +271,14 @@</span><br><span> </span><br><span> from struct import unpack, pack</span><br><span> from construct import *</span><br><span style="color: hsl(0, 100%, 40%);">-from pySim.construct import HexAdapter</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.construct import LV, HexAdapter, BcdAdapter</span><br><span> from pySim.filesystem import *</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.ts_102_221 import EF_ARR</span><br><span> from pySim.ts_51_011 import EF_IMSI, EF_xPLMNwAcT, EF_SPN, EF_CBMI, EF_ACC, EF_PLMNsel, EF_AD</span><br><span style="color: hsl(0, 100%, 40%);">-from pySim.ts_51_011 import EF_CBMID, EF_CBMIR</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.ts_51_011 import EF_CBMID, EF_CBMIR, EF_ADN, EF_SMS, EF_MSISDN, EF_SMSP, EF_SMSS</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.ts_51_011 import EF_SMSR, EF_DCK, EF_EXT, EF_CNL, EF_OPL, EF_MBI, EF_MWIS</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.ts_51_011 import EF_MMSN, EF_MMSICP, EF_MMSUP, EF_MMSUCP, EF_VGCS, EF_VGCSS, EF_NIA</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.ts_51_011 import EF_ACMmax, EF_AAeM, EF_eMLPP, EF_CMI</span><br><span> </span><br><span> import pySim.ts_102_221</span><br><span> </span><br><span>@@ -422,8 +427,8 @@</span><br><span> </span><br><span> # TS 31.103 Section 4.2.7</span><br><span> class EF_UST(TransparentEF):</span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, fid='6f38', sfid=0x04, name='EF.UST', desc='USIM Service Table'):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, size={1,17})</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f38', sfid=0x04, name='EF.UST', desc='USIM Service Table', size={1,17}):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span>         # add those commands to the general commands of a TransparentEF</span><br><span>         self.shell_commands += [self.AddlShellCommands()]</span><br><span>     def _decode_bin(self, in_bin):</span><br><span>@@ -464,23 +469,182 @@</span><br><span>                  desc='Emergency Call Codes'):</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len={4,20})</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.17</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_LOCI(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f7e', sfid=0x0b, name='EF.LOCI', desc='Locationn information', size={11,11}):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('tmsi'/HexAdapter(Bytes(4)), 'lai'/HexAdapter(Bytes(5)), 'rfu'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'lu_status'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.23</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_PSLOCI(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f73', sfid=0x0c, name='EF.PSLOCI', desc='PS Locationn information', size={14,14}):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('ptmsi'/HexAdapter(Bytes(4)), 'ptmsi_sig'/HexAdapter(Bytes(3)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'rai'/HexAdapter(Bytes(6)), 'rau_status'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.33</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_ICI(CyclicEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f80', sfid=0x14, name='EF.ICI', rec_len={28,48},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Incoming Call Information'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('alpha_id'/Bytes(this._.total_len-28),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'len_of_bcd_contents'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'ton_npi'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'call_number'/BcdAdapter(Bytes(10)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'cap_cfg2_record_id'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'ext5_record_id'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'date_and_time'/BcdAdapter(Bytes(7)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'duration'/Int24ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'status'/Byte,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'link_to_phonebook'/Bytes(3))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.34</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_OCI(CyclicEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f81', sfid=0x15, name='EF.OCI', rec_len={27,47},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Outgoing Call Information'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('alpha_id'/Bytes(this._.total_len-27),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'len_of_bcd_contents'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'ton_npi'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'call_number'/BcdAdapter(Bytes(10)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'cap_cfg2_record_id'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'ext5_record_id'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'date_and_time'/BcdAdapter(Bytes(7)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'duration'/Int24ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'link_to_phonebook'/Bytes(3))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.35</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_ICT(CyclicEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f82', sfid=None, name='EF.ICT', rec_len={3,3},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Incoming Call Timer'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('accumulated_call_timer'/Int24ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.38</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_CCP2(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f4f', sfid=0x16, name='EF.CCP2', desc='Capability Configuration Parameters 2'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len={15,None})</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.48</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_ACL(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f57', sfid=None, name='EF.ACL', size={32,None},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Access Point Name Control List'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('num_of_apns'/Int8ub, 'tlvs'/GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.51</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_START_HFN(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f5b', sfid=0x0f, name='EF.START-HFN', size={6,6},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Initialisation values for Hyperframe number'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('start_cs'/Int24ub, 'start_ps'/Int24ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.52</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_THRESHOLD(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f5c', sfid=0x10, name='EF.THRESHOLD', size={3,3},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Maximum value of START'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('max_start'/Int24ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.77</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_VGCSCA(TransRecEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fd4', sfid=None, name='EF.VGCSCA', size={2,100}, rec_len=2,</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Voice Group Call Service Ciphering Algorithm'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('alg_v_ki_1'/Int8ub, 'alg_v_ki_2'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.79</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_GBABP(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fd6', sfid=None, name='EF.GBABP', size={3,50},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='GBA Bootstrapping parameters'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('rand'/LV, 'b_tid'/LV, 'key_lifetime'/LV)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.80</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_MSK(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fd7', sfid=None, name='EF.MSK', desc='MBMS Service Key List'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len={20,None})</span><br><span style="color: hsl(120, 100%, 40%);">+        msk_ts_constr = Struct('msk_id'/Int32ub, 'timestamp_counter'/Int32ub)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('key_domain_id'/Bytes(3),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'num_msk_id'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'msk_ids'/msk_ts_constr[this.num_msk_id])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.85</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_EHPLMNPI(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fdb', sfid=None, name='EF.EHPLMNPI', size={1,1},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Equivalent HPLMN Presentation Indication'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('presentation_ind'/</span><br><span style="color: hsl(120, 100%, 40%);">+                                 Enum(Byte, no_preference=0, display_highest_prio_only=1, display_all=2))</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.91</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_EPSLOCI(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fe3', sfid=0x1e, name='EF.EPSLOCI', size={18,18},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='EPS Location Information'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        upd_status_constr = Enum(Byte, updated=0, not_updated=1, roaming_not_allowed=2)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('guti'/Bytes(12), 'last_visited_registered_tai'/Bytes(5),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'eps_update_status'/upd_status_constr)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.96</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_PWS(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fec', sfid=None, name='EF.PWS', desc='Public Warning System', size={1,1}):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        pws_config = FlagsEnum(Byte, ignore_pws_in_hplmn_and_equivalent=1, ignore_pws_in_vplmn=2)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('pws_configuration'/pws_config)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.101</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_IPS(CyclicEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6ff1', sfid=None, name='EF.IPS', rec_len={4,4},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='IMEI(SV) Pairing Status'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('status'/PaddedString(2, 'ascii'),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'link_to_ef_ipd'/Int8ub, 'rfu'/Byte)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+######################################################################</span><br><span style="color: hsl(120, 100%, 40%);">+# DF.5GS</span><br><span style="color: hsl(120, 100%, 40%);">+######################################################################</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.4.11.2</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_5GS3GPPLOCI(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='4f01', sfid=0x01, name='EF.5GS3GPPLOCI', size={20,20},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='5S 3GP location information'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        upd_status_constr = Enum(Byte, updated=0, not_updated=1, roaming_not_allowed=2)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('5g_guti'/Bytes(13), 'last_visited_registered_tai_in_5gs'/Bytes(6),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 '5gs_update_status'/upd_status_constr)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.4.11.7</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_UAC_AIC(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='4f06', sfid=0x06, name='EF.UAC_AIC', size={4,4},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='UAC Access Identities Configuration'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg_constr = FlagsEnum(Byte, multimedia_priority_service=1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     mission_critical_service=2)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('uac_access_id_config'/cfg_constr)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.4.11.10</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_OPL5G(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f08', sfid=0x08, name='EF.OPL5G', desc='5GS Operator PLMN List'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len={10,None})</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('tai'/Bytes(9), 'pnn_record_id'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> class DF_USIM_5GS(CardDF):</span><br><span>     def __init__(self, fid='5FC0', name='DF.5GS', desc='5GS related files'):</span><br><span>         super().__init__(fid=fid, name=name, desc=desc)</span><br><span>         files = [</span><br><span>           # I'm looking at 31.102 R15.9</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('4F01', None, 'EF.5GS3GPPLOCI', '5GS 3GPP location information', size={20,20}),</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('4F02', None, 'EF.5GSN3GPPLOCI', '5GS non-3GPP location information', size={20,20}),</span><br><span style="color: hsl(0, 100%, 40%);">-          #LinFixedEF('4F03', None, 'EF.5GS3GPPNSC', '5GS 3GPP Access NAS Security Context'),</span><br><span style="color: hsl(0, 100%, 40%);">-          #LinFixedEF('4F04', None, 'EF.5GSN3GPPNSC', '5GS non-3GPP Access NAS Security Context'),</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('4F05', None, 'EF.5GAUTHKEYS', '5G authentication keys', size={68, None}),</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('4F06', None, 'EF.UAC_AIC', 'UAC Access Identities Configuration', size={4, 4}),</span><br><span style="color: hsl(0, 100%, 40%);">-          EF_SUCI_Calc_Info(), #TransparentEF('4F07', None, 'EF.SUCI_Calc_Info', 'SUCI Calculation Information', size={2, None}),</span><br><span style="color: hsl(0, 100%, 40%);">-          LinFixedEF('4F08', None, 'EF.OPL5G', '5GS Operator PLMN List', rec_len={10, None}),</span><br><span style="color: hsl(0, 100%, 40%);">-          # TransparentEF('4F09', None, 'EF.NSI', 'Network Specific Identifier'), # FFS</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('4F0A', None, 'EF.Routing_Indicator', 'Routing Indicator', size={4,4}),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_5GS3GPPLOCI(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_5GS3GPPLOCI('4f02', 0x02, 'EF.5GSN3GPPLOCI', '5GS non-3GPP location information'),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('4F03', 0x03, 'EF.5GS3GPPNSC', '5GS 3GPP Access NAS Security Context', rec_len={57,None}),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('4F04', 0x04, 'EF.5GSN3GPPNSC', '5GS non-3GPP Access NAS Security Context', rec_len={57,None}),</span><br><span style="color: hsl(120, 100%, 40%);">+          TransparentEF('4F05', 0x05, 'EF.5GAUTHKEYS', '5G authentication keys', size={68, None}),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_UAC_AIC(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_SUCI_Calc_Info(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_OPL5G(),</span><br><span style="color: hsl(120, 100%, 40%);">+          TransparentEF('4F09', 0x09, 'EF.NSI', 'Network Specific Identifier'),</span><br><span style="color: hsl(120, 100%, 40%);">+          TransparentEF('4F0A', 0x0a, 'EF.Routing_Indicator', 'Routing Indicator', size={4,4}),</span><br><span>         ]</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         self.add_files(files)</span><br><span> </span><br><span> class ADF_USIM(CardADF):</span><br><span>@@ -498,7 +662,7 @@</span><br><span>           EF_xPLMNwAcT('6f60', 0x0a, 'EF.PLMNwAcT',</span><br><span>                        'User controlled PLMN Selector with Access Technology'),</span><br><span>           TransparentEF('6f31', 0x12, 'EF.HPPLMN', 'Higher Priority PLMN search period'),</span><br><span style="color: hsl(0, 100%, 40%);">-          # EF.ACMmax</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ACMmax(),</span><br><span>           EF_UST(),</span><br><span>           CyclicEF('6f39', None, 'EF.ACM', 'Accumulated call meter', rec_len={3,3}),</span><br><span>           TransparentEF('6f3e', None, 'EF.GID1', 'Group Identifier Level 1'),</span><br><span>@@ -508,11 +672,92 @@</span><br><span>           EF_CBMI(),</span><br><span>           EF_ACC(sfid=0x06),</span><br><span>           EF_PLMNsel('6f7b', 0x0d, 'EF.FPLMN', 'Forbidden PLMNs', size={12,None}),</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('6f7e', 0x0b, 'EF.LOCI', 'Locationn information', size={11,11}),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_LOCI(),</span><br><span>           EF_AD(sfid=0x03),</span><br><span>           EF_CBMID(sfid=0x0e),</span><br><span>           EF_ECC(),</span><br><span>           EF_CBMIR(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_PSLOCI(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ADN('6f3b', None, 'EF.FDN', 'Fixed Dialling Numbers'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_SMS('6f3c', None),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MSISDN(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_SMSP(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_SMSS(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ADN('6f49', None, 'EF.SDN', 'Service Dialling Numbers'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6f4b', None, 'EF.EXT2', 'Extension2 (FDN)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6f4c', None, 'EF.EXT3', 'Extension2 (SDN)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_SMSR(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ICI(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_OCI(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ICT(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ICT('6f83', None, 'EF.OCT', 'Outgoing Call Timer'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6f4e', None, 'EF.EXT5', 'Extension5 (ICI/OCI/MSISDN)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_CCP2(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_eMLPP(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_AAeM(),</span><br><span style="color: hsl(120, 100%, 40%);">+          # EF_Hiddenkey</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ADN('6f4d', None, 'EF.BDN', 'Barred Dialling Numbers'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6f55', None, 'EF.EXT4', 'Extension4 (BDN/SSC)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_CMI(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_UST('6f56', 0x05, 'EF.EST', 'Enabled Services Table', size={1,None}),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ACL(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_DCK(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_CNL(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_START_HFN(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_THRESHOLD(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_xPLMNwAcT('6f61', 0x11, 'EF.OPLMNwAcT',</span><br><span style="color: hsl(120, 100%, 40%);">+                       'User controlled PLMN Selector with Access Technology'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ARR('6f06', 0x17),</span><br><span style="color: hsl(120, 100%, 40%);">+          TransparentEF('6fc4', None, 'EF.NETPAR', 'Network Parameters'),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('6fc5', 0x19, 'EF.PNN', 'PLMN Network Name'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_OPL(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ADN('6fc7', None, 'EF.MBDN', 'Mailbox Dialling Numbers'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MBI(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MWIS(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ADN('6fcb', None, 'EF.CFIS', 'Call Forwarding Indication Status'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6fcc', None, 'EF.EXT7', 'Extension7 (CFIS)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          TransparentEF('6fcd', None, 'EF.SPDI', 'Service Provider Display Information'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MMSN(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6fcf', None, 'EF.EXT8', 'Extension8 (MMSN)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MMSICP(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MMSUP(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MMSUCP(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_NIA(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_VGCS(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_VGCSS(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_VGCS('6fb3', None, 'EF.VBS', 'Voice Broadcast Service'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_VGCSS('6fb4', None, 'EF.VBSS', 'Voice Broadcast Service Status'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_VGCSCA(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_VGCSCA('6fd5', None, 'EF.VBCSCA', 'Voice Broadcast Service Ciphering Algorithm'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_GBABP(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MSK(),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('6fd8', None, 'EF.MUK', 'MBMS User Key'),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('6fda', None, 'EF.GBANL', 'GBA NFA List'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_PLMNsel('6fd9', 0x1d, 'EF.EHPLMN', 'Equivalent HPLMN', size={12,None}),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EHPLMNPI(),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('6fdd', None, 'EF.NAFKCA', 'NAF Key Centre Address'),</span><br><span style="color: hsl(120, 100%, 40%);">+          TransparentEF('6fde', None, 'EF.SPNI', 'Service Provider Name Icon'),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('6fdf', None, 'EF.PNNI', 'PLMN Network Name Icon'),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('6fe2', None, 'EF.NCP-IP', 'Network Connectivity Parameters for USIM IP connections'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EPSLOCI('6fe3', 0x1e, 'EF.EPSLOCI', 'EPS location information'),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('6fe4', 0x18, 'EF.EPSNSC', 'EPS NAS Security Context', rec_len={54,128}),</span><br><span style="color: hsl(120, 100%, 40%);">+          TransparentEF('6fe6', None, 'EF.UFC', 'USAT Facility Control', size={1,16}),</span><br><span style="color: hsl(120, 100%, 40%);">+          TransparentEF('6fe8', None, 'EF.NASCONFIG', 'Non Access Stratum Configuration'),</span><br><span style="color: hsl(120, 100%, 40%);">+          # UICC IARI (only in cards that have no ISIM)</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_PWS(),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('6fed', None, 'EF.FDNURI', 'Fixed Dialling Numbers URI'),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('6fee', None, 'EF.BDNURI', 'Barred Dialling Numbers URI'),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('6fef', None, 'EF.SDNURI', 'Service Dialling Numbers URI'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_IPS(),</span><br><span style="color: hsl(120, 100%, 40%);">+          # FIXME: from EF_ePDGid onwards</span><br><span style="color: hsl(120, 100%, 40%);">+          # FIXME: DF_SoLSA</span><br><span style="color: hsl(120, 100%, 40%);">+          # FIXME: DF_PHONEBOOK</span><br><span style="color: hsl(120, 100%, 40%);">+          # FIXME: DF_GSM_ACCESS</span><br><span style="color: hsl(120, 100%, 40%);">+          # FIXME: DF_WLAN</span><br><span style="color: hsl(120, 100%, 40%);">+          # FIXME: DF_HNB</span><br><span style="color: hsl(120, 100%, 40%);">+          # FIXME: DF_ProSe</span><br><span style="color: hsl(120, 100%, 40%);">+          # FIXME: DF_ACDC</span><br><span style="color: hsl(120, 100%, 40%);">+          # FIXME: DF_TV</span><br><span>           DF_USIM_5GS(),</span><br><span>           ]</span><br><span>         self.add_files(files)</span><br><span>diff --git a/pySim/ts_51_011.py b/pySim/ts_51_011.py</span><br><span>index bd71114..5795faf 100644</span><br><span>--- a/pySim/ts_51_011.py</span><br><span>+++ b/pySim/ts_51_011.py</span><br><span>@@ -332,6 +332,9 @@</span><br><span> </span><br><span> from pySim.utils import *</span><br><span> from struct import pack, unpack</span><br><span style="color: hsl(120, 100%, 40%);">+from construct import *</span><br><span style="color: hsl(120, 100%, 40%);">+from construct import Optional as COptional</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.construct import HexAdapter, BcdAdapter</span><br><span> </span><br><span> from pySim.filesystem import *</span><br><span> import pySim.ts_102_221</span><br><span>@@ -395,6 +398,35 @@</span><br><span>     def __init__(self, fid='6f42', sfid=None, name='EF.SMSP', desc='Short message service parameters'):</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len={28, None})</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.5.7</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_SMSS(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class MemCapAdapter(Adapter):</span><br><span style="color: hsl(120, 100%, 40%);">+        def _decode(self, obj, context, path):</span><br><span style="color: hsl(120, 100%, 40%);">+            return False if obj & 1 else True</span><br><span style="color: hsl(120, 100%, 40%);">+        def _encode(self, obj, context, path):</span><br><span style="color: hsl(120, 100%, 40%);">+            return 0 if obj else 1</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f43', sfid=None, name='EF.SMSS', desc='SMS status', size={2,8}):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('last_used_tpmr'/Int8ub, 'memory_capacity_exceeded'/self.MemCapAdapter(Int8ub))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.5.8</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_SMSR(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f47', sfid=None, name='EF.SMSR', desc='SMS status reports', rec_len={30,30}):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('sms_record_id'/Int8ub, 'sms_status_report'/HexAdapter(Bytes(29)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_EXT(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid, sfid=None, name='EF.EXT', desc='Extension', rec_len={13,13}):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('record_type'/Int8ub, 'extension_data'/HexAdapter(Bytes(11)), 'identifier'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.5.16</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_CMI(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f58', sfid=None, name='EF.CMI', rec_len={2,21},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Comparison Method Informatoin'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('alpha_id'/Bytes(this._.total_len-1), 'comparison_method_id'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> class DF_TELECOM(CardDF):</span><br><span>     def __init__(self, fid='7f10', name='DF.TELECOM', desc=None):</span><br><span>         super().__init__(fid=fid, name=name, desc=desc)</span><br><span>@@ -406,10 +438,15 @@</span><br><span>           LinFixedEF(fid='6f4f', name='EF.ECCP', desc='Extended Capability Configuration Parameters', rec_len={15,32}),</span><br><span>           EF_MSISDN(),</span><br><span>           EF_SMSP(),</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF(fid='6f43', name='EF.SMSS', desc='SMS status', size={2,8}),</span><br><span style="color: hsl(0, 100%, 40%);">-          # LND, SDN, EXT1, EXT2, EXT3, BDN, EXT4</span><br><span style="color: hsl(0, 100%, 40%);">-          LinFixedEF(fid='6f47', name='EF.SMSR', desc='SMS status reports', rec_len={30,30}),</span><br><span style="color: hsl(0, 100%, 40%);">-          # CMI</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_SMSS(),</span><br><span style="color: hsl(120, 100%, 40%);">+          # LND, SDN</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6f4a', None, 'EF.EXT1', 'Extension1 (ADN/SSC)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6f4b', None, 'EF.EXT2', 'Extension2 (FDN/SSC)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6f4c', None, 'EF.EXT3', 'Extension3 (SDN)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ADN(fid='6f4d', name='EF.BDN', desc='Barred Dialling Numbers'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6f4e', None, 'EF.EXT4', 'Extension4 (BDN/SSC)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_SMSR(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_CMI(),</span><br><span>           ]</span><br><span>         self.add_files(files)</span><br><span> </span><br><span>@@ -455,6 +492,13 @@</span><br><span>         else:</span><br><span>             return enc_plmn(in_json['mcc'], in_json['mnc'])</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.6</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_ACMmax(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f37', sfid=None, name='EF.ACMmax', size={3,3},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='ACM maximum value'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('acm_max'/Int24ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # TS 51.011 Section 10.3.7</span><br><span> class EF_ServiceTable(TransparentEF):</span><br><span>     def __init__(self, fid, sfid, name, desc, size, table):</span><br><span>@@ -499,6 +543,14 @@</span><br><span>     def _encode_bin(self, abstract):</span><br><span>         return pack('!H', abstract['acc'])</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.16</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_LOCI(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f7e', sfid=None, name='EF.LOCI', desc='Location Information', size={11,11}):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('tmsi'/Bytes(4), 'lai'/Bytes(5), 'tmsi_time'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'lu_status'/Enum(Byte, updated=0, not_updated=1, plmn_not_allowed=2,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  location_area_not_allowed=3))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # TS 51.011 Section 10.3.18</span><br><span> class EF_AD(TransparentEF):</span><br><span>     OP_MODE = {</span><br><span>@@ -526,7 +578,37 @@</span><br><span>             res += pack('!B', abstract['len_of_mnc_in_imsi'])</span><br><span>         return res</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# TS 51.011 Section 10.3.13</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.20 / 10.3.22</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_VGCS(TransRecEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fb1', sfid=None, name='EF.VGCS', size={4,200}, rec_len=4,</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Voice Group Call Service'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = BcdAdapter(Bytes(4))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.21 / 10.3.23</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_VGCSS(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fb2', sfid=None, name='EF.VGCSS', size={7,7},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Voice Group Call Service Status'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = BitStruct('flags'/Bit[50], Padding(6, pattern=b'\xff'))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.24</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_eMLPP(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fb5', sfid=None, name='EF.eMLPP', size={2,2},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='enhanced Multi Level Pre-emption and Priority'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        FlagsConstruct = FlagsEnum(Byte, A=1, B=2, zero=4, one=8, two=16, three=32, four=64)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('levels'/FlagsConstruct, 'fast_call_setup_cond'/FlagsConstruct)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.25</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_AAeM(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fb6', sfid=None, name='EF.AAeM', size={1,1},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Automatic Answer for eMLPP Service'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        FlagsConstruct = FlagsEnum(Byte, A=1, B=2, zero=4, one=8, two=16, three=32, four=64)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('auto_answer_prio_levels'/FlagsConstruct)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.26</span><br><span> class EF_CBMID(EF_CBMI):</span><br><span>     def __init__(self, fid='6f48', sfid=None, name='EF.CBMID', size={2,None}, rec_len=2,</span><br><span>                  desc='Cell Broadcast Message Identifier for Data Download'):</span><br><span>@@ -544,6 +626,52 @@</span><br><span>                  desc='Cell Broadcast message identifier range selection'):</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.29</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_DCK(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f2c', sfid=None, name='EF.DCK', size={16,16},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Depersonalisation Control Keys'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('network'/BcdAdapter(Bytes(4)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'network_subset'/BcdAdapter(Bytes(4)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'service_provider'/BcdAdapter(Bytes(4)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'corporate'/BcdAdapter(Bytes(4)))</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.30</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_CNL(TransRecEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f32', sfid=None, name='EF.CNL', size={6,None}, rec_len=6,</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Co-operative Network List'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+    def _decode_record_hex(self, in_hex):</span><br><span style="color: hsl(120, 100%, 40%);">+        (in_plmn, sub, svp, corp) = unpack('!3sBBB', h2b(in_hex))</span><br><span style="color: hsl(120, 100%, 40%);">+        res = dec_plmn(b2h(in_plmn))</span><br><span style="color: hsl(120, 100%, 40%);">+        res['network_subset'] = sub</span><br><span style="color: hsl(120, 100%, 40%);">+        res['service_provider_id'] = svp</span><br><span style="color: hsl(120, 100%, 40%);">+        res['corporate_id'] = corp</span><br><span style="color: hsl(120, 100%, 40%);">+        return res</span><br><span style="color: hsl(120, 100%, 40%);">+    def _encode_record_hex(self, in_json):</span><br><span style="color: hsl(120, 100%, 40%);">+        plmn = enc_plmn(in_json['mcc'], in_json['mnc'])</span><br><span style="color: hsl(120, 100%, 40%);">+        return b2h(pack('!3sBBB', h2b(plmn), res['network_subset'], res['service_provider_id'],</span><br><span style="color: hsl(120, 100%, 40%);">+                        res['corporate_id']))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.31</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_NIA(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f51', sfid=None, name='EF.NIA', rec_len={1,32},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Network\'s Indication of Alerting'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('alerting_category'/Int8ub, 'category'/GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.32</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_Kc(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f20', sfid=None, name='EF.Kc', desc='Ciphering key Kc', size={9,9}):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('kc'/HexAdapter(Bytes(8)), 'cksn'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.33</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_LOCIGPRS(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f53', sfid=None, name='EF.LOCIGPRS', desc='GPRS Location Information', size={14,14}):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('ptmsi'/Bytes(4), 'ptmsi_sig'/Int8ub, 'rai'/Bytes(6),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'rau_status'/Enum(Byte, updated=0, not_updated=1, plmn_not_allowed=2,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   routing_area_not_allowed=3))</span><br><span> </span><br><span> # TS 51.011 Section 10.3.35..37</span><br><span> class EF_xPLMNwAcT(TransRecEF):</span><br><span>@@ -589,6 +717,68 @@</span><br><span>             u16 |= 0x0088</span><br><span>         return '%04X'%(u16)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.38</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_CPBCCH(TransRecEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f63', sfid=None, name='EF.CPBCCH', size={2,14}, rec_len=2,</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='CPBCCH Information'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('cpbcch'/Int16ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.39</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_InvScan(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f64', sfid=None, name='EF.InvScan', size={1,1},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='IOnvestigation Scan'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = FlagsEnum(Byte, in_limited_service_mode=1, after_successful_plmn_selection=2)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.42</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_OPL(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fc6', sfid=None, name='EF.OPL', rec_len={8,8}, desc='Operator PLMN List'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('lai'/Bytes(5), 'pnn_record_id'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.44 + TS 31.102 4.2.62</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_MBI(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fc9', sfid=None, name='EF.MBI', rec_len={4,5}, desc='Mailbox Identifier'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('mbi_voicemail'/Int8ub, 'mbi_fax'/Int8ub, 'mbi_email'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'mbi_other'/Int8ub, 'mbi_videocall'/COptional(Int8ub))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.45 + TS 31.102 4.2.63</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_MWIS(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fca', sfid=None, name='EF.MWIS', rec_len={5,6},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Message Waiting Indication Status'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('mwi_status'/FlagsEnum(Byte, voicemail=1, fax=2, email=4, other=8, videomail=16),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'num_waiting_voicemail'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'num_waiting_fax'/Int8ub, 'num_waiting_email'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'num_waiting_other'/Int8ub, 'num_waiting_videomail'/COptional(Int8ub))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.51</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_MMSN(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fce', sfid=None, name='EF.MMSN', rec_len={4,20}, desc='MMS Notification'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('mms_status'/Bytes(2), 'mms_implementation'/Bytes(1),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'mms_notification'/Bytes(this._.total_len-4), 'ext_record_nr'/Byte)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.53</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_MMSICP(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fd0', sfid=None, name='EF.MMSICP', size={1,None},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='MMS Issuer Connectivity Parameters'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.54</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_MMSUP(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fd1', sfid=None, name='EF.MMSUP', rec_len={1,None},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='MMS User Preferences'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.55</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_MMSUCP(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fd2', sfid=None, name='EF.MMSUCP', size={1,None},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='MMS User Connectivity Parameters'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> class DF_GSM(CardDF):</span><br><span>     def __init__(self, fid='7f20', name='DF.GSM', desc='GSM Network related files'):</span><br><span>@@ -596,12 +786,12 @@</span><br><span>         files = [</span><br><span>           EF_LP(),</span><br><span>           EF_IMSI(),</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('5f20', None, 'EF.Kc', 'Ciphering key Kc'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_Kc(),</span><br><span>           EF_PLMNsel(),</span><br><span>           TransparentEF('6f31', None, 'EF.HPPLMN', 'Higher Priority PLMN search period'),</span><br><span style="color: hsl(0, 100%, 40%);">-          # ACMmax</span><br><span style="color: hsl(0, 100%, 40%);">-          EF_ServiceTable('6f37', None, 'EF.SST', 'SIM service table', table=EF_SST_map, size={2,16}),</span><br><span style="color: hsl(0, 100%, 40%);">-          CyclicEF('6f39', None, 'EF.ACM', 'Accumulated call meter', rec_len={4,3}),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ACMmax(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ServiceTable('6f38', None, 'EF.SST', 'SIM service table', table=EF_SST_map, size={2,16}),</span><br><span style="color: hsl(120, 100%, 40%);">+          CyclicEF('6f39', None, 'EF.ACM', 'Accumulated call meter', rec_len={3,3}),</span><br><span>           TransparentEF('6f3e', None, 'EF.GID1', 'Group Identifier Level 1'),</span><br><span>           TransparentEF('6f3f', None, 'EF.GID2', 'Group Identifier Level 2'),</span><br><span>           EF_SPN(),</span><br><span>@@ -610,21 +800,45 @@</span><br><span>           TransparentEF('6f7f', None, 'EF.BCCH', 'Broadcast control channels', size={16,16}),</span><br><span>           EF_ACC(),</span><br><span>           EF_PLMNsel('6f7b', None, 'EF.FPLMN', 'Forbidden PLMNs', size={12,12}),</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('6f7e', None, 'EF.LOCI', 'Locationn information', size={11,11}),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_LOCI(),</span><br><span>           EF_AD(),</span><br><span>           TransparentEF('6fa3', None, 'EF.Phase', 'Phase identification', size={1,1}),</span><br><span style="color: hsl(0, 100%, 40%);">-        # TODO EF.VGCS VGCSS, VBS, VBSS, eMLPP, AAeM</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_VGCS(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_VGCSS(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_VGCS('6fb3', None, 'EF.VBS', 'Voice Broadcast Service'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_VGCSS('6fb4', None, 'EF.VBSS', 'Voice Broadcast Service Status'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_eMLPP(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_AAeM(),</span><br><span>           EF_CBMID(),</span><br><span>           EF_ECC(),</span><br><span>           EF_CBMIR(),</span><br><span style="color: hsl(0, 100%, 40%);">-          # DCK, CNL, NIA, KcGRS, LOCIGPRS, SUME</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_DCK(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_CNL(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_NIA(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_Kc('6f52', None, 'EF.KcGPRS', 'GPRS Ciphering key KcGPRS'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_LOCIGPRS(),</span><br><span style="color: hsl(120, 100%, 40%);">+          TransparentEF('6f54', None, 'EF.SUME', 'SetUpMenu Elements'),</span><br><span>           EF_xPLMNwAcT('6f60', None, 'EF.PLMNwAcT',</span><br><span>                                    'User controlled PLMN Selector with Access Technology'),</span><br><span>           EF_xPLMNwAcT('6f61', None, 'EF.OPLMNwAcT',</span><br><span>                                    'Operator controlled PLMN Selector with Access Technology'),</span><br><span>           EF_xPLMNwAcT('6f62', None, 'EF.HPLMNwAcT', 'HPLMN Selector with Access Technology'),</span><br><span style="color: hsl(0, 100%, 40%);">-          # CPBCCH, InvScan, PNN, OPL, MBDN, MBI, MWIS, CFIS, EXT5, EXT6, EXT7, SPDI, MMSN, EXT8</span><br><span style="color: hsl(0, 100%, 40%);">-          # MMSICP, MMSUP, MMSUCP</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_CPBCCH(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_InvScan(),</span><br><span style="color: hsl(120, 100%, 40%);">+          LinFixedEF('6fc5', None,'EF.PNN', 'PLMN Network Name'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_OPL(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ADN('6fc7', None, 'EF.MBDN', 'Mailbox Dialling Numbers'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MBI(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MWIS(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ADN('6fcb', None, 'EF.CFIS', 'Call Forwarding Indication Status'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6fc8', None, 'EF.EXT6', 'Externsion6 (MBDN)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6fcc', None, 'EF.EXT7', 'Externsion7 (CFIS)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          TransparentEF('6fcd', None, 'EF.SPDI', 'Service Provider Display Information'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MMSN(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EXT('6fcf', None, 'EF.EXT8', 'Extension8 (MMSN)'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MMSICP(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MMSUP(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MMSUCP(),</span><br><span>           ]</span><br><span>         self.add_files(files)</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/23711">change 23711</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/pysim/+/23711"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: pysim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I91475df4a5eaca423473aaebba8c69c54c9a0c1a </div>
<div style="display:none"> Gerrit-Change-Number: 23711 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>